前言:
在中国台湾省网友的一篇博客里注意到了这个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好了。