发布
社区首页 >问答首页 >为什么C clock()返回0

为什么C clock()返回0
EN

Stack Overflow用户
提问于 2012-03-26 19:13:35
回答 7查看 39K关注 0票数 11

我得到了类似这样的东西:

代码语言:javascript
代码运行次数:0
复制
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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-26 20:06:04

clock函数不测量CPU时钟周期。

C说,clock“将实现的最佳近似返回到程序自实现定义时代开始以来所使用的处理器时间,而实现定义的时代只与程序调用有关。”

如果在两次连续的clock调用之间,您的程序花费的时间少于clock函数的一个单位,那么您可能会得到0

POSIX clockCLOCKS_PER_SEC的单位定义为1000000 (单位则为1微秒)。

http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html

要测量x86/x64中的时钟周期,可以使用内联汇编来检索CPU Time Stamp计数器寄存器rdtsc的时钟计数。

票数 10
EN

Stack Overflow用户

发布于 2012-03-26 20:29:14

我猜原因是你的something_else() clock(). 消耗的时间非常少,超过了 the的精度。因此,我尝试了两次调用clock()startend都是零,但是当我在两者之间做一些耗时的事情时,结果是合理的。

下面是我的测试代码片段:

代码语言:javascript
代码运行次数:0
复制
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;
}

在我电脑上的结果是:

代码语言:javascript
代码运行次数:0
复制
start = 0, end = 27700000

另外,还有两个提示:

  1. 测试时,不使用任何编译器优化。您可能认为something_else()很耗时,但编译器可能会忽略这些操作(特别是循环),因为它会将这些操作视为您平台上的meaningless.
  2. Use sizeof(clock_t),以查看clock_t.

的大小

票数 9
EN

Stack Overflow用户

发布于 2012-03-26 19:25:38

好吧,你想要something_else()花的时间吗?试试这个:

代码语言:javascript
代码运行次数:0
复制
#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;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9871071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档