C++无限循环代码快速占满内存,取消cout注释后占用变慢原因咨询
原因分析
- 最核心的影响是IO操作的极高耗时大幅拉低了循环执行频次
注释掉cout语句时,循环内仅包含字符串追加、list插入两个纯用户态内存操作,不存在任何阻塞型系统调用,CPU可以满负载运行,每秒可执行数十万甚至上百万次循环。每次循环会给inf追加4个字符,同时往list中存入inf的完整独立副本,内存占用随循环次数线性暴涨,自然会在数秒内占满内存。
启用cout语句后,即使cout默认开启了输出缓冲区,不需要每次输出都触发系统调用刷写到终端,仅往输出缓冲区写入数据、以及缓冲区满后的终端刷写操作的耗时,也是纯内存操作的上千到上万倍。按照你测试的一分钟仅增长1015MB内存折算,每秒仅能执行数千次循环,执行频次比无`cout`的场景低了23个数量级,内存上涨速度自然大幅放缓。 - 编译器优化策略的差异是次要影响因素
没有cout的循环中不存在IO相关副作用,编译器可以对内存操作、循环逻辑做更激进的指令级优化,进一步提升循环执行速度;加入cout后,编译器无法对IO相关逻辑做激进优化,也会一定程度降低循环执行效率,但该影响远小于IO操作本身的耗时。
如果你想验证这个结论,可以尝试将程序的标准输出重定向到空设备(Linux下为/dev/null,Windows下为nul),此时终端刷写的开销会完全消失,内存上涨速度会比输出到终端时快很多,但仍会比完全删除cout语句的场景稍慢,因为还存在往输出缓冲区写入数据的开销。
内容的提问来源于stack exchange,提问作者fuadik88
相关产品推荐
相关产品推荐

