天天看點

[親測]輸入方式比較

之前一直有用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

幸甚至哉,歌以詠志