我正在运行一个用C++编写的程序,其中CPU使用率是一个重要因素,一直在努力降低它,直到我遇到了一个意外的异常。该程序使用std::cout
语句来查看性能,在删除该语句后,Windows资源监视器中程序的CPU使用情况会在4-6秒间隔的1秒内急剧上升。
如果保留std::cout
语句,程序将平稳地以0-2%的CPU使用率运行,没有任何波动。而删除std::cout
语句后,程序以0-2%的CPU使用率运行,但4-6秒间隔的CPU使用情况会在Windows资源监视器中高达25%。
有趣的是,增加输出字符串的大小会减少CPU峰值的高度,而减小字符串的大小则会增加CPU峰值的高度。
这是相关的代码:
float engineCompletionTime = engineTimer->getEngineCompletionTime();
/* Stops CPU from spiking */
std::cout << "Engine cycle took " << engineCompletionTime << " milliseconds." << std::endl;
if (engineCompletionTime < 14.0f) {
std::this_thread::sleep_for(std::chrono::milliseconds((int)(14.0f - engineCompletionTime)));
}
编辑:非常感谢您的初步回应,但需要明确的是:
当std::cout代码行在程序中时,CPU不会出现峰值。
当std::cout代码行不在程序中时,CPU会出现峰值。
随着由std::cout打印的字符串大小增加,CPU峰值的大小会减少。
std::cout
是一种 I/O 操作,因此需要硬件中断以通知完成,因此相对需要更长的时间。我认为这就是你所说的峰值。实际上,它并不占用 CPU 周期,但会阻塞 CPU 并等待 I/O 操作完成。 - Ali Tavakolstd::endl
更改为'\n'
。使用endl
会刷新缓冲区,如果在循环中频繁使用,可能会导致I/O成为瓶颈。 - Jonathon K