我有这样的事情:
clock_t start, end;
start=clock();
something_else();
end=clock();
printf("\nClock cycles are: %d - %d\n",start,end);
Run Code Online (Sandbox Code Playgroud)
我总是得到一个输出"时钟周期是:0 - 0"
知道为什么会这样吗?
(只是为了给出一些细节,something_else()函数使用montgomery表示执行从左到右的求幂,而且我不确定something_else()函数确实需要一些不可忽略的时间.)
这是在Linux上.uname -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
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时间戳计数器寄存器的时钟计数rdtsc
.
我想原因是你something_else()
消耗的时间太少,超过了精度clock()
.我试着打电话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;
}
Run Code Online (Sandbox Code Playgroud)
我的电脑上的结果是:
start = 0, end = 27700000
Run Code Online (Sandbox Code Playgroud)
另外,两个提示:
something_else()
的耗时很长,但编译器可能会忽略这些操作(尤其是循环),因为它认为它们毫无意义.sizeof(clock_t)
在您的平台上使用以查看大小clock_t
.嗯,你想要时间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;
}
Run Code Online (Sandbox Code Playgroud)