17

Cclock()函数只返回一个零。我尝试使用不同的类型,但没有任何改进......这是一种高精度测量时间的好方法吗?

#include <time.h>
#include <stdio.h>

int main()
{
    clock_t start, end;
    double cpu_time_used;

    char s[32];

    start = clock();

    printf("\nSleeping 3 seconds...\n\n");
    sleep(3);

    end = clock();

    cpu_time_used = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);

    printf("start = %.20f\nend   = %.20f\n", start, end);
    printf("delta = %.20f\n", ((double) (end - start)));
    printf("cpu_time_used  = %.15f\n", cpu_time_used);
    printf("CLOCKS_PER_SEC = %i\n\n", CLOCKS_PER_SEC);

    return 0;
}
Sleeping 3 seconds...

start = 0.00000000000000000000
end   = 0.00000000000000000000
delta = 0.00000000000000000000
cpu_time_used  = 0.000000000000000
CLOCKS_PER_SEC = 1000000

平台:英特尔 32 位、RedHat Linux、gcc 3.4.6

4

6 回答 6

26

clock()报告使用的 CPU 时间。 sleep()不使用任何 CPU 时间。所以你的结果可能是完全正确的,只是不是你想要的。

于 2010-01-25T17:58:36.900 回答
6

man clock. 它不会返回您认为的内容。另外man gettimeofday- 这更有可能是你想要的。

于 2010-01-25T17:57:54.697 回答
4

clock_t 是整数类型。你不能用 %f 打印出来。有关差异为 0 的原因,请参见Fred 的回答。

于 2010-01-25T17:57:32.377 回答
4
 printf("start = %.20f\nend   = %.20f\n", start, end);

应该:

 printf("start = %d\nend   = %d\n", start, end);
于 2010-01-25T17:58:00.087 回答
4

调用sleep()不会占用任何 CPU 时间。不过,您应该看到一点不同。我在此行中更正了您的 printf 类型不匹配错误:

printf("start = %.20f\nend   = %.20f\n", start, end);

它在我的机器上给出了合理的结果:

start = 1419
end   = 1485
delta = 66
cpu_time_used  = 0.000066000000000
CLOCKS_PER_SEC = 1000000

您可能会尝试gettimeofday()获取运行程序所花费的实时时间。

于 2010-01-25T18:00:40.763 回答
2

你可能需要

double get_wall_time(){ struct timeval time; if (gettimeofday(&time,NULL)){ return 0; } return (double)time.tv_sec + (double)time.tv_usec * .000001; } 和使用类似

double wall0 = get_wall_time(); double cpu0 = get_cpu_time(); for(long int i = 0; i<=10000000;i++){ func1(); } double wall1 = get_wall_time(); double cpu1 = get_cpu_time(); cout << "Wall Time = " << wall1 - wall0 << endl; cout << "CPU Time = " << cpu1 - cpu0 << endl;

代替 clock()

仅作为时钟,并且仅根据性能计数器计算在 CPU 中花费的时间。但是您可以使用上述功能获得结果。只是为了验证您的应用程序使用 time 命令运行它

time ./a.out

时间命令的输出:

real 0m5.987s user 0m0.674s sys 0m0.134s

和自定义函数的输出 Wall Time = 5.98505 CPU Time = 0.8

于 2014-11-26T11:37:03.690 回答