C 是时钟的“U/U秒值”;“错误”;在虚拟机内部

C 是时钟的“U/U秒值”;“错误”;在虚拟机内部,c,linux,time,virtual-machine,C,Linux,Time,Virtual Machine,我在安装在windows上的虚拟机(Linux Ubuntu)中编写代码。 根据,Linux上库中的时钟每秒值应始终为1 000 000。 当我运行此代码时: int main() { printf("%d\n", CLOCKS_PER_SEC); while (1) printf("%f, %f \n\n", (double)clock(), (double)clock()/CLOCKS_PER_SEC); return 0; } 第一个值应为10000

我在安装在windows上的虚拟机(Linux Ubuntu)中编写代码。 根据,Linux上库中的时钟每秒值应始终为1 000 000。
当我运行此代码时:

int main()
{
    printf("%d\n", CLOCKS_PER_SEC);
    while (1)
       printf("%f, %f \n\n", (double)clock(), (double)clock()/CLOCKS_PER_SEC);
    return 0;
}
第一个值应为1000000,但是,应显示秒数的值不会以正常速度增加(增加1需要4到5秒)
这是因为我在虚拟机上工作吗?我如何解决这个问题?

这是意料之中的事

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

因此,如果你调用
clock()
,然后调用
sleep(5)
,然后再次调用
clock()
,你会发现
clock()
几乎没有增加。即使
sleep(5)
等待5秒,它也不会消耗任何CPU,CPU使用率是
clock()
衡量的

如果你想测量墙上的时钟时间,你需要
clock\u gettime()
(或者旧版本的
gettimeofday()
)。如果您想知道民用时间(例如“现在是下午3:36”),可以使用
CLOCK\u REALTIME
,如果您想测量时间间隔,可以使用
CLOCK\u monotic
。在这种情况下,您可能希望
时钟是单调的

#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));
    }
}
#包括
#包括
int main(){
结构timespec开始,现在;
时钟获取时间(时钟单调和开始);
而(1){
时钟获得时间(时钟单调,&现在);
printf(“已用时间:%f\n”,
(now.tv_sec-start.tv_sec)+
1e-9*(now.tv_nsec-start.tv_nsec));
}
}
通常禁止使用忙循环的规定在这里适用。

这是意料之中的

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

因此,如果你调用
clock()
,然后调用
sleep(5)
,然后再次调用
clock()
,你会发现
clock()
几乎没有增加。即使
sleep(5)
等待5秒,它也不会消耗任何CPU,CPU使用率是
clock()
衡量的

如果你想测量墙上的时钟时间,你需要
clock\u gettime()
(或者旧版本的
gettimeofday()
)。如果您想知道民用时间(例如“现在是下午3:36”),可以使用
CLOCK\u REALTIME
,如果您想测量时间间隔,可以使用
CLOCK\u monotic
。在这种情况下,您可能希望
时钟是单调的

#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));
    }
}
#包括
#包括
int main(){
结构timespec开始,现在;
时钟获取时间(时钟单调和开始);
而(1){
时钟获得时间(时钟单调,&现在);
printf(“已用时间:%f\n”,
(now.tv_sec-start.tv_sec)+
1e-9*(now.tv_nsec-start.tv_nsec));
}
}

通常禁止使用忙循环的规定在这里适用。

您不能单独使用
时钟返回的值,它没有任何意义。您必须在两次调用之间使用差异。
clock
返回
clock\t
。这不一定是双精度的
%f
所需的。@Someprogrammerdude这是一个用于测试的代码。我看一下单位数字以及它是如何随时间变化的。你不能单独使用
clock
返回的值,它没有任何意义。您必须在两次调用之间使用差异。
clock
返回
clock\t
。这不一定是双精度的
%f
所需的。@Someprogrammerdude这是一个用于测试的代码。我看一下单位数字以及它是如何随时间变化的