我在安装在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秒之间)
这是因为我在虚拟机上工作吗?我该如何解决这个问题?
答案 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的常规禁令适用于此。