C++ 的 cin/cout 爲什麼比 C 語言的 scanf/printf 慢

爲什麼c的scanf(printf)比c++的快。

網上說加上std::ios::sync_with_stdio(false);就差不多了。

做個簡單測試:

#include<iostream>
#include<fstream>
#include<time.h>
#include<stdio.h>
#define num 1000000


int main()
{

        //新建一個data.txt文件,保存隨機數
ofstream file("data.txt");
for(int i=0;i<num;i++)
{
file<<rand()<<' ';
if((i+1)%20==0)
file<<endl;
}
file.close();

        //直接使用cin
int temp;
double start,end;
freopen("data.txt","r",stdin);
start=clock();
for(int i=0;i<num;i++)
{
std::cin>>temp;
}
end=clock();
fclose(stdin);
std::cout<<"直接使用cin耗時爲:"<<(end-start)/CLOCKS_PER_SEC<<std::endl;

        //用scanf
std::cout<<"\n"<<"\n"<<"\n"<<"\n";
freopen("data.txt","r",stdin);
start=clock();
for(int i=0;i<num;i++)
{
scanf("%d",&temp);
}
end=clock();
fclose(stdin);
std::cout<<"用scanf耗時爲:"<<(end-start)/CLOCKS_PER_SEC<<std::endl;

        //關閉同步後,cin
freopen("data.txt","r",stdin);
std::ios::sync_with_stdio(false);  
start=clock();
for(int i=0;i<num;i++)
std::cin>>temp;//>>temp;
end=clock();
fclose(stdin);
std::cout<<"關閉同步後,cin耗時爲:"<<(end-start)/CLOCKS_PER_SEC<<std::endl;

return 0;
}


結果使用std::ios::sync_with_stdio(false);  並沒有加速,不知道爲什麼,但是使用scanf,確實比cin快得多。

比較合理的解釋:默認情況,cin與stdin總是保持同步的,也就是說這兩種方法可以混用,而不必擔心文件指針混亂,同時cout和stdout也一樣,兩者混用不會輸 出順序錯亂。正因爲這個兼容性的特性,導致cin有許多額外的開銷,如何禁用這個特性呢?只需一個語句 std::ios::sync_with_stdio(false);,這樣就可以取消cin於stdin的同步了,此時的cin就與scanf差不多 了。

另一種解釋: cout在輸出時總是要先將輸出的存入緩存區。而printf直接調用系統進行IO,它是非緩存的。所以cout比printf慢。(這種解釋,我沒有驗證)

scanf是格式化輸入,printf是格式化輸出。

cin是輸入流,cout是輸出流。效率稍低,但書寫簡便。

格式化輸出效率比較高,但是寫代碼麻煩。

流輸出操作效率稍低,但書寫簡便。

cout之所以效率低,是先把要輸出的東西存入緩衝區,再輸出,導致效率降低。


特別注意:關閉後C++ IO與C IO不能混用,cin不能與scanf,sscanf, getchar, fgets等混用,cout不能與printf,puts等混用,否則IO會混亂。

換行時將endl換成“\n”也可以加速!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章