在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的“庄园农场的字符串格式化程序”中写下了一篇非常美味的文章,他深入了解sscanf
和lexical_cast
等字符串格式化程序的性能细节,以及使它们缓慢或快速运行的类型。 这有点类似,可能是那些会影响C风格IO和C ++风格之间性能的东西。 与格式化程序的主要区别在于类型安全性和内存分配数量。
上一篇: Using scanf() in C++ programs is faster than using cin?