我有一段代码,目前我在终端打印了很多诊断信息。 请问有人知道这会减慢我的代码多少?如果将输出重定向到文件中,例如不是运行:
./my_program
我奔跑
./my_program > output.log
另外,如果我使用ofstream直接写入文件,能否进一步提高速度,而不是使用cout?
编辑:假设我正在写入/dev/shm,磁盘访问速度不是问题。
我有一段代码,目前我在终端打印了很多诊断信息。 请问有人知道这会减慢我的代码多少?如果将输出重定向到文件中,例如不是运行:
./my_program
我奔跑
./my_program > output.log
另外,如果我使用ofstream直接写入文件,能否进一步提高速度,而不是使用cout?
编辑:假设我正在写入/dev/shm,磁盘访问速度不是问题。
是的,将内容渲染到屏幕上比将其写入文件需要更长时间。
在Windows中,由于程序渲染不是正在运行的程序,因此进程之间会不断发送消息以进行绘制。
我想这在Linux中也是一样的,因为虚拟终端与正在运行的终端处于不同的进程中。
当然可以。将内容输出到终端涉及呈现等操作(不是很简单),通常缓冲要少得多。操作系统和流实现可以用文件I/O进行更多的缓存和缓冲。
你会受到多大的速度影响取决于几个因素。例如,Windows控制台是出了名的缓慢。 ofstream
可能比 cout
稍微快一些,这取决于您的libc++实现(不同的缓冲区大小、线程同步等)。
这真的取决于你打印的数量。
如果你的程序每秒打印50行或更多,则我敢打赌输出开始变得显著。
将输出写入文件肯定比打印到终端快得多,尽管不同的终端程序在速度上会有很大差异,这取决于它们渲染的量以及它们用于渲染API的内容。
我非常怀疑在终端打印或甚至输出到文件的性能方面,cout与ofstream之间没有任何显着的性能差异。如果您使用fwrite编写日志行,则可能会获得非常小的性能提升。最终,像cout这样的输出流将调用fwrite,因此您可以通过直接调用该最低级别来获得小的改进。
最后 - 像cout这样的输出流比cerr这样的错误流更快。Cout将进行更多的缓冲,性能可能会显着提高。但是看起来您已经在使用cout了。
没有测量特定系统很难说,但我怀疑写入文件实际上比写入显示器更快(文件不必滚动等)。
根据您的操作系统、系统和库,如果使用与cout
不同的缓冲方案,则直接写入ofstream
可能会进一步提高性能,但它可能根本没有任何效果。唯一确定的方法是对代码进行分析(如评论中已建议的那样)。
time ./my_program > output.log 2>&1
,看看你得到什么结果,然后与time ./my_program > output.log 2>&1 &
(在后台分叉)进行比较,并使用multitail output.log
在另一个终端中查看输出。这取决于 CPU 负载、服务、进程、RAM... - t0mm13b