c语言计算程序运行时间
结构体 struct timeval tp
struct timeval tp
是定义在<sys/time.h>
头文件中的结构体,它包含两个成员:
time_t tv_sec
:表示自 UNIX 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数。
suseconds_t tv_usec
:表示微秒数(1 秒 = 1,000,000 微秒)
获取当前时间:
gettimeofday(&tp, NULL);
gettimeofday
:是一个 POSIX
函数,用于获取当前的时间,精确到微秒。它将结果存储在tp
结构体中。
第一个参数 &tp
:指向 timeval
结构体的指针,用来存储当前时间信息。
第二个参数 NULL
:是一个时区信息的指针参数。这里传 NULL 表示不使用时区信息(在现代的用法中,时区信息通常被忽略,且该参数被废弃)。
gettimeofday
会将当前的秒数存储在 tp.tv_sec
中,微秒数存储在 tp.tv_usec
中。
计算并且返回时间
return ((double)tp.tv_sec + (double)tp.tv_usec * 1.e-6);
这一行代码返回自 UNIX 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的时间值(以秒为单位)。它将秒和微秒的值相加,最终返回一个 double 类型的浮点数:
(double)tp.tv_sec
:将秒数tv_sec
转换为双精度浮点数。
(double)tp.tv_usec * 1.e-6
:将微秒数tv_usec
转换为双精度浮点数,然后乘以 1.e-6(即 1 / 1,000,000),从而将微秒转换为秒。
加法:将秒数和微秒对应的秒值相加,得到从 1970 年以来的总秒数(精确到小数部分)。
代码用途
这个函数通常用于测量某段代码的执行时间。可以通过两次调用 GetCPUSecond 来计算代码段执行的时间差。例如:
double start = GetCPUSecond();
// 某段需要测量执行时间的代码
double end = GetCPUSecond();
printf("Execution time: %f seconds\n", end - start);
通过减去两次获取的时间,就可以得到这段代码的执行时间(单位为秒),并且精确到微秒级别。