C++ 的 cin/cout 為什麼比 C 語言的 scanf/printf 慢

發表於2016-11-27

很早就知道,c的scanf(printf)比c++的快。刷題時尤其明顯,在這上面超時是常有的事兒。

但,這是別人告訴我的,c快。

為什麼快?

從網上借鑑一個例子做個簡單測試:

1.cpp     //向一個檔案裡輸入1000000個隨機數

2.cpp         //用cin讀取這1000000個隨機數

結果: 耗時  5.281秒

3.cpp       //用scanf讀取這1000000個數

結果: 耗時 0.437秒

結論:scanf真的比cin快。竟快10倍。

執行環境,xp,DEV-C++。

比較合理的解釋:預設情況,cin與stdin總是保持同步的,也就是說這兩種方法可以混用,而不必擔心檔案指標混亂,同時cout和stdout也一樣,兩者混用不會輸 出順序錯亂。正因為這個相容性的特性,導致cin有許多額外的開銷,如何禁用這個特性呢?只需一個語句 std::ios::sync_with_stdio(false);,這樣就可以取消cin於stdin的同步了,此時的cin就與scanf差不多 了。

另一種解釋: cout在輸出時總是要先將輸出的存入快取區。而printf直接呼叫系統進行IO,它是非快取的。所以cout比printf慢。(這種解釋,我沒有驗證)

scanf是格式化輸入,printf是格式化輸出。

cin是輸入流,cout是輸出流。效率稍低,但書寫簡便。

格式化輸出效率比較高,但是寫程式碼麻煩。

流輸出操作效率稍低,但書寫簡便。

cout之所以效率低,正如一樓所說,是先把要輸出的東西存入緩衝區,再輸出,導致效率降低。

相關文章