From:http://www.cnblogs.com/killerlegend/p/3918452.html
Author:KillerLegend
Date:2014.8.17
杭電OJ之3233很簡單的一個問題,誰知道一直提示我超時,超時,最後都快哭了,C++代碼如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int t,tmp,band,index=0;
while(cin>>t>>tmp>>band)
{
if(t==0||tmp==0||band==0) break;
double a,b,sum=0.0;
for(int i=0;i<t;++i)
{
cin>>a>>b;
sum+=a*(100-b)*0.01;
}
cout<<"Case "<<++index<<": "<<fixed<<setprecision(2)<<sum/band<<endl<<endl;
}
return 0;
}
後來...將輸入輸出流換成了scanf和printf,結果就神奇的AC了...
#include <cstdio>
int main()
{
int t,tmp,band,index=0;
while(scanf("%d%d%d",&t,&tmp,&band))
{
if(t==0||tmp==0||band==0) break;
double a,b,sum=0.0;
for(int i=0;i<t;++i)
{
scanf("%lf%lf",&a,&b);
sum+=a*(100-b)*0.01;
}
printf("Case %d: %.2f\n\n",++index,sum/band);
}
return 0;
}
這真是太讓人傷心了...所以我打算測試一下cin和scanf,cout和printf:
cout測試:
#include <iostream>
#include <cstdio>
#include <time.h>
using namespace std;
int main()
{
freopen("in.conf","r",stdin);
freopen("out.conf","w",stdout);
clock_t t1,t2,t3,t4;
t1 = clock();
for(int i=0;i<10000000;++i)cout<<i<<" ";
t2 = clock();
cout<<"cin-time:"<<(double)(t2-t1)/CLOCKS_PER_SEC<<endl;
return 0;
}
結果:5.206s
printf測試:
#include <iostream>
#include <cstdio>
#include <time.h>
using namespace std;
int main()
{
freopen("in.conf","r",stdin);
freopen("out.conf","w",stdout);
clock_t t1,t2,t3,t4;
t1 = clock();
for(int i=0;i<10000000;++i)printf("%d ",i);
t2 = clock();
cout<<"cin-time:"<<(double)(t2-t1)/CLOCKS_PER_SEC<<endl;
return 0;
}
結果:6.202s
我們使用上面循環1千萬次所產生的數據(78.89MB),用於下面讀入時的測試數據:
使用cin讀入:
#include <iostream>
#include <cstdio>
#include <time.h>
using namespace std;
int main()
{
freopen("out.conf","r",stdin);
freopen("in.conf","w",stdout);
clock_t t1,t2,t3,t4;
t1 = clock();
int k;
for(int i=0;i<10000000;++i)cin>>k;
t2 = clock();
cout<<"cin-time:"<<(double)(t2-t1)/CLOCKS_PER_SEC<<endl;
return 0;
}
結果是38.507s
使用scanf讀入:
#include <iostream>
#include <cstdio>
#include <time.h>
using namespace std;
int main()
{
freopen("out.conf","r",stdin);
freopen("in.conf","w",stdout);
clock_t t1,t2,t3,t4;
t1 = clock();
int k;
for(int i=0;i<10000000;++i)scanf("%d",&k);
t2 = clock();
cout<<"cin-time:"<<(double)(t2-t1)/CLOCKS_PER_SEC<<endl;
return 0;
}
結果是4.204s
結果一覽表:

結論:輸出時盡量使用cout,輸入時盡量使用scanf.
主要有以下幾個原因:
1.流輸入輸出對於基本類型來說使用很方便,不用手寫格式控制字符串。
2.對於標准庫的一些class來說,顯然重載操作符也比自己寫格式控制字符串要方便很多。
3.對於復雜的格式可以進行自定義操作符。
4.可讀性更好(這個很多人有不同意見,見仁見智了)。
其實原理上來說流操作的效率比printf/scanf函數族更高,因為是在編譯期確定操作數類型和調用的輸出函數,不用在運行期解析格式控制字符串帶來額外開銷。不過標准流對象cin/cout為了普適性,繼承體系很復雜,所以在對象的構造等方面會影響效率,因此總體效率比較低。如果根據特定的場景進行優化,效率可以更高一點。
====
[原創回答團]
參考資料:原創
十分正確,如果你是做io比賽的或者是做acm的,盡量不要用cin,cout,你試試打印99999999就知道,它們之間速度大概相差10幾倍