我正在运行一个用C++编写的程序,其中CPU使用率是一个重要因素,并一直在努力减少它,直到我遇到一个意外的异常。该程序使用std::cout行来查看性能,当我删除它时,程序的CPU使用率在Windows Resource Monitor中每隔4-6秒就会出现大约1秒的峰值。
有了std::cout线路,它可以在0-2%的CPU使用率下顺利运行,没有任何尖峰。删除std::cout行,它以0-2%的CPU使用率运行,在Windows Resource Monitor中,4-6秒的CPU使用率峰值高达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峰值的大小减小。
发布于 2019-05-09 12:37:04
根据实现方式的不同,写入std::cout基本上涉及将控制权移交给操作系统一小段时间,然后操作系统将数据发送到终端。这不是windows上最快的进程,在此期间程序基本上是空闲的。std::cout需要处理的数据越多,延迟所需的时间就越长,因此程序空闲的时间就越多。
如果程序花费大量时间等待输入(来自另一个程序、来自键盘或鼠标、来自“重画屏幕”信号(如果它具有GUI )、来自操作系统或来自文件系统),则该程序的CPU使用率较低。基本上,CPU使用率表示程序没有等待的那部分时间。
如果程序的唯一任务是处理大量传入数据,而没有延迟,那么它根本就不应该等待,如果CPU使用率很高也没问题。另一方面,如果您有一个等待用户输入的程序(比如交互式应用程序),那么高CPU使用率可能会有问题,因为这意味着程序正在做大量工作,即使用户什么也没做。
让程序更有效率通常会解决这个问题。
CPU使用率高的其他原因
如果你在一个紧密的循环中检查一些事情发生,而不是使用事件处理,这将导致高CPU使用率,因为即使程序正在等待一些东西,它也会主动地检查它。这是每三分钟检查一次门上的包裹,和只是等待门铃响起之间的区别。如果你每三分钟检查一次,即使你只是在等待,你也会做很多工作。但是,如果您只是等待门铃响起(就像事件处理一样),那么您实际上并没有做任何工作。
发布于 2019-05-09 12:11:31
cout的性能不是很高(特别是在Win32!上),而且强制使用std::endl刷新也无济于事:)通常最好自己跟踪这些日志消息,或者:完成后写入文件,打印平均值,大约每N次输出一次,或者在结束时打印减少的摘要。
https://stackoverflow.com/questions/56051898
复制相似问题