STD :: COUT正在减少CPU使用情况

std::cout is decreasing CPU Usage?

本文关键字:CPU 情况 用情 COUT STD      更新时间:2023-10-16

我正在运行用C 编写的程序,其中CPU使用是一个重要的因素,并且一直在努力减少它,直到遇到意外的异常。该程序使用std::cout行来查看性能,当我将其删除时,该程序在Windows Resource Monitor中急剧上的CPU用法在4-6秒的间隔中大约1秒钟。

使用std::cout行,它在0-2%的CPU使用情况下平稳运行,而无需任何峰值。删除std::cout行,它以0-2%的CPU使用,在Windows Resource Monitor中的4-6秒间隔CPU使用率高达25%。

有趣的是,增加了输出的字符串大小可降低CPU尖峰的高度,并降低字符串的大小增加了CPU Spike的高度。

这是所讨论的代码行:

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 Spike。

当std :: Cout线不在程序中时,有一个CPU Spike。

随着std :: cout打印的字符串大小增加,CPU尖峰的大小减小。

取决于实现,写信给std::cout基本上涉及将控制转移到操作系统短时间内,然后将数据发送到终端。这不是Windows上最快的过程,在此期间,程序基本上是空闲的。std::cout必须处理的数据越多,延迟所需的时间越长,因此该程序花费的时间越多。

如果程序花费大量时间在等待输入(来自键盘或鼠标的另一个程序,请从" redraw the Scrient"信号中,如果它具有GUI,则来自操作系统,请使用较低的CPU。,或从文件系统中(。基本上,CPU使用代表程序不是等待的时间的部分。

如果该程序的唯一工作是处理大量传入数据,而没有延迟,那么它根本不应该等待,如果使用较高的CPU使用情况,那很好。另一方面,如果您的程序等待用户输入(例如互动的应用程序(,则使用较高的CPU使用可能会出现问题,因为这意味着该程序正在执行很多操作工作,即使用户不做任何事情。

使程序提高效率通常会解决此问题。

高CPU使用的其他原因

如果您要检查是否在紧密的循环中发生某些事情,而不是使用事件处理,这将导致高CPU使用情况,因为即使程序正在等待某些东西,它还是会积极检查。每三分钟检查门的门与门铃的权利之间,这是一个区别。如果您每三分钟检查一次,即使您只是在等待,也会做很多工作。但是,如果您只等到门铃戒指(与事件处理一样(,那么您实际上并没有做任何工作。

std :: cout的性能并不是很高的表现(尤其是在win32!(,并且强迫用std :: endl进行冲洗不会有帮助的事情:)通常最好自行跟踪这些日志消息,要么:完成后写入文件,打印一个平均每次n左右的代表,或在末尾打印简化的摘要。