[筆記]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沒跑了。
對於咱們這種有強迫症、選擇恐懼症的,有兩個方法給你自由選擇也未必是個好事。不分分清楚心理難受哈哈。算法

相關文章
相關標籤/搜索