首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clock()返回0

clock()返回0
EN

Stack Overflow用户
提问于 2015-03-04 00:27:22
回答 2查看 5K关注 0票数 3

当我在下面运行我的代码时,我得到了一个值0,有几次我确实得到了intAddition的值。我尝试了很多我在网上找到的建议,但还没有成功。我的同学教我他是怎么做的,这和我的非常相似。他从他的程序中得到1到3的小值。

谢谢你的帮助!

代码语言:javascript
复制
#include <iostream>
#include <time.h>
#include <stdio.h>

clock_t start, end;

void intAddition(int a, int b){
    start = clock();
    a + b;
    end = clock();  
    printf("CPU cycles to execute integer addition operation: %d\n", end-start);
}

void intMult(int a, int b){
    start = clock();
    a * b;
    end = clock();
    printf("CPU cycles to execute integer multiplication operation: %d\n", end-start);
}

void floatAddition(float a, float b){
    start = clock();
    a + b;
    end = clock();
    printf("CPU cycles to execute float addition operation: %d\n", end-start);
}

void floatMult(float a, float b){
    start = clock();
    a * b;
    end = clock();
    printf("CPU cycles to execute float multiplication operation: %d\n", end-start);
}

int main()
{
    int a,b;
    float c,d;

    a = 3, b = 6;
    c = 3.7534, d = 6.85464;

    intAddition(a,b);
    intMult(a,b);
    floatAddition(c,d);
    floatMult(c,d);

    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-04 16:58:54

clock()返回的值为clock_t类型(实现定义的算术类型)。它表示“自实现定义的时代开始以来程序使用的处理器时间的最佳近似”(N1570 7.27.2.1)。

给定一个clock_t值,您可以通过将它乘以CLOCKS_PER_SEC来确定它所代表的秒数,这是在<time.h>中定义的一个实现宏。POSIX要求CLOCKS_PER_SEC为100万,但在不同的系统上可能有不同的值。

特别要注意的是,CLOCKS_PER_SEC的值不一定与clock()函数的实际精度相对应。

根据实现的不同,两个对clock()的连续调用可能返回相同的值,如果占用的CPU时间少于clock()函数的精度。在我测试的一个系统上,clock()函数的分辨率是0.01秒;在那个时候,CPU可以执行很多指令。

下面是一个测试程序:

代码语言:javascript
复制
#include <stdio.h>
#include <time.h>
#include <limits.h>
int main(void) {
    long count = 0;
    clock_t c0 = clock(), c1;
    while ((c1 = clock()) == c0) {
        count ++;
    }
    printf("c0 = %ld, c1 = %ld, count = %ld\n",
           (long)c0, (long)c1, count);
    printf("clock_t is a %d-bit ", (int)sizeof (clock_t) * CHAR_BIT);
    if ((clock_t)-1 > (clock_t)0) {
        puts("unsigned integer type");
    }
    else if ((clock_t)1 / 2 == 0) {
        puts("signed integer type");
    }
    else {
        puts("floating-point type");
    }
    printf("CLOCKS_PER_SEC = %ld\n", (long)CLOCKS_PER_SEC);
    return 0;
}

在一个系统(Linux x86_64)上,输出是:

代码语言:javascript
复制
c0 = 831, c1 = 833, count = 0
clock_t is a 64-bit signed integer type
CLOCKS_PER_SEC = 1000000

显然,在该系统上,clock()函数的实际分辨率是一两微秒,对clock()的两个连续调用返回不同的值。

在另一个系统(Solaris SPARC)上,输出是:

代码语言:javascript
复制
c0 = 0, c1 = 10000, count = 10447
clock_t is a 32-bit signed integer type
CLOCKS_PER_SEC = 1000000

在该系统上,clock()函数的分辨率为0.01秒(10,000微秒),clock()返回的值在几千次迭代中没有变化。

(至少)还有一件事值得留心。在clock_t为32位的系统上,使用CLOCKS_PER_SEC == 1000000,这个值可以在大约72分钟的CPU时间之后进行封装,这对于长期运行的程序来说可能是非常重要的。有关详细信息,请参阅系统文档。

票数 6
EN

Stack Overflow用户

发布于 2015-03-04 06:18:46

在一些编译器上,clock()以毫秒为单位测量时间。此外,对于简单的测试来说,编译器太聪明了,它可能跳过所有的操作,因为这些操作的结果没有被使用。

例如,这个循环可能需要小于1毫秒(除非调试器打开或优化关闭)

代码语言:javascript
复制
int R = 1;
int a = 2;
int b = 3;
start = clock();
for( int i = 0; i < 10000000; i++ ) 
    R = a * b;
printf( "time passed: %ld\n", clock() - start );

R总是相同的数字(6),而R甚至没有被使用。编译器可以跳过所有的计算。你必须在结尾打印R,或者做一些其他的事情来欺骗编译器来配合测试。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28844613

复制
相关文章

相似问题

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