我有一个代码,我目前在其中向终端打印了很多诊断消息。有人知道这会减慢我的代码多少吗?通过将输出管道传输到文件,我是否会大大提高速度,例如,而不是运行:
./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++ 实现(不同的缓冲区大小,线程同步,......)
如果不测量特定系统,这很难说,但我怀疑写入文件实际上会比写入显示器更快(文件不必滚动等)。
根据您的操作系统、系统和库,如果它使用不同的缓冲方案,ofstream
直接写入可以cout
进一步提高性能,但它可能没有任何效果。确定的唯一方法是分析您的代码(正如评论中已经建议的那样)。
这实际上取决于您要打印多少。
如果您的程序每秒打印 50 行或更多行,那么我敢打赌输出开始变得重要。
输出到文件肯定比打印到终端快得多,尽管不同的终端程序的速度会有很大差异,具体取决于它们正在执行的渲染量以及它们用于渲染 api 的内容。
我非常怀疑 cout 与 ofstream 的终端打印性能甚至输出到文件的性能是否存在任何显着的性能差异。如果您使用 fwrite 编写日志行,可能会有非常小的性能提升。最终,像 cout 这样的东西会调用 fwrite,所以你可以通过自己调用到最低级别来获得一个小的改进。
最后 - 像 cout 这样的输出流比像 cerr 这样的错误流更快。Cout 会比 cerr 做更多的缓冲,性能会明显更快。但看起来你已经在使用 cout 了。
一般来说,是的。如果您不必写入终端,则可以使用文件。如果不需要查看输出,您也可以使用 /dev/null。(例如,测量实际速度......)