C のパフォーマンスで scanf() は iostream を上回ることができますか?
scanf() は C の cin よりも高速な入力処理を提供するという概念が生まれました。プログラマの間での議論。この記事では、これらの方法間のパフォーマンスの比較を掘り下げ、証拠を調べて詳細な説明を提供します。
パフォーマンス テスト
パフォーマンスの違いを評価するために、簡単なプログラムを作成しました。標準入力から数値のリストを読み取り、それらに対して XOR 演算を実行する関数が作成されます。 cin と scanf() は両方とも別々の実装で使用されました:
#include <iostream> int main() { int parity = 0; int x; while (std::cin >> x) parity ^= x; std::cout << parity << std::endl; return 0; }
#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 万を超える乱数を含むファイルを使用して、実行時間を測定しました:
最適化に関する考慮事項
コンパイラの最適化設定を変更しても、結果への影響は最小限でした。
拡張された 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 を無効にした後同期:
結論
証拠は、C での生の入力処理では scanf() が cin よりも実際に高速であることを示唆しています。ただし、iostream の同期が無効になっている場合は、iostream が優れた選択肢となり、scanf() と最適化された cin バージョンの両方よりも優れたパフォーマンスを発揮します。
したがって、特定のシナリオでは scanf() の方が高速である可能性がありますが、iostream は同期をより適切に制御できます。そしてさらに幅広い機能性。速度が重要な場合は、iostream 同期を無効にすることをお勧めします。
以上がscanf() は C 入力速度で常に iostream よりも優れていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。