【问题标题】:Simple <Time.h> program takes large amount CPU简单的 <Time.h> 程序占用大量 CPU
【发布时间】:2016-05-17 13:04:51
【问题描述】:

我试图通过在 VS 中编写一些简单的东西来熟悉 C time.h 库。下面的代码只是每两秒打印一次添加到自身的 x 的值:

int main() {
    time_t start = time(NULL);
    time_t clock = time(NULL);
    time_t clockTemp = time(NULL); //temporary clock

    int x = 1;

    //program will continue for a minute (60 sec)
    while (clock <= start + 58) {
        clockTemp = time(NULL);
        if (clockTemp >= clock + 2) { //if 2 seconds has passed
            clock = clockTemp;
            x = ADD(x);
            printf("%d at %d\n", x, timeDiff(start, clock));
        }
    }
}

int timeDiff(int start, int at) {
    return at - start;
}

我关心的是这个程序占用的 CPU 量,大约 22%。我认为这个问题源于clockTemp 的不断更新(就在while 语句的下方),但我不确定如何解决这个问题。这可能是视觉工作室的问题,还是有特殊的方法来检查时间?

解决方案

代码需要 sleep 函数,这样它就不需要经常运行。 我用#include &lt;windows.h&gt; 添加了睡眠并将Sleep (2000) //2 second sleep 放在while 的末尾

while (clock <= start + 58) { ... Sleep(2000); }

【问题讨论】:

  • 看起来你在 4 核机器上旋转等待。 (或 2 + HT)
  • 为什么您认为 CPU 密集型循环会使用少于一个内核?我假设你有 4 个?
  • 在 2 秒内,我只需 Sleep(2000) 它,如果需要更高的准确性,可能会进行间隔校正。这将消除您的 CPU 消耗。
  • while 不是声明,而是声明
  • 您不会在循环中休眠,因此代码会不断且尽可能快地执行。完全符合预期。

标签: c visual-studio time time.h


【解决方案1】:

问题不在于您检查当前时间的方式。问题是没有什么可以限制循环运行的频率。您的程序继续尽可能快地执行语句,并占用大量处理器时间。 (在没有其他程序的情况下,在单线程 CPU 上,它将使用 100% 的处理器时间。)

您需要在循环中添加一个“睡眠”方法,这将向处理器指示它可以在短时间内停止处理您的程序。有很多方法可以做到这一点; this question 有一些例子。

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2011-11-17
    • 2022-10-20
    • 1970-01-01
    相关资源
    最近更新 更多