首頁 >後端開發 >C++ >C 中的「scanf()」輸入真的比「cin」更快嗎?

C 中的「scanf()」輸入真的比「cin」更快嗎?

Linda Hamilton
Linda Hamilton原創
2024-11-23 10:38:111055瀏覽

Is `scanf()` in C   Really Faster Than `cin` for Input?

在 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_stdio

std::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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn