【发布时间】:2010-01-11 06:22:18
【问题描述】:
clock() 是否可以用作可靠的 API 来测量 CPU 执行 sn-p 代码所花费的时间?验证使用时间()/时钟()时,两者似乎都不能精确测量 CPU 时间。
首先,API 的clock()/times() 是否可以用于测量函数/sn-p 代码的执行时间,如下例所示?有没有更好更可靠的选择?该机制适用于 Linux、HP-UX、IBM-AIX 和 Sun Solaris,因为我们需要在所有这些平台上测量(&& 比较)一段代码的性能。
请推荐。另外,如果遗漏任何琐碎的事情,请告诉我。
bbb@m_001:/tmp/kk1$ ./perf_clock 102400
{clock(): S 0 E 0 D 0.0000000000}
bbb@m_001:/tmp/kk1$ ./perf_clock 204800
{clock(): S 0 E 10000 D 0.0100000000}
bbb@m_001:/tmp/kk1$ cat perf_clock.c
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
void test_clock(char* sbuf, int* len){
clock_t start, end; int i=0;
start = clock();
while(i++ < 500) memset((char*)sbuf,0,*len);
end = clock();
printf("{clock(): S %10lu E %10lu D %15.10f}\n",
start,end,(end-start)/(double) CLOCKS_PER_SEC);
}
int main(int argc,char* argv[])
{
int len=atoi(argv[1]);
char *sbuf=(char*)malloc(len);
test_clock(sbuf,&len);
free(sbuf); return 0;
}
结果似乎说,对 memset() 一个 100 KB 的块,500 次,没有花费时间。还是说不能以微秒为单位测量?
实际上,它不是 memset() 而是另一个函数[准备一个大小约为 1MB 的巨大结构,分配此结构的副本,Oracle DB 选择并使用来自 DB 的数据填充这些结构]措施。即使这显示为 0 滴答声,这也是让我感到困惑的原因。
谢谢!
【问题讨论】:
-
谷歌搜索“c profiler”,这是您正在寻找的工具的名称..
-
对于小块,您的编译器可能会优化相同缓冲区的重复清除,并且只清除一次。
标签: c unix performance