【问题标题】:C++ does printing to terminal significantly slow down code?C++ 打印到终端会显着减慢代码速度吗?
【发布时间】:2024-01-20 23:46:01
【问题描述】:

我有一个代码,我目前在其中向终端打印大量诊断消息。有人知道这会减慢我的代码多少吗?通过将输出管道传输到文件,我是否会大大提高速度?而不是运行:

./my_program

我跑

./my_program > output.log

另外,我是否可以通过将 cout 替换为 ofstream 并直接写入文件来进一步提高速度?

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

【问题讨论】:

  • 我的有趣问题 +1。计时,time ./my_program > output.log 2>&1 看看你得到了什么结果,然后将其与time ./my_program > output.log 2>&1 &(后台分叉)进行比较,并使用multitail output.log 查看来自另一个终端的输出。这取决于 CPU 负载、服务、进程、RAM...
  • 您可以对其进行分析并找出...(!)
  • 我知道在 Windows 95 的旧时代,您可以按 Alt+Enter 将 DOS 框切换到文本模式,然后程序运行速度大大
  • 尝试在不同的线程上打印并释放您的主程序线程。这应该会显着提高你的表现。检查这个:superuser.com/a/312955
  • 您可以通过缓冲和/或更改缓冲区大小来获得更快的控制台输出。见en.cppreference.com/w/cpp/io/c/setvbuf

标签: c++ performance printing terminal


【解决方案1】:

是的,渲染到屏幕比写入文件花费的时间更长。
在 Windows 中,它甚至更慢,因为程序渲染不是正在运行的程序,因此进程之间会不断发送消息来绘制它。
我猜它在 linux 中是一样的,因为虚拟终端与正在运行的进程不同。

【讨论】:

    【解决方案2】:

    当然可以。打印到终端涉及渲染和其他事情(非平凡的),并且通常缓冲少得多。操作系统和流实现可以通过文件 I/O 进行更多的缓冲和缓存。

    【讨论】:

      【解决方案3】:

      你获得多少速度将取决于几个因素。例如,Windows 控制台的速度非常慢。 ofstream 可能cout 稍微快一些,这取决于你的 libc++ 实现(不同的缓冲区大小、线程同步......)

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          这真的取决于你要打印多少。

          如果您的程序每秒打印 50 行或更多行,那么我敢打赌输出开始变得重要。

          输出到文件肯定比打印到终端快得多,尽管不同的终端程序的速度会有很大差异,具体取决于它们正在执行的渲染量以及它们用于渲染 api 的内容。

          我非常怀疑 cout 与 ofstream 在终端打印甚至输出到文件的性能方面是否存在显着的性能差异。如果您使用 fwrite 编写日志行,可能会有非常小的性能提升。最终,像 cout 这样的东西会调用 fwrite,因此您只需自己调用最低级别即可获得小幅改进。

          最后 - 像 cout 这样的输出流比像 cerr 这样的错误流更快。 Cout 会比 cerr 做更多的缓冲,性能会明显更快。但看起来你已经在使用 cout 了。

          【讨论】:

            【解决方案6】:

            一般来说,是的。如果您不必写入终端,则可以使用文件。如果不需要查看输出,也可以使用 /dev/null。(例如,测量实际速度...)

            【讨论】: