use*_*264 8 c time clock system-clock
我有一些代码试图确定代码块的执行时间.
#include <time.h>
#include <stdio.h>
int main()
{
clock_t start_t, end_t, total_t;
int i;
start_t = clock(); //clock start
printf("Starting of the program, start_t = %ld\n", start_t);
printf("Going to scan a big loop, start_t = %ld\n", start_t);
for(i=0; i< 10000000; i++) //trying to determine execution time of this block
{
}
end_t = clock(); //clock stopped
printf("End of the big loop, end_t = %ld\n", end_t);
total_t = (long int)(end_t - start_t);
printf("Total time taken by CPU: %lu\n", total_t );
return(0);
}
Run Code Online (Sandbox Code Playgroud)
我机器上的代码段输出是
Starting of the program, start_t = 8965
Going to scan a big loop, start_t = 8965
End of the big loop, end_t = 27259
Total time taken by CPU: 18294
Run Code Online (Sandbox Code Playgroud)
因此,如果我的CPU以21 MHz运行并且假设这是唯一执行的操作,则每个机器周期大约等于47纳秒(18294*47)= 859818纳秒.
这是我代码中for循环的执行时间吗?我在这里做了一些不正确的假设.
clock函数使用的时间单位是任意的.在大多数平台上,它与处理器速度无关.它通常与外部定时器中断的频率相关 - 可以在软件中配置 - 或者与通过多年处理器发展保持兼容性的历史值相关.您需要使用宏CLOCKS_PER_SEC转换为实时.
printf("Total time taken by CPU: %fs\n", (double)total_t / CLOCKS_PER_SEC);
Run Code Online (Sandbox Code Playgroud)
C标准库旨在可在各种硬件上实现,包括没有内部定时器并依赖外部外设来分辨时间的处理器.许多平台都有更精确的方法来测量挂钟时间,而不是time更精确的方法来测量CPU消耗clock.例如,在POSIX系统(例如Linux和其他类Unix系统)上,您可以使用getrusage,具有微秒精度.
struct timeval start, end;
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
start = usage.ru_utime;
…
getrusage(RUSAGE_SELF, &usage);
end = usage.ru_utime;
printf("Total time taken by CPU: %fs\n", (double)(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1e-6);
Run Code Online (Sandbox Code Playgroud)
如果可用,clock_gettime(CLOCK_THREAD_CPUTIME_ID)或者clock_gettime(CLOCK_PROCESS_CPUTIME_ID)可以提供更好的精度.它具有纳秒精度.
请注意精度和准确度之间的差异:精度是报告值的单位.准确度是报告值与实际值的接近程度.除非您正在使用实时系统,否则无法确保一段代码需要多长时间,包括调用测量函数本身.
某些处理器具有周期是数个处理器周期,而不是挂钟时间的时钟,但是这会非常系统专用.
无论何时进行基准测试,请注意您所测量的是在这些特定情况下在此特定CPU上执行此特定可执行文件,并且结果可能会或可能不会推广到其他情况.例如,除非您关闭优化,否则大多数编译器都会优化您的问题中的空循环.测量未经优化的代码的速度通常是没有意义的.即使您在循环中添加实际工作,也要注意玩具基准测试:它们通常不具有与现实世界代码相同的性能特征.在PC和智能手机等现代高端CPU上,CPU密集型代码的基准测试通常对缓存效果非常敏感,结果可能取决于系统上运行的其他内容,确切的CPU模型(由于不同缓存大小和布局),代码恰好被加载的地址等.