W3 school 菜鸟教程 我要自学网 信息学奥赛NOI 花哥的博客 不逼自己一把,怎知自己有多优秀——校长语录

关于scanf和cin的大数据读入效率

关于scanf和cin的大数据读入效率
   好多大佬都说scanf的读入效率比cin高,我也当练手,用书上的程序作了个测试,程序如下:
(randnum.in文件中放有1KW个4位整数)
#include<iostream>
#include<ctime>
#include<cstdio>
#include<windows.h>
using namespace std;
const int num=10000000;
int main(){
freopen("randnum.in","r",stdin);
int i,n,start,end;
start=clock();
for(int i=0;i<num-2;i++)scanf("%d",&n);
end=clock();
cout<<double(end-start)/CLOCKS_PER_SEC<<endl;
freopen("randnum.in","r",stdin);
//ios::sync_with_stdio(false);关闭cin的同步
start=clock();
for(int i=0;i<num-2;i++)cin>>n;
end=clock();
cout<<double(end-start)/CLOCKS_PER_SEC<<endl;
return 0;
}

 结果如下:
4.793
6.019
再测试一次,结果如下:
4.793
5.976
基本可以认定,在默认情况(保持cin输入同步),scanf效率比cin稍高。
然后我关闭cin的同步,执行"ios::sync_with_stdio(false);关闭cin的同步”,再测试
结果如下:
4.768
1 .235
再测试一次,结果如下:
4.743
1.229  
基本可以认定,在取消cin输入同步,cin效率比scanf高很多。

  个人结论:在保持cin读入同步的情况下(默认设置),scanf的效率比cin高20%左右,关闭同步的情况下,cin比scanf的效率高285%,测试数据均为4位整数。
测试次数有限,如有不符,请指正。
 
温馨提示:
1、ios::sync_with_stdio(false)是关闭输入同步,对输出基本没效果。在同等情况下,printf比cout输出效率更高。一个示例是一本通网站1205汉诺塔问题,如果用cout超时1-2个点,如果用printf能AC。
2、在关闭cin输入同步的情况下,请不要与scanf等C的输入方法混用,否则适得其反。

(本机软件硬件信息如下,C++环境为dev c++5.11 TDM GCC 4.9.2)
CPU:双核i5-7500 3.41 3.40  内存:8G  系统:64位win10
posted @ 2019-02-19 20:03  耍人  阅读(647)  评论(0编辑  收藏  举报