Python と比較した C での stdin からの行の読み取りのパフォーマンス ペナルティ
C で stdin からテキストの行を読み取ると、 C は、Python での同等の操作よりも大幅に遅くなります。このパフォーマンスの格差に対処するために、その原因を詳しく調べて、それを軽減するための解決策を提供しましょう。
C のデフォルト設定
デフォルトでは、 C の cin ストリームは次のとおりです。標準入出力 (stdio) と同期されるため、入力バッファリングが無効になります。これは、cin が一度に 1 文字の読み取りを実行するため、多数のシステム コールが発生し、パフォーマンスのボトルネックになることを意味します。
Python の最適化された入力処理
対照的に、Python は入力をチャンクにバッファリングする最適化された入力処理メカニズムを採用し、システムコールを削減し、改善します
C 読み取りパフォーマンスの向上
C の読み取りパフォーマンスを向上させるには、次の 2 つのアプローチを採用できます。
cin の同期を無効にするstdio:
std::cin.sync_with_stdio(false);
代わりに fgets を使用します:
char buffer[1024]; while (fgets(buffer, sizeof(buffer), stdin)) { // process line }
の比較アプローチ
次の表は、さまざまな実装のパフォーマンスを比較しています。
Implementation | Lines per Second |
---|---|
Python (default) | 3,571,428 |
cin (default/naive) | 819,672 |
cin (no sync) | 12,500,000 |
fgets | 14,285,714 |
wc (not fair comparison) | 54,644,808 |
明らかなように、cin 同期を無効にするか fgets を使用すると、C のパフォーマンスが大幅に向上し、Python と同等になります。標準入力からの行の読み取りに関して。
以上がC では stdin からの行の読み取りが Python よりも遅いのはなぜですか?どうすれば改善できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。