ホームページ  >  記事  >  バックエンド開発  >  C の `stdin` 行の読み取りが Python よりも大幅に遅いのはなぜですか?それを改善するにはどうすればよいですか?

C の `stdin` 行の読み取りが Python よりも大幅に遅いのはなぜですか?それを改善するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-25 03:17:15588ブラウズ

Why Is C  's `stdin` Line Reading Significantly Slower Than Python's, and How Can It Be Improved?

C では標準入力 (stdin) からの行の読み取りが Python よりも大幅に遅いのはなぜですか?

この記事では、標準入力 (stdin) から文字列データの行を読み取る理由を調査することを目的としています。 ) C を使用すると、一般に Python の対応物よりもはるかに遅くなります。まず、提供されたコードを調べて、潜在的な懸念領域を特定します。

C コード

string input_line;
long line_count = 0;
time_t start = time(NULL);
int sec;
int lps;

while (cin) {
    getline(cin, input_line);
    if (!cin.eof())
        line_count++;
}

このコードは、getline() を使用してテキスト行を読み取ります。 stdin を取得し、ファイル内の行数をカウントします。ただし、内部ループ内でファイルの各文字を一度に 1 つずつ読み取ります。このアプローチは非効率的であり、過剰なシステム コールが発生し、実行速度が遅くなります。

C ストリームのデフォルト設定

Python とは異なり、C ストリームには C スタイルの標準との同期を優先するデフォルト設定があります。入出力機能。この同期により、C ストリームと C ストリームの両方が入力リソースと出力リソースに一貫してアクセスできるようになります。ただし、この同期により、C ストリームがより効率的なバッファリング メカニズムを使用することもできなくなります。

cinstdio と同期されるため、入力バッファリングが回避されます。その結果、cin は一度に 1 文字だけを読み取るため、プロセスに時間がかかります。

パフォーマンスの向上

C コードのパフォーマンスを向上させるには、 cinstdio 間の同期を無効にすることができます。プログラムの先頭にステートメント cin.sync_with_stdio(false) を追加すると、C ストリームが I/O を個別にバッファリングできるようになり、速度が大幅に向上します。

代替案: fgets

の使用 パフォーマンスを向上させるもう 1 つの効果的なアプローチは、代わりに fgets() を使用することです。 getline() の。 fgets は、指定された数の文字を標準入力から文字配列に読み取り、バッファリング プロセスをより詳細に制御できる C 関数です。

ベンチマーク結果

パフォーマンスの違いを考慮して、1 億行を含むファイルがベンチマークに使用されました。元の (同期された) C コード、同期が無効になった C、および Python を使用した結果は次のとおりです。

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

C で同期を無効にすると大幅な改善が得られ、fgets を使用するとさらに優れたパフォーマンスが得られました。 wc の使用は、行数をカウントするために特別に設計されているため、公平な比較ではないことに注意することが重要です。

結論

C ストリームのデフォルト設定を理解し、実装することでストリーム同期の無効化や fgets の使用などの適切な最適化、行を読み取るための C コードのパフォーマンスstdin は劇的に改善され、対応する Python と同等か、それよりも高速になります。

以上がC の `stdin` 行の読み取りが Python よりも大幅に遅いのはなぜですか?それを改善するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。