cout或printf这两者中的哪一个具有更快的执行速度C++?

pir*_*ate 24 c++

我用C++编写了很长时间.我总是想知道哪个执行速度更快printf或者cout

情况:我正在用C++设计一个应用程序,我有一些约束,比如执行时间限制.我的应用程序在控制台上加载打印命令.那么哪一个更好printf或者cout

Hex*_*gon 25

每个都有自己的开销.根据您打印的内容,可能更快.

以下是我想到的两点 -

printf()必须解析"format"字符串并对其进行操作,这会增加成本.
cout具有更复杂的继承层次结构并传递对象.

在实践中,差异对于除了最奇怪的情况之外的所有情况都不重要.如果您认为真的很重要 - 请测量!

编辑 -
哦,哎呀,我不相信我这样做,但是为了记录,在我非常具体的测试用例中,使用我非常具体的机器及其非常具体的负载,使用MSVC在Release中编译 -

打印150,000"Hello,World!"(不使用endl)需要大约 -
90ms的printf(),79ms的cout.

打印150,000随机双打大约需要
3450ms(printf()),3420ms(cout).

(平均超过10次运行).

差异很小,这可能意味着什么......

  • 复杂的继承层次结构和传递对象本身都不会产生开销. (3认同)
  • 复杂的继承层次结构通常意味着较少的局部性,这会影响性能.并且周围的物体传递 - 很好 - 传递周围的物体,否则就不会传递......但我完全同意这些是轶事. (3认同)
  • 诺多林 - 完全如此。这里没有惊喜。如果我稍微调整打印的内容(例如,添加前导零或其他格式,或者在数字之间添加一些额外的字符串),我可能会显示相反的结果......但是,足够了。生活中有更好的事情要做。 (2认同)

Nol*_*rin 24

你真的需要关心哪个具有更快的执行速度?它们仅用于将文本打印到控制台/标准输出,这通常不是要求超高效率的任务.就此而言,我无论如何都无法想象速度会有很大的差异(尽管人们可能期望printf稍快一点,因为它缺乏面向对象的微小复杂性).然而,鉴于我们在这里处理I/O操作,即使是微小的差异也可能会被I/O开销所淹没.当然,如果你比较了写入文件的等效方法,那就是这种情况.

printf只是将文本输出到C中
的标准输出的标准方法.'cout'管道只是在C++中将文本输出到标准输出的标准方法.

说到这一切,comp.lang.cc小组讨论了同样的问题.然而,共识确实应该是出于性能以外的原因而选择一个而不是另一个.

  • 当人们提出一个简单的问题,比如"X比Y快吗?"时,我觉得真的很烦人.而不是得到这个问题的答案,"回答者"总是告诉他们这无关紧要,或者它是微观优化和那种糟糕的事情. (17认同)
  • 我不会说它没关系.我当然可以想象它的实例(例如,当您编写数百万行日志行时).但他们会很少而且很远. (13认同)
  • 将128k矢量数据转换为文本时,差异确实很重要. (7认同)
  • @peterchen:压倒性的证据表明不然.:) (2认同)
  • 在嵌入式系统上,这很重要! (2认同)

rob*_*les 9

C++ cout缓慢的原因是与stdio的默认同步.

尝试执行以下操作以停用此问题.

ios_base::sync_with_stdio(false)

http://www.cplusplus.com/reference/iostream/ios_base/sync_with_stdio/

http://msdn.microsoft.com/es-es/library/7yxhba01.aspx


Dan*_*ker 7

至少在Windows上,写入控制台是一个巨大的瓶颈,因此"嘈杂"的控制台模式程序将比静音程序慢得多.因此,在该平台上,用于解决控制台的库函数的细微差别可能在实践中没有显着差异.

在其他平台上可能会有所不同.此外,它取决于您正在做多少控制台输出,相对于其他有用的工作.

最后,它取决于您的平台的C和C++ I/O库的实现.

所以这个问题没有一般的答案.


nha*_*123 5

绩效是一个无需比较的问题; 无法想到实际上重要的任何事情(开发控制台程序).但是,您应该考虑以下几点:

  • Iostream使用操作符链接而不是va_args.这意味着您的程序不会崩溃,因为您传递了错误数量的参数.printf可能会发生这种情况.

  • Iostream使用运算符重载而不是va_args - 这意味着您的程序不会崩溃,因为您传递了一个int并且它期待一个字符串.printf可能会发生这种情况.

  • Iostreams没有对格式字符串的本机支持(这是#1和#2的主要根本原因).这通常是件好事,但有时候它们很有用.Boost格式库为Iostreams带来了这个功能,适用于那些需要定义行为(抛出异常)而不是未定义行为的人(就像printf一样).目前这不符合标准.

  • 与其printf等效项不同,Iostream可以直接处理可变长度的缓冲区,而不是被迫处理硬编码.

去寻找cout.