[笔记]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:https://www.byvoid.com/blog/fast-readfile 。看完这篇基本就能够了解性能上的差别了,编译器占的因素蛮大的。那么关了同步的cin与scanf差很少,可是cin是新标准,更安全更便捷。何况string只能用cin。
而后是printf和cout:
对于cout和printf,则效率差别不明显。有人认为流更快有人认为printf快,逛论坛查询时看到他们都吵起来了。具体怎样我又找到一篇博文:http://www.cnblogs.com/killerlegend/p/3918452.html 。他的结论是:输出时尽可能使用cout,输入时尽可能使用scanf。不过我也测试了,试了点最简单的:html

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;
}

ios

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毕竟新标准,更安全适用面更广更灵活。c++

最后:
本文讨论的输入输出使用仅仅针对ACM作题。scanf的确快,拿来作题仍是很不错的。输入量少的话拿cin也毫无问题,刷个题目也不必特意跑过去关闭同步。并且cin更安全更便捷,还支持重载。且对于string与自定义的数据,就只能用cin、cout没跑了。
对于咱们这种有强迫症、选择恐惧症的,有两个方法给你自由选择也未必是个好事。不分分清楚心理难受哈哈。算法

相关文章
相关标签/搜索