在 C 中使用 scanf() :它比 cin 更快嗎?
在 C 中,人們普遍認為使用 cin 和 cout 進行輸入並且輸出比使用 printf 和 scanf 慢得多。這源自於這樣的假設:scanf() 針對 C 進行了最佳化,而 cin 和 cout 是使用速度較慢的標準 I/O 函數實現的。
基準測試結果
為了確定這一說法是否成立,我們進行了一個簡單的基準測試,其中涉及一個程序,該程序從標準輸入中讀取數字列表並計算它們的異或。程式是使用iostream 和scanf 版本實現的:
iostream 版本:
#include <iostream> int main() { int parity = 0; int x; while (std::cin >> x) parity ^= x; std::cout << parity << std::endl; return 0; }
scanf 版本:
#include <stdio.h> int main() { int parity = 0; int x; while (1 == scanf("%d", &x)) parity ^= x; printf("%d\n", parity); return 0; }
scanf 版本:
當使用超過3300萬個隨機數的大型資料集進行測試時,scanf 版本在6.4 秒,而 iostream 版本則花了令人失望的 24.3 秒。
最佳化影響編譯器最佳化設定並未對結果產生顯著影響。這表明速度差異主要是由於 scanf() 和 cin/cout 實現的固有差異所造成的。
罪魁禍首:std::ios::sync_with_stdiostd::ios::sync_with_stdio(false);進一步調查顯示,iostream I/O 函數與 C I/O 函數保持同步。預設情況下,此同步涉及在每次輸入操作後刷新輸出緩衝區,從而導致效能降低。
停用同步
幸運的是,可以透過呼叫std 來停用此同步::ios::sync_with_stdio(false):停用同步後,效能iostream 版本的速度顯著提高,僅需5.5 秒即可完成。
C iostream 獲勝停用同步後,C iostream 成為此特定基準測試的更快選項。事實證明,std::cout 的內部同步是 iostream 效能降低的主要原因。 結論雖然在某些情況下使用scanf() 可以更快情況下,禁用std::ios::sync_with_stdio 可以使iostream 在許多情況下優於scanf,特別是在避免混合使用時stdio 和iostream 函數。以上是C 中的「scanf()」輸入真的比「cin」更快嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!