之前一直有用cin cout的習慣,因為不用管繁雜的格式。但是之前集訓時有一次一個題逾時了,怎麼改也改不對,這時才聽說cin比scanf耗時,改成scanf過了。從此再也不敢用cin了。直到後來又聽說ios::sync_with_stdio(false)可以關閉iostream和cstdio的同步以優化cin,後來又聽說還有一種叫快讀的東西……那麼這麼多輸入方式到底哪個快?今天親測一下。
字元串+int+字元混合讀入
這部分涉及字元和字元串,沒法快讀,隻比較scanf,cin以及優化cin。
測試資料:1000000個“abcdefg”,1000000個數字10000,1000000個‘c’。
代碼展示,以示公正。
1 /*scanf*/
2 #include<bits/stdc++.h>
3 using namespace std;
4 clock_t start,end;
5 int main(){
6 freopen("in.in","r",stdin);
7 freopen("scanf.out","w",stdout);
8 char s[7],c;int a;
9 start=clock();
10 for(int i=1;i<=1000000;i++) scanf("%s",s);
11 for(int i=1;i<=1000000;i++) scanf("%d",&a);
12 for(int i=1;i<=1000000;i++) scanf("%c",&c);
13 end=clock();
14 double endtime=(double)(end-start)/CLOCKS_PER_SEC;
15 cout<<"Total time:"<<endtime*1000<<"ms"<<endl; //ms為機關
16 return 0;
17 }
scanf
1 #include<bits/stdc++.h>
2 using namespace std;
3 clock_t start,end;
4 int main(){
5 freopen("in.in","r",stdin);
6 freopen("cin.out","w",stdout);
7 char s[7],c;int a;
8 start=clock();
9 for(int i=1;i<=1000000;i++) cin>>s;
10 for(int i=1;i<=1000000;i++) cin>>a;
11 for(int i=1;i<=1000000;i++) cin>>c;
12 end=clock();
13 double endtime=(double)(end-start)/CLOCKS_PER_SEC;
14 cout<<"Total time:"<<endtime*1000<<"ms"<<endl; //ms為機關
15 return 0;
16 }
cin
1 #include<bits/stdc++.h>
2 using namespace std;
3 clock_t start,end;
4 int main(){
5 ios::sync_with_stdio(false);
6 freopen("in.in","r",stdin);
7 freopen("優化cin.out","w",stdout);
8 char s[7],c;int a;
9 start=clock();
10 for(int i=1;i<=1000000;i++) cin>>s;
11 for(int i=1;i<=1000000;i++) cin>>a;
12 for(int i=1;i<=1000000;i++) cin>>c;
13 end=clock();
14 double endtime=(double)(end-start)/CLOCKS_PER_SEC;
15 cout<<"Total time:"<<endtime*1000<<"ms"<<endl; //ms為機關
16 return 0;
17 }
優化cin
測試結果:
scanf:Total time:2798ms
cin:Total time:4004ms
優化cin:Total time:892ms
第一:優化cin
第二:scanf
第三:cin
是以,這是優化cin的大勝利!
可以清晰地看出單純的cin是真的慢,而優化的cin比scanf還快不少,差距懸殊。
僅int讀入
僅int讀入,快讀加入戰鬥。
測試資料:5000000個數字10000 。
代碼展示,以示公正。
1 #include<bits/stdc++.h>
2 using namespace std;
3 clock_t start,end;
4 int main(){
5 freopen("in.in","r",stdin);
6 freopen("scanf.out","w",stdout);
7 int a;
8 start=clock();
9 for(int i=1;i<=5000000;i++) scanf("%d",&a);
10 end=clock();
11 double endtime=(double)(end-start)/CLOCKS_PER_SEC;
12 cout<<"Total time:"<<endtime*1000<<"ms"<<endl; //ms為機關
13 return 0;
14 }
scanf
1 #include<bits/stdc++.h>
2 using namespace std;
3 clock_t start,end;
4 int main(){
5 freopen("in.in","r",stdin);
6 freopen("cin.out","w",stdout);
7 int a;
8 start=clock();
9 for(int i=1;i<=5000000;i++) cin>>a;
10 end=clock();
11 double endtime=(double)(end-start)/CLOCKS_PER_SEC;
12 cout<<"Total time:"<<endtime*1000<<"ms"<<endl; //ms為機關
13 return 0;
14 }
cin
1 #include<bits/stdc++.h>
2 using namespace std;
3 clock_t start,end;
4 int main(){
5 ios::sync_with_stdio(false);
6 freopen("in.in","r",stdin);
7 freopen("優化cin.out","w",stdout);
8 int a;
9 start=clock();
10 for(int i=1;i<=5000000;i++) cin>>a;
11 end=clock();
12 double endtime=(double)(end-start)/CLOCKS_PER_SEC;
13 cout<<"Total time:"<<endtime*1000<<"ms"<<endl; //ms為機關
14 return 0;
15 }
優化cin
1 #include<bits/stdc++.h>
2 using namespace std;
3 inline int read(){
4 int s=0,w=1;
5 char ch=getchar();
6 while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
7 while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
8 return s*w;
9 }
10 clock_t start,end;
11 int main(){
12 ios::sync_with_stdio(false);
13 freopen("in.in","r",stdin);
14 freopen("快讀.out","w",stdout);
15 int a;
16 start=clock();
17 for(int i=1;i<=5000000;i++) a=read();
18 end=clock();
19 double endtime=(double)(end-start)/CLOCKS_PER_SEC;
20 cout<<"Total time:"<<endtime*1000<<"ms"<<endl; //ms為機關
21 return 0;
22 }
快讀
測試結果:
scanf:Total time:6632ms
cin:Total time:8627ms
優化cin:Total time:1748ms
快讀:2256
第一:優化cin
第二:快讀
第三:scanf
第四:cin
又是優化cin的大勝利!
可見優化cin和快讀的時間相差不多,正常的小資料應該看不出什麼差別,但這兩個甩了scanf和普通cin好多。
結語
兩次都是優化cin奪得第一。但是有幾個小提示:
1.cin确實友善,但輸出小數有位數要求的時候還是用scanf吧
2.使用優化cin的時候絕對不能再用scanf和printf,編譯能過,但是不管輸入什麼都直接RE
幸甚至哉,歌以詠志