首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cout是否降低了CPU使用率?

cout是否降低了CPU使用率?
EN

Stack Overflow用户
提问于 2019-05-09 11:50:41
回答 2查看 218关注 0票数 3

我正在运行一个用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尖峰的高度。

下面是有问题的代码行:

代码语言:javascript
复制
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峰值的大小减小。

EN

回答 2

Stack Overflow用户

发布于 2019-05-09 12:37:04

根据实现方式的不同,写入std::cout基本上涉及将控制权移交给操作系统一小段时间,然后操作系统将数据发送到终端。这不是windows上最快的进程,在此期间程序基本上是空闲的。std::cout需要处理的数据越多,延迟所需的时间就越长,因此程序空闲的时间就越多。

如果程序花费大量时间等待输入(来自另一个程序、来自键盘或鼠标、来自“重画屏幕”信号(如果它具有GUI )、来自操作系统或来自文件系统),则该程序的CPU使用率较低。基本上,CPU使用率表示程序没有等待的那部分时间。

如果程序的唯一任务是处理大量传入数据,而没有延迟,那么它根本就不应该等待,如果CPU使用率很高也没问题。另一方面,如果您有一个等待用户输入的程序(比如交互式应用程序),那么高CPU使用率可能会有问题,因为这意味着程序正在做大量工作,即使用户什么也没做。

让程序更有效率通常会解决这个问题。

CPU使用率高的其他原因

如果你在一个紧密的循环中检查一些事情发生,而不是使用事件处理,这将导致高CPU使用率,因为即使程序正在等待一些东西,它也会主动地检查它。这是每三分钟检查一次门上的包裹,和只是等待门铃响起之间的区别。如果你每三分钟检查一次,即使你只是在等待,你也会做很多工作。但是,如果您只是等待门铃响起(就像事件处理一样),那么您实际上并没有做任何工作。

票数 5
EN

Stack Overflow用户

发布于 2019-05-09 12:11:31

cout的性能不是很高(特别是在Win32!上),而且强制使用std::endl刷新也无济于事:)通常最好自己跟踪这些日志消息,或者:完成后写入文件,打印平均值,大约每N次输出一次,或者在结束时打印减少的摘要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56051898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档