为什么C clock()返回0

edd*_* ed 9 c linux clock

我有这样的事情:

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

oua*_*uah 7

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.

  • 你说的时间戳计数器听起来很有趣。你能指出一个好的阅读来源吗?非常感谢 (2认同)

Jin*_*Shi 6

我想原因是something_else()消耗的时间太少,超过了精度clock().我试着打电话clock()因而两次,都startend是零,但结果是合理的,当我做之间的一些费时的东西.

这是我的测试代码片段:

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)

另外,两个提示:

  1. 测试时,不要使用任何编译器优化.您可能认为您something_else()的耗时很长,但编译器可能会忽略这些操作(尤其是循环),因为它认为它们毫无意义.
  2. sizeof(clock_t)在您的平台上使用以查看大小clock_t.

  • -1为*不优化*(不,我实际上没有downvote).如果你想阻止函数调用优化,只需使用函数返回值,例如在程序结束时打印出来. (2认同)

Enr*_*cos 5

嗯,你想要时间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)

  • 我认为您无法便携地测量时钟周期。我认为 C 或 POSIX 标准中没有任何相关内容。 (2认同)