为什么 cerr 比 cout 输出更快?

3

使用cout输出语句需要更多的时间,这对我来说不是很好。但是使用cerr输出速度更快。为什么?


9
在Linux中,std::cout/stdout是行缓冲的,而std::cerr/stderr则不是缓冲的。参见 https://dev59.com/p2865IYBdhLWcg3wnf9t - simon
4
你是如何确定其“更快”的? - 5gon12eder
1
我猜输出到std::cerr或者std::clog应该比输出到std::cout慢(因为缓冲区的差异);你有用<<std::flush或者<<std::endl刷新输出吗? - Basile Starynkevitch
更快可能意味着“看起来更早出现”。 - Bo Persson
是的出现得更早了。。 - P. Balech
1
如果你需要立即看到输出结果,那么就像@BasileStarynkevitch所说的那样刷新流。请注意,这会降低整体性能,但对于交互式程序来说,你可能可以容忍这一点。 - 5gon12eder
1个回答

3

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

cout是有缓冲的,而cerr没有,因此在大多数情况下,cout应该更快。(虽然如果您真的关心速度,C输出函数如printf tend可能比cout/cerr快得多)。 cout和cerr都是ostream对象。您可以在它们上面调用rdbuf(),以便从应用程序内部独立地将它们的输出重定向到任何您想要的地方。您可以打开网络套接字,将其包装在流缓冲区中并重定向到那里,如果您想这样做。

默认情况下,cout绑定到应用程序的标准输出。默认情况下,标准输出是屏幕。您可以指示操作系统将stdout重定向到其他位置。或者它可能会自动完成-例如Linux中的nohup实用程序。我认为Windows中的服务也会重定向其标准流。

还有一件事是,clog默认情况下像cout一样具有缓冲功能,而cerr是单元缓冲的,这意味着在每次完整的输出操作之后,它会自动调用flush()。这非常有用,因为它意味着如果应用程序直接崩溃,则不会在缓冲区中丢失输出。

如果您像这样运行程序: yourprog > yourfile

您写入的内容将会被发送到yourfile。您写入的错误消息将会被发送到您的屏幕上。这通常是一件好事。我可能不希望您的错误消息与您的程序输出混合在一起。(特别是如果您的某些错误消息只是警告或诊断信息)。 还可以将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


2
在现代系统上,cout 不比 printf 慢,这是一个谬论;只需在使用它之前调用 std::ios::sync_with_stdio(false); 即可。 - kfx
@kfx,它变慢的原因是它等待printf。如果使用std::sync_with_stdio(0);,实际上比printf更快。 - Abhay Patil

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