gpt4 book ai didi

c - 虚拟机内部的CLOCKS_PER_SEC值是 "wrong"

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:13 28 4
gpt4 key购买 nike

我在安装在 Windows 上的虚拟机 (Linux Ubuntu) 中编写代码。根据this page , 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 秒)
这是因为我在虚拟机上工作吗?我该如何解决这个问题?

最佳答案

这是预期的。

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));
}
}

通常禁止使用忙循环的禁令适用于此。

关于c - 虚拟机内部的CLOCKS_PER_SEC值是 "wrong",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43295845/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com