输入输出速度统计
在学校电脑上跑的文件输入输出。
输出:
测试壹:输出1e6内数字,空格隔开,printf VS cout
1.
freopen("1.txt","w",stdout); for(int i=1;i<=1000000;i++){//1e6 printf("%d ",i); }
测试①:2.82
测试②:2.777
测试③:2.847
测试④:2.887
测试⑤:2.797
平均值:2.8256
2.
freopen("1.txt","w",stdout); for(int i=1;i<=1000000;i++){ cout<<i<<' '; }
测试①:0.1969
测试②:0.3226
测试③:0.2028
测试④:0.2309
测试⑤:0.1986
平均值:0.23036
小总结:出乎意料……我没关stdout的同步啊,咋快这么多……
测试贰:printf VS cout ,输出1e6内数字,回车隔开
1.
freopen("1.txt","w",stdout); for(int i=1;i<=1000000;i++){ printf("%d\n",i); }
测试①:3.073
测试②:2.886
测试③:2.818
测试④:3.145
测试⑤:2.905
平均值:2.9654 小对比:空格和回车对于printf来说变化不大,毕竟只是格式化输出,原理一样。
2.endl换行
freopen("1.txt","w",stdout); for(int i=1;i<=1000000;i++){ cout<<i<<endl; }
测试①:3.565
测试②:3.382
测试③:3.568
测试④:3.353
测试⑤:3.458
平均值:3.4652
3.‘\n’换行
freopen("1.txt","w",stdout); for(int i=1;i<=1000000;i++){ cout<<i<<'\n'; }
测试①:0.1914
测试②:0.1903
测试③:0.1917
测试④:0.188
测试⑤:0.1872
平均值:0.18972
小总结:怎样,惊不惊喜,在未关stdout同步流下,<<'\n'的 cout 仍然比 printf 快,但是 <<endl 却要慢好多……以前我一直以为<<endl与<<‘\n’一样……
那么,cout<<endl慢在哪里呢?
进入c++库里看一眼(虽然看不懂)可以看出来endl是一个函数模板,在函数中输出了'\n',与情理上来说调用一次函数确实要比只输出一个字符要慢。
再搜一下百度百科,endl的作用为:
1.将换行符写入输出流,并将与设备关联的缓冲区的内容刷到设备中,保证目前为止程序所暂存的所有输出都真正写入输出流。
2.清空输出缓冲区。
好吧(这就涉及到我的知识盲区了),endl确实干了许多事情,但其实只有下划线部分才是我们必须的,缓冲区的问题我们一会再说。
由此可见,以后别乱用 endl ……这会使你的输出效率降低。
测试叁:cout 开关毕同步流 输出1e7 ,空格隔开
1.
freopen("1.txt","w",stdout); for(int i=1;i<=10000000;i++){ cout<<i<<' '; }
测试①:2.269
测试②:1.822
测试③:2.413
测试④:2.247
测试⑤:2.624
平均值:2.275 (我另外多跑了几次,发现好不稳定,最慢能到3.6,最快能到1.8,这个数据也算比较适中了)
2.
ios::sync_with_stdio(false); freopen("1.txt","w",stdout); for(int i=1;i<=10000000;i++){ cout<<i<<' '; }
测试①:2.594
测试②:2.635
测试③:2.122
测试④:2.398
测试⑤:2.067
平均值:2.3632 (这个波动也不小)
小总结:??为什么开关同步流输出一样快?
好像这个同步流只跟读入输出放一起的时候才比较明显?