时间差可以用来衡量程序运行效率,计算其有三种方法,一是使用 difftime() 函数,二是使用自定义的 TimeInMillisecond() 函数,三是使用 clock() 函数。
1. 使用 difftime() 函数计算秒级时间差
三种方法本质相同,都是利用执行程序前的时间和程序执行后的时间进行时间差的计算。需要注意的是,difftime() 函数传入的参数为 time_t 类型,这意味着时间精度是秒级。最终程序运行结果为 times: 0.000000,说明程序运行速度过快,秒级精度无法获取真实的程序运行时间。
#include <stdio.h>
#include <time.h>
void DoHardWork(){
int sum = 0;
for (int i = 0; i < 100000000; ++i) {
sum += i*i / 3;
}
}
void TestDifftime(){
time_t start_time = time(NULL);
DoHardWork();
time_t end_time = time(NULL);
double times = difftime(start_time, end_time);
printf("times: %lf", times); // times: 0.000000
}
2. 使用 TimeInMillisecond() 函数计算毫秒级时间差
若要计算毫秒级精度的时间差,time_t 时间类型需要放弃使用。使用自定义的 TimeInMillsecond() 函数获取毫秒级时间戳,而后相减,便可得到毫秒级时间差。此时程序结果为 197ms。
void TestTimeInMillisecond(){
long_time_t start_time = TimeInMillisecond();
DoHardWork();
long_time_t end_time = TimeInMillisecond();
printf("times: %lld\n", end_time - start_time); // times: 197
}
3. 使用 clock() 函数计算程序消耗的处理器时间
clock() 函数的返回类型是 clock_t,其不是以真实世界的时间为单位,而是以时钟为单位。每一秒,CPU 会分配 CLOCKS_PER_SEC 个时钟给程序。利用程序执行前后的时钟数量,可以计算出程序的运行时间。
void TestClock(){
clock_t start_clock = clock();
DoHardWork();
clock_t end_clock = clock();
// 这里的差值是时钟数量,需要转换为秒数
// CLOCKS_PER_SEC: 每一秒有多少个时钟
double times = (end_clock - start_clock) * 1.0 / CLOCKS_PER_SEC;
printf("times: %lf", times); // times: 0.224000s
}
程序最终运行结果为 times: 0.224000s。可以发现,与 TimeInMillisecond() 函数的执行结果相比,clock() 函数计算出的时间更长些。原因如下图所示: