【问题标题】:Decreasing (Worsening) performance in C++ codeC++ 代码中的性能下降(恶化)
【发布时间】:2021-06-09 07:45:54
【问题描述】:

我需要在我的代码中添加一些人工延迟,而不使用std::this_thread::sleep_for() 来测试某些硬件。事实上,我需要一个类似的函数:

addLatency(10m) // Do dummy computation for 10 milli second

我知道一种可能的解决方案是进行如下虚拟计算:

long int j=0;
for (long int = 0; i < MAX_SIZE < i++)
    j++;

但是,有没有更简单或合乎逻辑的方法来做到这一点? 我搜索了很多,可以找到很多提高性能的解决方案,但我找不到任何使性能最差的方法。

【问题讨论】:

  • 你为什么不想使用sleep_for
  • 您想在这 10 毫秒内使用 100% 的处理器功率还是使用 0%?对于后者,您需要某种睡眠或等待功能。
  • 我不能让进程进入睡眠状态,我必须使用处理能力。
  • 如果你的编译器开启了优化,你的循环将被完全优化掉。
  • 显而易见的方法是while (steady_clock::now() &lt; target_time) {}

标签: c++ algorithm performance


【解决方案1】:

这个循环本身是不可靠的,没有任何效果:

long int j=0;
for (long int = 0; i < MAX_SIZE < i++)
    j++;

除非您之后使用j 的值,否则编译器可能会完全删除循环。如果您想让 CPU 忙碌一段时间,您需要测量经过的时间(复制粘贴并从 here 修改):

void addLatency(long ms) {
    std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
    auto duration_ms = [&](){
        std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
        return std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count();
    };
    while( duration_ms() < ms) {}
}

【讨论】:

  • 嗯,如果不允许睡眠功能,我们认为读时钟是吗?
  • @YvesDaoust 轮询时钟不是免费的,而睡眠线程不一定做任何事情。 OP 只关心保持 CPU 忙碌
  • 这不是我的意思。是否允许
  • 为什么不直接声明一个全局的volatile 变量并让busy-loop递增呢?
  • @YvesDaoust OP:“我不能让进程进入睡眠状态,我必须使用处理能力。”所以我认为是的。
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多