C では標準入力からの行の読み取りが Python よりも遅いのはなぜですか?
背景:
C を使用して標準入力から文字列入力の行を読み取ると、Python よりも大幅に遅くなる可能性があります 同等。この不一致は、より多くのシステム コールを必要とする C のデフォルト設定が原因で発生します。
入力ストリームのデフォルト動作:
デフォルトでは、C 入力ストリーム cin は、標準 C I/O ライブラリ (stdio)。この同期により、入力がバッファリングされず、一度に 1 文字ずつ読み取られることが保証されます。この動作により、cin ストリームと stdio 関数間の競合が防止されますが、パフォーマンス上のペナルティも発生します。
システム コールの使用:
cin が stdio と同期している場合、文字が読み取られるたびに、コストのかかる操作であるシステム コールがトリガーされます。このオーバーヘッドにより、特に大量のデータを読み取る場合、入力プロセスが大幅に遅くなります。
解決策:
C での行読み取りのパフォーマンスを向上させるには、 cin と stdio の間の同期。これは、sync_with_stdio(false) メソッドを呼び出すことで実現できます。
また、getline の代わりに fgets 関数を使用しても、同期オーバーヘッドを回避できます。
パフォーマンスの比較:
オリジナルとのパフォーマンス比較は次のとおりです。 (同期) C 実装とさまざまなアプローチ:
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 a fair comparison) | 54,644,808 |
結論:
cin と stdio の間の同期を無効にするか、fget を使用すると、ライン読み取りのパフォーマンスが大幅に向上します。 C では、Python の効率と同等になります。
以上がC の `cin` は、標準入力からの行の読み取りが Python よりも大幅に遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。