在虚拟机

时间:2017-04-08 15:19:59

标签: c linux time virtual-machine

我在安装在Windows上的虚拟机(Linux Ubuntu)内编码。 根据{{​​3}},Linux上的库中的CLOCKS_PER_SEC值应始终为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;
}

第一个值应该是1 000 000,但是,应该显示秒数的值不会以正常速度增加(增加1到4到5秒之间)
这是因为我在虚拟机上工作吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

这是预期的。

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

因此,如果您拨打clock(),然后sleep(5),然后再次致电clock(),您就会发现clock()几乎没有增加。即使sleep(5)等待5个实时秒,它也不会消耗任何CPU,CPU使用率是clock()测量的值。

如果您想测量挂钟时间,您需要clock_gettime()(或旧版本gettimeofday())。如果您想了解公民时间(例如"它的下午3:36")或CLOCK_REALTIME,如果您想要测量时间间隔,可以使用CLOCK_MONOTONIC。在这种情况下,您可能需要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));
    }
}

反对使用busy-loops的常规禁令适用于此。