c++ - 在 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