首页 > 解决方案 > 在 thread::sleep_for() 之后代码运行速度明显变慢

问题描述

我注意到如果我在执行前使用 std::thread_sleep_for ,我计算机上的代码运行速度会明显变慢。我写了一个小的 google benchmark 来演示,只是一些简单的 for 循环,执行了 1 亿次。

BENCHMARK CODE WITHOUT SLEEP_FOR:

int test(int iterations) {
  int a;
  for (int i = 0; i < iterations; i++) {
    a = i * 200 + 100;
  }
  return a;
}

void runBenchmark(benchmark::State &state) {
  for (auto _ : state) {
    test(100000000);
  }
}

BENCHMARK RESULTS WITHOUT SLEEP_FOR:
                                Time            CPU               Iterations
../1/process_time               145 ms          145 ms            1
../1/process_time               144 ms          144 ms            1
../1/process_time               144 ms          144 ms            1
../1/process_time               144 ms          144 ms            1
../1/process_time               144 ms          144 ms            1
../1/process_time               144 ms          144 ms            1
../1/process_time               144 ms          144 ms            1
../1/process_time               145 ms          145 ms            1
../1/process_time               144 ms          144 ms            1
../1/process_time               144 ms          144 ms            1
../1/process_time_mean          144 ms          144 ms           10
../1/process_time_median        144 ms          144 ms           10
../1/process_time_stddev      0.419 ms        0.417 ms           10
../1/process_time_min           144 ms          144 ms           10

第二次我让线程在执行循环之前休眠 100 毫秒。结果当然是挂墙时间增加了 100 毫秒。但除此之外CPU时间也增加了大约30ms:

CODE WITH SLEEP_FOR:

int test(int iterations) {
  int a;
  for (int i = 0; i < iterations; i++) {
    a = i * 200 + 100;
  }
  return a;
}

void runBenchmark(benchmark::State &state) {
  for (auto _ : state) {
    std::this_thread::sleep_for(100ms);
    test(100000000);
  }
}

BENCHMARK RESULTS WITH SLEEP_FOR:
                                Time            CPU               Iterations
../1/process_time               275 ms          175 ms            1
../1/process_time               273 ms          173 ms            1
../1/process_time               272 ms          172 ms            1
../1/process_time               276 ms          176 ms            1
../1/process_time               274 ms          173 ms            1
../1/process_time               271 ms          171 ms            1
../1/process_time               271 ms          171 ms            1
../1/process_time               273 ms          173 ms            1
../1/process_time               276 ms          176 ms            1
../1/process_time               274 ms          173 ms            1
../1/process_time_mean          274 ms          173 ms           10
../1/process_time_median        274 ms          173 ms           10
../1/process_time_stddev       1.75 ms         1.75 ms           10
../1/process_time_min           275 ms          175 ms           10

对此有何解释?当我第一次在另一个程序中遇到这种行为时,我正在处理我期待某种调度问题。但是由于基准测试明确指出,CPU 时间本身增加了,我真的不知道发生了什么。

运行代码的 CPU 型号是 Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz。

编辑:这是我原始程序的附加图像。它显示了 3 个神经网络的执行情况。Sleep_for 仅在运行第一个网络之前执行。它表明,相比之下,特别是第一个网络的第一层运行得非常慢。

执行跟踪

编辑:代码已在 ubuntu-18.04 机器上使用 llvm-8 和 -O2 优化标志编译

亲切的问候 lpolari

标签: c++linuxcpu-usagecpu-architecturecpu-cache

解决方案


推荐阅读