在C++中,cout和printf哪个执行速度更快?

38

我长时间使用C++编程。 我一直在想哪个执行速度更快,printf还是cout

情况:我正在使用C++设计应用程序,有一些限制,例如执行时间限制。 我的应用程序在控制台上有许多打印命令。 那么哪个更适合,printf还是cout


7
如果这对你很重要,写一个能够同时完成两个任务的小应用程序并计时。这个过程只需要花费你15分钟左右的时间。 - anon
4
@Neil: 这并不是那么简单。std::cout和operator<<会导致在调用点产生更多的代码。所有printf逻辑都位于CRT中,但使用运行时逻辑来解释参数字符串。因此,具有许多调用点和许多不同格式指令的大型程序可能会看到与仅具有大型“for(a lot) { printf("%d",i); }”的小型测试程序不同的影响。 - MSalters
@MSalters - 不适用于执行控制台 I/O 的程序 - 程序将受到 I/O 限制。而你所说的是永远不测试任何东西的论点。 - anon
我认为可以公正地说,如果有什么区别的话,那就是printf更快。(是的,我进行了测量,是的,我关闭了stdio同步 - 所有这些都比cout慢)。 - Johannes Schaub - litb
可能是哪个更快,哪个更灵活:printf还是cout?的重复问题。 - phuclv
15个回答

1
为什么不进行一个实验呢?对于我来说,使用printf打印字符串helloperson;平均需要2个时钟周期,而使用cout并加上endl则需要大量时间——1248996720685个时钟周期。使用带有"\n"的cout作为换行符只需要41981个时钟周期。我的代码的短链接如下:

cpp.sh/94qoj

链接可能已过期。
回答你的问题,printf 更快。
#include <iostream>
#include <string>
#include <ctime>
#include <stdio.h>
using namespace std;
int main()
{
  clock_t one;
  clock_t two;
  clock_t averagePrintf;
  clock_t averageCout;
  clock_t averagedumbHybrid;
  for (int j = 0; j < 100; j++) {
    one = clock();
    for (int d = 0; d < 20; d++) {
      printf("helloperson;");
      printf("\n");
    }
    two = clock();
    averagePrintf += two-one;

    one = clock();
    for (int d = 0; d < 20; d++) {
      cout << "helloperson;";
      cout << endl;
    }
    two = clock();
    averageCout += two-one;

    one = clock();
    for (int d = 0; d < 20; d++) {
      cout << "helloperson;";
      cout << "\n";
    }
    two = clock();
    averagedumbHybrid += two-one;
  }
  averagePrintf /= 100;
  averageCout /= 100;
  averagedumbHybrid /= 100;
  cout << "printf took " << averagePrintf << endl;
  cout << "cout took " << averageCout << endl;
  cout << "hybrid took " << averagedumbHybrid << endl;
}

是的,我确实使用了“愚蠢”的词。我最初是为自己制作的,认为结果很疯狂,所以我搜索了一下,最终发布了我的代码。

希望这能有所帮助, Ndrewffght


你提出了一个很好的观点,有些东西可以很容易地通过几行代码进行测试。如果你的URL过期了,其他人想要使用它,你应该将你的代码复制到这个答案中。 - Regular Jo
1
我的假设是 endl 占用了大量时间,因为 endl 既打印换行符,也可能打印回车符,这取决于你的操作系统。然后,它会刷新流,消耗时间。顺便说一下,@RegularJoe,我将发布代码。 - ndrewxie
请将您的变量初始化为零。之后,其中三个变量占用的时间几乎相同。 - Mah35h

0
如果您因性能原因需要查找某些内容,那么您的应用程序可能存在根本性问题 - 考虑使用其他日志记录工具或用户界面 ;)

0

在底层,它们将使用相同的代码,因此速度差异不会有影响。

如果您只在Windows上运行,则非标准cprintf()可能更快,因为它绕过了许多流操作。

然而,这是一个奇怪的要求。没有人能那么快阅读输出。为什么不把输出写入文件,然后用户可以随意浏览文件呢?


“没人能读得那么快”。除非你使用单独的线程写入终端,否则cout和printf会阻塞应用程序。这并不重要,除非你正在编写大量的日志代码,而OP可能正在这样做。 - ndrewxie
@ndrewxie - 没错。但我认为还有比依赖于stdio与iostreams的相对速度更好的方法。 - Michael J

-2

个人经验:

我曾经设计过一个使用ostream运算符的日志类 - 实现非常缓慢(对于大量数据)。

我没有进行太多分析,所以这可能是由于未正确使用输出流,或者仅仅是由于记录到磁盘的数据量过大造成的。(由于性能问题,该类已被废弃,在实践中更喜欢printf / fmtmsg风格。)

我同意其他回复的观点,在大多数情况下,这并不重要。如果输出确实是一个问题,您应该考虑避免/延迟它的方法,因为实际的显示更新通常比正确实现的字符串构建成本更高。数千行在毫秒内滚动并不是很有信息量。


-6

你不应该问这个问题,因为用户只能比它们阅读得更慢。

如果你需要快速执行,请不要使用它们。

正如其他人所提到的,如果你需要记录操作,可以使用某种日志记录。


11
假设每个向其输出写入的应用程序都设计为用户实时准备,这是错误的。许多服务器应用程序即使在性能敏感的情况下也会记录到标准输出流。 - Tom

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