[笔记]cin、cout与scanf、printf的效率差异对⽐分析
之前上传UVa227 puzzle时,好不容易AC了,但发现⾃⼰⽤时50(ms),⽽在VJ上看到⼈家都是40ms、20ms,于是打开⼀个20ms的代码查看⼈家强在哪⾥。但结果研究了半天感觉差不多,于是想着应该不是算法的问题。然后⼜想到,⽹上提交的答案,⼤家都是⽤scanf和printf 写的,⽽我⽤的cin cout,⽽这题的确需要⼤量的输⼊输出,于是就想着把所有cin cout改成scanf printf。结果 —。—
上⾯c++版,下⾯c版。
于是我很好奇C的输⼊输出⽅法和C++提倡的⽅法为什么差距那么⼤。经过⼀番研究和查询,结果如下:
⾸先是scanf和cin:
cin之所以慢,主要是因为要与scanf同步的关系,即允许scanf与cin混⽤。但是如果你的代码⾥没⽤到scanf,那么想关闭同步也可以。
只要使⽤这⾏代码,就可关闭同步:std::ios::sync_with_stdio(false);
关闭同步后的cin效率⼤⼤提⾼。有⼈说⽐scanf还⾼,有⼈说差不多,⽹上评论不⼀。其实cin关闭同步后真正的效率如何还是依赖编译器。下⾯这篇博⽂很详尽地⽐较了cin和关闭同步的cin和scanf:。看完这篇
printf怎么读的基本就可以了解性能上的差异了,编译器占的因素蛮⼤的。那么关了同步的cin与scanf差不多,但是cin是新标准,更安全更便捷。况且string只能⽤cin。
然后是printf和cout:
对于cout和printf,则效率差异不明显。有⼈认为流更快有⼈认为printf快,逛论坛查询时看到他们都吵起来了。具体怎样我⼜到⼀篇博⽂:。他的结论是:输出时尽量使⽤cout,输⼊时尽量使⽤scanf。不过我也测试了,试了点最简单的:
int main()
{
clock_t a, b;
a = clock();
for (int i = 0;i < 29999;++i)
cout << i << '\n';
b = clock();
cout << b - a;
return 0;
}
int main()
{
clock_t a, b;
a = clock();
for (int i = 0;i < 29999;++i)
printf("%d\n",i);
b = clock();
printf("%d",b - a);
return 0;
}
结果是:cout⽤时6124,printf⽤时3536。cout⽐printf差了⼀倍不到。⽽且对于cout,那句“std::ios::sync_with_stdio(false);”其实是不起作⽤的,它只针对cin。于是我的结论与上⾯链接⾥的博⽂相反。
所以cout和printf效率可以说差不多,主要还是看编译器吧。使⽤时也不必纠结,只是cout毕竟新标准,更安全适⽤⾯更⼴更灵活。
最后:
本⽂讨论的输⼊输出使⽤仅仅针对ACM做题。scanf的确快,拿来做题还是很不错的。输⼊量少的话拿cin也毫⽆问题,刷个题⽬也没必要特地跑过去关闭同步。⽽且cin更安全更便捷,还⽀持重载。且对于string与⾃定义的数据,就只能⽤cin、cout没跑了。
对于我们这种有强迫症、选择恐惧症的,有两个⽅法给你⾃由选择也未必是个好事。不分分清楚⼼理难受哈哈。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。