C++打印到终端会显著减慢代码吗?

14

我有一段代码,目前我在终端打印了很多诊断信息。 请问有人知道这会减慢我的代码多少?如果将输出重定向到文件中,例如不是运行:

./my_program

我奔跑

./my_program > output.log

另外,如果我使用ofstream直接写入文件,能否进一步提高速度,而不是使用cout?

编辑:假设我正在写入/dev/shm,磁盘访问速度不是问题。


有趣的问题,我点赞。计时一下,time ./my_program > output.log 2>&1,看看你得到什么结果,然后与 time ./my_program > output.log 2>&1 &(在后台分叉)进行比较,并使用 multitail output.log 在另一个终端中查看输出。这取决于 CPU 负载、服务、进程、RAM... - t0mm13b
11
你可以对其进行分析并找出答案...(!) - Oliver Charlesworth
我知道在早期的Windows95时代,你可以按Alt+Enter键将DOS框切换到文本模式,然后程序运行速度会快得多。 - Mr Lister
尝试在不同的线程上打印并释放主程序线程。这应该可以显著提高性能。请参考此链接:https://superuser.com/a/312955 - Nilav Baran Ghosh
你可以通过缓冲和/或更改缓冲区大小来获得更快的控制台输出。请参见https://en.cppreference.com/w/cpp/io/c/setvbuf。 - L. Scott Johnson
6个回答

10

是的,将内容渲染到屏幕上比将其写入文件需要更长时间。
在Windows中,由于程序渲染不是正在运行的程序,因此进程之间会不断发送消息以进行绘制。
我想这在Linux中也是一样的,因为虚拟终端与正在运行的终端处于不同的进程中。


2

当然可以。将内容输出到终端涉及呈现等操作(不是很简单),通常缓冲要少得多。操作系统和流实现可以用文件I/O进行更多的缓存和缓冲。


2

你会受到多大的速度影响取决于几个因素。例如,Windows控制台是出了名的缓慢。 ofstream 可能比 cout 稍微快一些,这取决于您的libc++实现(不同的缓冲区大小、线程同步等)。


1

这真的取决于你打印的数量。

如果你的程序每秒打印50行或更多,则我敢打赌输出开始变得显著。

将输出写入文件肯定比打印到终端快得多,尽管不同的终端程序在速度上会有很大差异,这取决于它们渲染的量以及它们用于渲染API的内容。

我非常怀疑在终端打印或甚至输出到文件的性能方面,cout与ofstream之间没有任何显着的性能差异。如果您使用fwrite编写日志行,则可能会获得非常小的性能提升。最终,像cout这样的输出流将调用fwrite,因此您可以通过直接调用该最低级别来获得小的改进。

最后 - 像cout这样的输出流比cerr这样的错误流更快。Cout将进行更多的缓冲,性能可能会显着提高。但是看起来您已经在使用cout了。


0

没有测量特定系统很难说,但我怀疑写入文件实际上比写入显示器更快(文件不必滚动等)。

根据您的操作系统、系统和库,如果使用与cout不同的缓冲方案,则直接写入ofstream可能会进一步提高性能,但它可能根本没有任何效果。唯一确定的方法是对代码进行分析(如评论中已建议的那样)。


0
通常可以。如果您不需要写入终端,可以使用文件。如果不需要查看输出,也可以使用/dev/null(例如,用于测量实际速度...)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接