您的位置:首页 > 编程语言 > C语言/C++

讨论C++的cin/cout与C的scanf/printf

2017-07-24 19:13 651 查看

前言:

  在中国台湾省网友的一篇博客里注意到了这个point,在这里Mark一下给更多人看到。

  详细论证过程我就不贴了,直接上结果和简化的过程吧。

对于
cin

  在Ubuntu 14.04笔电环境中对一个档案写入1e7的random整数,这裡的程式码都是简化的code。

for(int i = 0; i < (int)1e7; i++){
printf("%d\n",rand());
}
// vs
for(int i = 0; i < (int)1e7; i++){
cout<<rand()<<endl;
}


实验三次,printf的时间是:

1.760 s


2.677 s


1.865 s


cout:

15.921 s


15.188 s


15.685 s


优化:

  在
main()
函数中加上一行
ios_base::sync_with_stdio(false);
并将
endl
换成
'\n'


ios_base::sync_with_stdio(false);
for(int i = 0; i < (int)1e7; i++){
cout<<rand()<<'\n';
}


结果:

2.765 s


1.708 s


1.713 s


  去掉一些误差之后,可以看作是和
printf
相等。

对于
cout

吃一些数字进来,然后再输出:

for(int i = 0; i < (int)1e7; i++){
scanf("%d\n",&a);
printf("%d\n",a+1); //output a+1;
}
// vs
for(int i = 0; i < (int)1e7; i++){
cin>>a;
cout<<a+1<<endl;
}


scanf/printf的时间:

2.579 s


3.994 s


3.241 s


而cin/cout:

19.970 s


优化:

  加上一行
cin.tie(0);
同时再包含对
cin
的优化。

ios_base::sync_with_stdio(false);
cin.tie(0);
for(int i = 0; i < (int)1e7; i++){
cin>>a;
cout<<a+1<<'\n';
}


于是有:

2.956 s


2.889 s


3.509 s


  可以说是和scanf和printf差不多了。

总结:

  在
main
函数里加上下面的代码并把endl换成
'\n'
就可以得到如上优化结果。

ios_base::sync_with_stdio(false);
cin.tie(nullptr);


  除此之外,事实上,当把数字范围放大到1e8的时候:

scanf/printf:

30.722 s


29.428 s


cin/cout:

27.052 s


27.097 s


  可以看到,cin/cout的表现已经比scanf/printf好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息