在C ++程序中使用scanf()比使用cin更快?

我不知道这是否属实,但当我在提供网站的问题之一阅读常见问题解答时,我发现了一些事情,引起了我的注意:

检查你的输入/输出方法。 在C ++中,使用cin和cout太慢了。 使用这些,你将保证无法用大量的输入或输出来解决任何问题。 改用printf和scanf。

有人可以澄清这一点? 真的在C ++程序中使用scanf()比使用cin >>东西更快吗? 如果是的话,那在C ++程序中使用它是一个好习惯吗? 我认为这是C特定的,但我只是学习C ++ ...


下面是一个简单案例的快速测试:一个程序从标准输入读取数字列表,并将所有数字异或。

iostream版本:

#include <iostream>

int main(int argc, char **argv) {

  int parity = 0;
  int x;

  while (std::cin >> x)
    parity ^= x;
  std::cout << parity << std::endl;

  return 0;
}

scanf版本:

#include <stdio.h>

int main(int argc, char **argv) {

  int parity = 0;
  int x;

  while (1 == scanf("%d", &x))
    parity ^= x;
  printf("%dn", parity);

  return 0;
}

结果

使用第三个程序,我生成了一个包含33,280,276个随机数字的文本文件。 执行时间是:

iostream version:  24.3 seconds
scanf version:      6.4 seconds

改变编译器的优化设置似乎并没有改变结果。

因此:确实存在速度差异。


编辑:用户clyfish指出下面的速度差异主要是由于保持与CI / O功能同步的iostream I / O功能。 我们可以通过调用std::ios::sync_with_stdio(false);来关闭它std::ios::sync_with_stdio(false);

#include <iostream>

int main(int argc, char **argv) {

  int parity = 0;
  int x;

  std::ios::sync_with_stdio(false);

  while (std::cin >> x)
    parity ^= x;
  std::cout << parity << std::endl;

  return 0;
}

新结果:

iostream version:                       21.9 seconds
scanf version:                           6.8 seconds
iostream with sync_with_stdio(false):    5.5 seconds

C ++ iostream获胜! 事实证明,这种内部同步/刷新通常会减慢iostream的I / O速度。 如果我们不混合cstdio和iostream,我们可以关闭它,然后iostream是最快的。

代码:https://gist.github.com/3845568


http://www.quora.com/Is-cin-cout-slower-than-scanf-printf/answer/Aditya-Vishwakarma

cin / cout的性能可能会很慢,因为它们需要保持与底层C库同步。 如果要使用CIO和C ++ IO,这一点非常重要。

但是,如果您只打算使用C ++ IO,则只需在任何IO操作前使用下面的行

std::ios::sync_with_stdio(false);

有关更多信息,请参阅libstdc ++文档:http://gcc.gnu.org/onlinedocs/libstdc++/manual/io_and_c.html


可能scanf比使用流有点快。 虽然流提供了很多类型安全性,并且不必在运行时解析格式化字符串,但它通常具有不需要过多内存分配的优点(这取决于您的编译器和运行时)。 这就是说,除非性能是你唯一的最终目标,并且你处在关键路径中,那么你应该真正喜欢更安全(更慢)的方法。

在Herb Sutter的“庄园农场的字符串格式化程序”中写下了一篇非常美味的文章,他深入了解sscanflexical_cast等字符串格式化程序的性能细节,以及使它们缓慢或快速运行的类型。 这有点类似,可能是那些会影响C风格IO和C ++风格之间性能的东西。 与格式化程序的主要区别在于类型安全性和内存分配数量。

链接地址: http://www.djcxy.com/p/21431.html

上一篇: Using scanf() in C++ programs is faster than using cin?

下一篇: How much null checking is enough?