50:40のhttp://channel9.msdn.com/Events/GoingNative/2013/Cpp でのクイック コードの記述Andrei Alexandrescu は、istream がいかに非効率的/遅いかについて冗談を言っています。
以前、ostream が遅く、fwrite が大幅に高速化 (メイン ループを 1 回実行すると数秒短縮) するという問題がありましたが、その理由がわからず、調査もしませんでした。
C++ で istream と ostream が遅くなるのはなぜですか? または、少なくとも、同様にニーズを満たす他のもの (fread/fget、fwrite など) と比較して遅くなります。
ベストアンサー1
実際、IOStreamsは遅くなる必要はありません。ただし、高速化するには、適切な方法で実装する必要があります。ほとんどの標準C++ライブラリは、IOStreamsの実装にあまり注意を払っていないようです。ずっと前、私がCXXRTまだメンテナンスされていたため、正しく使用すれば stdio とほぼ同じくらい高速でした。
ただし、IOStreams を使用する場合、ユーザーにとってパフォーマンス上の問題がほとんどないことに注意してください。次のガイドラインはすべての IOStream 実装に適用されますが、特に高速化を目的として調整された実装に適用されます。
std::cin
、などを使用する場合は、std::cout
を呼び出す必要がありますstd::sync_with_stdio(false)
。この呼び出しがない場合、標準ストリーム オブジェクトを使用するには、C の標準ストリームと同期する必要があります。もちろん、 を使用する場合は、、などを混在std::sync_with_stdio(false)
させないことが前提となります。std::cin
stdin
std::cout
stdout
- するない使用
std::endl
バッファの不要なフラッシュを何度も実行することになるためです。同様に、不必要に設定しstd::ios_base::unitbuf
たり使用したりしないでくださいstd::flush
。 - 独自のストリーム バッファーを作成する場合 (ほとんどのユーザーはそうしませんが)、内部バッファーを使用するようにしてください。個々の文字を処理すると、複数の条件と
virtual
関数がジャンプするため、処理速度が著しく低下します。