ホームページ  >  記事  >  バックエンド開発  >  `scanf()` は C の `cin` よりも本当に高速ですか? `cin` のパフォーマンスを最適化するにはどうすればよいですか?

`scanf()` は C の `cin` よりも本当に高速ですか? `cin` のパフォーマンスを最適化するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-18 11:29:02382ブラウズ

Is `scanf()` Really Faster Than `cin` in C  , and How Can We Optimize `cin`'s Performance?

C プログラムでの scanf() の使用は cin より速いですか?

入力の読み取り時に scanf() を使用した方が cin より速いという主張C にはある程度の真実があります。説明は次のとおりです:

速度ベンチマーク

この主張を検証するために、標準入力から数値のリストを読み取り、それらの排他的論理和を計算する簡単なテスト プログラムが作成されました ( XOR) 演算。プログラムの 2 つのバージョンがテストされました。1 つは iostream (cin と cout) を使用し、もう 1 つは stdio (scanf と printf) を使用しました。

大量の入力 (33,280,276 個の乱数) を使用してテストした場合、scanf バージョンiostream バージョンを大幅に上回り、24.3 秒と比較して 6.4 秒でタスクを完了しました。

速度の違いの理由

速度の違いは、iostream と C の I/O 関数の同期によって発生します。 iostream を使用した入出力操作は C I/O 関数 (getchar()、putchar() など) と同期され、追加のオーバーヘッドが発生します。

ios::sync_with_stdio(false)

この同期の問題に対処するには、 std::ios::sync_with_stdio(false) を使用すると、iostream と stdio の間の同期を無効にすることができます。これにより、iostream は同期のオーバーヘッドなしでより効率的に動作できるようになります。

同期を無効にした後、iostream バージョンのパフォーマンスが大幅に向上し、scanf バージョンよりも速い 5.5 秒でタスクを完了しました。

結論

ベンチマーク結果に基づいて、確かに、C プログラムで大量の入力を読み取る場合、scanf() は cin を使用するよりも高速です。ただし、std::ios::sync_with_stdio(false) の最適化により、iostream は scanf() よりもパフォーマンスが優れる可能性があるため、入出力操作には推奨される選択肢であると考えるべきです。

以上が`scanf()` は C の `cin` よりも本当に高速ですか? `cin` のパフォーマンスを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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