我有一个代码,我目前在终端上打印了很多诊断消息。有没有人知道这会减慢我的代码的速度?通过将输出汇总到文件来获得大幅度的提升,例如而不是跑步:
./my_program
我跑
./my_program > output.log
另外,我是否可以通过使用ofstream替换cout并直接写入文件来进一步提高速度?
编辑:我们假设我正在写/ dev / shm,磁盘访问速度并不是真正的问题。
答案 0 :(得分:8)
是的,渲染到屏幕所需的时间比写入文件要长
在Windows中,它甚至更慢,因为程序渲染不是正在运行的程序,因此在进程之间不断发送消息以获取它。
我想在linux中也是如此,因为虚拟终端与正在运行的进程不同。
答案 1 :(得分:1)
当然可以。打印到终端涉及渲染和其他事情(非平凡),并且通常缓冲少得多。操作系统和流实现可以使用文件I / O进行更多缓冲和缓存。
答案 2 :(得分:1)
你获得多少速度取决于几个因素。例如,Windows控制台速度非常慢。 ofstream
可能比cout
更快,具体取决于你的libc ++实现(不同的缓冲区大小,线程同步,......)
答案 3 :(得分:0)
如果不测量特定系统,这很难说,但我怀疑写入文件实际上比写入显示更快(文件不必滚动等)。
根据您的操作系统,系统和库,直接写入ofstream
可以进一步提高性能,如果它使用与cout
相比不同的缓冲方案,但它可能会没有任何影响。确切知道的唯一方法是对代码进行分析(如评论中已经建议的那样)。
答案 4 :(得分:0)
这实际上取决于您的打印量。
如果您的程序每秒打印50行或更多行,那么我打赌输出开始变得很重要。
输出到文件肯定比打印到终端快得多,尽管不同的终端程序的速度会有很大差异,具体取决于它们正在做多少渲染以及它们用于渲染api的内容。
我非常怀疑cout与ofstream在终端打印性能甚至输出到文件方面存在显着的性能差异。如果使用fwrite编写日志行,可能会获得非常小的性能提升。最终像cout这样的东西会调用fwrite,所以你可以通过自己调用最低级别来获得一点改进。
最后 - 像cout这样的输出流比像cerr这样的错误流更快。 Cout会比cerr做更多的缓冲,性能可以明显更快。但看起来你已经在使用cout了。
答案 5 :(得分:0)
一般来说,是的。如果您不必写入终端,则可以使用文件。如果不需要查看输出,也可以使用/ dev / null。(例如,测量实际速度......)