我得到了类似这样的东西:
clock_t start, end;
start=clock();
something_else();
end=clock();
printf("\nClock cycles are: %d - %d\n",start,end);
我总是得到“时钟周期是:0- 0”的输出。
知道为什么会这样吗?
(仅提供少量细节,something_else()函数使用蒙哥马利表示执行从左到右的求幂,而且我不确定something_else()函数是否确实需要一些不可忽略的时间。)
这是在Linux上。取消命名-a的结果为:
Linux snowy.*****.ac.uk 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
发布于 2012-03-26 12:06:04
clock
函数不测量CPU时钟周期。
C说,clock
“将实现的最佳近似返回到程序自实现定义时代开始以来所使用的处理器时间,而实现定义的时代只与程序调用有关。”
如果在两次连续的clock
调用之间,您的程序花费的时间少于clock
函数的一个单位,那么您可能会得到0
。
POSIX clock
将CLOCKS_PER_SEC
的单位定义为1000000 (单位则为1微秒)。
http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
要测量x86/x64中的时钟周期,可以使用内联汇编来检索CPU Time Stamp计数器寄存器rdtsc
的时钟计数。
发布于 2012-03-26 12:29:14
我猜原因是你的something_else()
clock()
. 消耗的时间非常少,超过了 the的精度。因此,我尝试了两次调用clock()
,start
和end
都是零,但是当我在两者之间做一些耗时的事情时,结果是合理的。
下面是我的测试代码片段:
int main(void) {
clock_t start, end;
start = clock();
int c;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < (1<<30); j++) {
c++;
}
}
end = clock();
printf("start = %d, end = %d\n", start, end);
return 0;
}
在我电脑上的结果是:
start = 0, end = 27700000
另外,还有两个提示:
something_else()
很耗时,但编译器可能会忽略这些操作(特别是循环),因为它会将这些操作视为您平台上的meaningless.sizeof(clock_t)
,以查看clock_t
.的大小
发布于 2012-03-26 11:25:38
好吧,你想要something_else()
花的时间吗?试试这个:
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
struct timeval start, end;
long mtime, secs, usecs;
gettimeofday(&start, NULL);
something_else();
gettimeofday(&end, NULL);
secs = end.tv_sec - start.tv_sec;
usecs = end.tv_usec - start.tv_usec;
mtime = ((secs) * 1000 + usecs/1000.0) + 0.5;
printf("Elapsed time: %ld millisecs\n", mtime);
return 0;
}
https://stackoverflow.com/questions/9871071
复制相似问题