您的位置:首页 > 其它

关于printf/scanf 与 cin/cout 输入输出的速度研究

2016-12-01 21:59 417 查看
这是我的第一篇研究型博客……

好吧,步入正题。

我们经常听别人说:cin/cout 输入输出慢,printf/scanf 大法好,那么 cin/cout 究竟有多慢?

为此我写了一个数据生成器,其实就是生成了 1-5000000 的一个递增序列,生成的文件大小有38.9 MB (38,888,896 字节)。

现在有两个程序干同一件事:把这个文件输入,原样输出,但一个是 cin/cout,一个是 printf/scanf。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
int x;
for(int i=1;i<=5000000;++i)
{
scanf("%d",&x);
printf("%d",x);
}
fclose(stdin);
fclose(stdout);
return 0;
}


#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
int x;
for(int i=1;i<=5000000;++i)
{
cin>>x;
cout<<x;
}
fclose(stdin);
fclose(stdout);
}


可以看出,两则程序除了输入输出之外,没有什么区别。

但它们分别运行了多久呢?

我们用Linux下的time命令测时间。

time命令:http://baike.baidu.com/subview/10368/12526581.htm

结果如何呢?



呵呵……显而易见,当然是 printf/scanf 更快啦。

不过,传说中取消 cin/cout 与 stdio 的同步以后会更快,差不多与 printf/scanf 相当,我们来试一试!

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
ios::sync_with_stdio(false);//这两行语句取消了同步
cin.tie(0);                 //和其他占时间的因素。
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
int x;
for(int i=1;i<=5000000;++i)
{
cin>>x;
cout<<x;
}
fclose(stdin);
fclose(stdout);
}




看吧!的确是差不多了。

注意: 取消同步后,不要在程序里再使用 printf/scanf 等 cstdio 中的输入输出(文件操作除外)!否则后果……

就先研究这么多,我要去复习了:http://blog.csdn.net/Zn_Hua/article/details/53437724

参考:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: