ホームページ > バックエンド開発 > C++ > scanf() は C 入力速度で常に iostream よりも優れていますか?

scanf() は C 入力速度で常に iostream よりも優れていますか?

Patricia Arquette
リリース: 2024-11-19 11:13:02
オリジナル
410 人が閲覧しました

Does scanf() Always Outperform iostream in C   Input Speed?

C のパフォーマンスで scanf() は iostream を上回ることができますか?

scanf() は C の cin よりも高速な入力処理を提供するという概念が生まれました。プログラマの間での議論。この記事では、これらの方法間のパフォーマンスの比較を掘り下げ、証拠を調べて詳細な説明を提供します。

パフォーマンス テスト

パフォーマンスの違いを評価するために、簡単なプログラムを作成しました。標準入力から数値のリストを読み取り、それらに対して XOR 演算を実行する関数が作成されます。 cin と scanf() は両方とも別々の実装で使用されました:

  • cin バージョン:
#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;
}
ログイン後にコピー

結果

3,300 万を超える乱数を含むファイルを使用して、実行時間を測定しました:

  • cin バージョン: 24.3秒
  • scanf バージョン: 6.4 秒

最適化に関する考慮事項

コンパイラの最適化設定を変更しても、結果への影響は最小限でした。

拡張された iostreamパフォーマンス

パフォーマンスのギャップの一部は、iostream が C I/O 関数との同期を維持していることに起因することが判明しました。コマンド std::ios::sync_with_stdio(false) でこの同期を無効にすることで、iostream のパフォーマンスが大幅に向上しました。

#include <iostream>

int main() {
  int parity = 0;
  int x;

  std::ios::sync_with_stdio(false);

  while (std::cin >> x)
    parity ^= x;
  std::cout << parity << std::endl;

  return 0;
}
ログイン後にコピー

新しい結果

iostream を無効にした後同期:

  • cin 同期ありのバージョン: 21.9 秒
  • scanf バージョン: 6.8 秒
  • cin 同期なしのバージョン: 5.5秒

結論

証拠は、C での生の入力処理では scanf() が cin よりも実際に高速であることを示唆しています。ただし、iostream の同期が無効になっている場合は、iostream が優れた選択肢となり、scanf() と最適化された cin バージョンの両方よりも優れたパフォーマンスを発揮します。

したがって、特定のシナリオでは scanf() の方が高速である可能性がありますが、iostream は同期をより適切に制御できます。そしてさらに幅広い機能性。速度が重要な場合は、iostream 同期を無効にすることをお勧めします。

以上がscanf() は C 入力速度で常に iostream よりも優れていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート