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”也可以加速!

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