【问题标题】:why is empty while loop using more cpu?为什么空的while循环使用更多的cpu?
【发布时间】:2013-08-05 09:27:29
【问题描述】:

我有两个程序应该做同样的事情,但略有不同。两者都有无限的游戏循环,除非用户以某种方式停止游戏,否则它们会永远运行。其中一个程序的游戏循环被实现并渲染了一些东西,另一个游戏循环是空的并且什么也不做(只是听用户停止)。

当我打开任务管理器查看资源使用情况时,我发现带有空循环的程序使用了 14% 的 CPU,而实际绘制到屏幕上的程序使用了大约 1-2%。

我对这个问题的猜测如下:

我比较了这两个程序的代码并寻找差异,但差异并不大。然后我想到,渲染到屏幕的循环可能会受到其他因素的约束(比如向屏幕发送像素,刷新率?)所以在 CPU 完成它的事情之后,它会让那个线程进入睡眠状态,直到其他事情完成。但是由于其他程序几乎什么都不做,而且什么都不做真的很容易,CPU 永远不会让那个线程进入睡眠状态,而是继续运行。我缺乏知识来确认这是否是原因,所以我问你。这是发生这种情况的原因吗? (额外问题)如果是这样,为什么 CPU 会停止在 14% 左右,而不是一直到 100%?

谢谢。

【问题讨论】:

  • 也许空循环没有延迟间隔,而这与绘图有什么关系?

标签: c++ cpu


【解决方案1】:

不看代码很难确定,但是画到屏幕上,必然会涉及到一些IO等待;多少取决于许多因素,包括同步 + 缓冲选项。

至于 14% 的 cpu 使用率 - 我猜你的机器有 8 个处理单元(核心或核心 * 超线程)并且你的代码是单线程的 - 即它正在最大化一个处理单元。

【讨论】:

  • 100 / 8 == 12.5。我认为 14% 是巧合,是程序“闲置”
  • Windows(自任务管理器参考以来,我一直假设 Windows)在正确计算这些计算方面非常糟糕。此外,这里可能使用了某种形式的包装层(SDL、directx 等);这可能在单独的实例上正确产生和运行,这很容易占额外的百分比。
  • 可能你是对的。尽管 12.5% 的程序和 1.5% 的系统空闲是有一定道理的,但要考虑的未知因素太多,无法给出明确的答案
  • 我认为你对 8 个处理单元部分是正确的。另一方面,我在空循环中调用了Sleep(150),CPU 使用率下降到 0.1-1%。所以现在,我更相信这是因为渲染循环在 IO 或其他一些操作时休眠,而空的则没有。当然,我的电脑总是有可能试图教给我人生的一课“有时什么都不做比做某事更花钱”:) 谢谢您的宝贵时间。
  • 另外请记住,API 引用并不能告诉您调用的全部内容。 “渲染”将导致进行各种调用,正如您在此处了解的那样,其中一些是您几乎无法控制的各种形式的休眠/等待。
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2022-12-12
  • 2019-07-06
  • 2017-06-16
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2021-04-02
相关资源
最近更新 更多