我看到了很多关于这方面的话题,甚至在stackoverflow上也是如此,例如:
如何在Linux/Windows上测量CPU时间和挂钟时间?
我想同时测量cpu和墙壁时间。虽然在我发布的主题中回答一个问题的人建议使用
另一个问题是关于cpu时间的。我发现
下面是我的代码:
#include <time.h>
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
#include <stdlib.h>
int main()
{
int i;
double sum;
// measure elapsed wall time
struct timespec now, tmstart;
clock_gettime(CLOCK_REALTIME, &tmstart);
for(i=0; i<1024; i++){
sum += log((double)i);
}
clock_gettime(CLOCK_REALTIME, &now);
double seconds = (double)((now.tv_sec+now.tv_nsec*1e-9) - (double)(tmstart.tv_sec+tmstart.tv_nsec*1e-9));
printf("wall time %fs\n", seconds);
// measure cpu time
double start = (double)clock() /(double) CLOCKS_PER_SEC;
for(i=0; i<1024; i++){
sum += log((double)i);
}
double end = (double)clock() / (double) CLOCKS_PER_SEC;
printf("cpu time %fs\n", end - start);
return 0;
}
这样编译:
gcc测试。C-O测试-LRT-LM
它告诉我:
wall time 0.000424s
cpu time 0.000000s
我知道我可以进行更多的迭代,但这不是这里的重点)
重要事项:
printf("CLOCKS_PER_SEC is %ld\n", CLOCKS_PER_SEC);
演出
CLOCKS_PER_SEC is 1000000
根据我的
POSIX要求CLOCKS_PER_SEC等于1000000,与实际分辨率无关。
当增加我的计算机上的迭代次数时,测得的cpu-time开始显示在100000次迭代上。从返回的数字看来,分辨率实际上是10毫秒。
注意,当您优化代码时,整个循环可能会消失,因为
让我详细介绍一下代码性能的微观度量。度量性能的天真而诱人的方法确实是像您所做的那样添加
如果您使用分析,正如已经有人提到的,您可以得到一个相当好的性能评估,即使是优化的代码,尽管总的时间当然增加了。
另一种衡量性能的好方法是要求编译器报告某些代码将花费的周期数。对于许多体系结构,编译器对此有非常精确的估计。然而,最值得注意的是,对于Pentium架构来说,它并不是这样,因为硬件需要进行大量的调度,这是很难预测的。
虽然这不是一个长期的实践,但我认为编译器应该支持标记要度量的函数的