2017-04-08 120 views
0

我在安装在窗口上的虚拟机(Linux Ubuntu)中编写代码。 据this page,在Linux上的库CLOCKS_PER_SEC值应始终为1 000 000
当我运行这段代码:虚拟机中CLOCKS_PER_SEC值“错误”

int main() 
{ 
    printf("%d\n", CLOCKS_PER_SEC); 
    while (1) 
     printf("%f, %f \n\n", (double)clock(), (double)clock()/CLOCKS_PER_SEC); 
    return 0; 
} 

第一个值是1 000 000所应当的,但是,应显示秒数的值不会以正常速度增加(需要4到5秒才能增加1)
这是否是由于我在虚拟机上工作?我该如何解决这个问题?

+1

你不能使用'clock'自己返回的值,它没有任何意义。您必须使用两个呼叫之间的差异。 –

+1

'clock'返回'clock_t'。这不一定是'%f'需要的'double'。 – Olaf

+0

@Someprogrammerdude这是一个旨在测试的代码。我看单位数字以及它随着时间的推移如何变化 – Speedphoenix

回答

3

这是预期的。

clock()函数不会返回挂钟时间(墙上显示真实时钟的时间)。它返回程序使用的CPU时间量。如果你的程序没有消耗所有可能的调度程序片,那么如果你的程序在多个内核上使用片,同时它可以更快地增加,那么它将增长得慢于片上时间。

所以,如果你clock(),然后sleep(5),然后再打电话clock(),你会发现,clock()几乎没有在所有增加。即使sleep(5)等待5秒钟,它也不消耗任何CPU,并且CPU使用率是clock()测量的值。

如果你想测量挂钟时间,你会想要clock_gettime()(或旧版本gettimeofday())。如果您想要知道公民时间(例如“它是3:36 PM”)或CLOCK_MONOTONIC,则可以使用CLOCK_REALTIME如果要测量时间间隔。在这种情况下,您可能需要CLOCK_MONOTONIC

#include <stdio.h> 
#include <time.h> 
int main() { 
    struct timespec start, now; 
    clock_gettime(CLOCK_MONOTONIC, &start); 
    while (1) { 
     clock_gettime(CLOCK_MONOTONIC, &now); 
     printf("Elapsed: %f\n", 
       (now.tv_sec - start.tv_sec) + 
       1e-9 * (now.tv_nsec - start.tv_nsec)); 
    } 
} 

反对使用繁忙循环的通常禁止适用于此处。