【问题标题】:Why cerr output faster than cout?为什么cerr输出比cout快?
【发布时间】:2016-01-08 03:50:33
【问题描述】:

使用 cout 需要更多时间来输出对我不利的语句。但是当使用 cerr 时,输出会更快。为什么?

【问题讨论】:

  • 在 Linux 中 std::cout / stdout 是行缓冲的,而 std::cerr / stderr 没有缓冲,请参阅 stackoverflow.com/questions/3723795/…
  • 您如何确定它“更快”?
  • 我的猜测是输出到std::cerrstd::clog 应该std::cout(因为缓冲差异);你用<<std::flush<<std::endl 刷新输出了吗?
  • 更快可能意味着“出现得更快”。
  • 然后按照@BasileStarynkevitch 所说的那样刷新流,如果您需要立即显示输出。请注意,这是以降低整体性能为代价的,但对于交互式程序,您可能可以容忍这种情况。

标签: c++


【解决方案1】:

只是想帮忙: - cout -> 常规输出(控制台输出) - cerr -> 错误输出(控制台错误)

cout 是缓冲的,而 cerr 不是,所以 cout 在大多数情况下应该更快。 (尽管如果您真的关心速度,那么诸如 printf 之类的 C 输出函数往往比 cout/cerr 快很多)。 cout 和 cerr 是 ostream 对象。您可以在它们上调用 rdbuf() 以从应用程序内的任意位置独立重定向它们的输出。如果需要,您可以打开网络套接字,将其包装在流缓冲区中并重定向到那里。

默认情况下,cout 绑定到应用程序的标准输出。默认情况下,标准输出是屏幕。您可以指示操作系统将标准输出重定向到其他地方。或者它可以自己做——例如,Linux 中的 nohup 实用程序就可以做到。我认为 Windows 中的服务也会重定向其标准流。

而且,cerr 与应用程序的标准错误相关联。默认情况下,标准错误是屏幕。您可以再次将 stderr 重定向到其他地方。 这里的另一个问题是,默认情况下,clog 像 cout 一样被缓冲,而 cerr 是单元缓冲的,这意味着它会在每次完成输出操作后自动调用 flush()。这非常有用,因为这意味着如果应用程序随后直接崩溃,输出不会丢失在缓冲区中。

如果你运行这样的程序: 你的程序>你的文件

你写给 cout 的内容将进入你的文件。您写入 cerr 的内容将显示在您的屏幕上。这通常是一件好事。我可能不希望您的错误消息与您的程序输出混在一起。 (特别是如果您的某些错误消息只是警告或诊断信息)。 也可以将 cout 重定向到 1 个文件,并将 cerr 重定向到另一个文件。这是一个方便的范例:我运行您的程序,将输出重定向到一个文件,将错误消息重定向到另一个文件。如果您的程序从 main 返回 0,那么我知道可以处理输出文件。如果它返回错误代码,我知道不处理输出文件。错误文件会告诉我出了什么问题。

参考: - http://www.tutorialspoint.com/cplusplus/cpp_basic_input_output.htm - http://cboard.cprogramming.com/cplusplus-programming/91613-cout-cerr-clog.html

【讨论】:

  • cout 在现代系统上并不比printf 慢,这是一个神话;使用前请致电std::ios::sync_with_stdio(false);
  • @kfx 速度较慢的原因是它等待 printf。如果使用std::sync_with_stdio(0); 那么事实上,它比 printf 快
猜你喜欢
  • 2023-03-10
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
相关资源
最近更新 更多