首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++程序中使用scanf()比使用cin更快?

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

Stack Overflow用户
提问于 2009-06-25 03:58:39
回答 12查看 94.4K关注 0票数 145

我不知道这是不是真的,但当我在一个问题提供网站上阅读FAQ时,我发现了一些东西,引起了我的注意:

检查您的输入/输出方法。在C++中,使用cin和cout太慢了。使用这些,您将保证不能用适当数量的输入或输出解决任何问题。请改用printf和scanf。

有人能澄清这一点吗?在C++程序中使用scanf()真的比使用cin >>快吗?如果是,那么在C++程序中使用它是一种很好的实践吗?我认为它是特定于C语言的,尽管我只是在学习C++...

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2012-10-07 01:36:08

下面是一个简单案例的快速测试:一个从标准输入读取数字列表并对所有数字执行XOR操作的程序。

iostream版本:

代码语言:javascript
复制
#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;
}

扫描版本:

代码语言:javascript
复制
#include <stdio.h>

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

  int parity = 0;
  int x;

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

  return 0;
}

结果

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

代码语言:javascript
复制
iostream version:  24.3 seconds
scanf version:      6.4 seconds

更改编译器的优化设置似乎根本不会改变结果。

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

编辑:用户clyfish points out below指出,速度差异很大程度上是由于iostream I/O函数与C I/O函数保持同步。我们可以通过调用std::ios::sync_with_stdio(false);来关闭它

代码语言:javascript
复制
#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;
}

新结果:

代码语言:javascript
复制
iostream version:                       21.9 seconds
scanf version:                           6.8 seconds
iostream with sync_with_stdio(false):    5.5 seconds

C++ iostream赢了!事实证明,这种内部同步/刷新通常会减慢iostream i/o。如果我们不混合stdio和iostream,我们可以关闭它,然后iostream是最快的。

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

票数 235
EN

Stack Overflow用户

发布于 2013-04-11 09:27:24

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

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

但是,如果您只打算使用C++ IO,则只需在执行任何IO操作之前使用以下行即可。

代码语言:javascript
复制
std::ios::sync_with_stdio(false);

有关这方面的更多信息,请查看相应的libstdc++ docs

票数 81
EN

Stack Overflow用户

发布于 2009-06-25 04:03:06

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

这里有一篇由Herb Sutter "The String Formatters of Manor Farm“撰写的非常精彩的文章,他详细介绍了sscanflexical_cast等字符串格式化程序的性能,以及是什么原因导致它们运行得很慢或很快。这有点类似于C风格IO和C++风格之间会影响性能的东西。格式化程序的主要区别在于类型安全性和内存分配的数量。

票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1042110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档