掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
std::stringstreamのwrite(buf, 1000000)が遅いです (ID:67403)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
以下のソースを、最適化オプション /Ox /G6 を付けたVC++6SP6でコンパイルして プロファイルを取ってみました。 # リリースモード時の速度を気にされていたようですので、最適化ありにしてみました。 #include <sstream> char g_bytes[1024 * 1024]; int main(int, char *[]) { std::stringstream ss; ss.write(g_bytes, sizeof(g_bytes)); return 0; } 結果(目立つところだけ; Pentium4 3.0GHzで30秒かかってます): 関数 関数+チィルド ヒット 時間 % 時間 % カウント 関数 ---------------------------------------------------- 1408.518 4.7 1408.518 4.7 32770 operator delete(void *) (delop.obj) 28824.382 95.3 30232.811 99.9 32768 std::basic_stringbuf<char,struct std::char_traits<char>,class std::allocator<char> >::overflow(int) (stringstream_write_test.obj) 見ての通り、stringbuf::overflow()とoperator delete()がやたらめったら 呼ばれています。 ソースを追い掛けてみたところ、stringbuf::overflow()は、バッファを一度に 32バイトしか増やさない様子。 つまり、1MB / 32B = 32768回だけバッファ再確保→コピー→旧バッファ開放なんて やっているという寸法。そりゃ遅くもなるわけで。 うまくアロケータを工夫すれば、メモリ確保/解放の回数は減らせそうな気はしますが、 コピーの回数は変わりませんね。 ちなみに、通るソースは別になりますが、επιστημηさんのコードで調べている string::reserve()も32バイト単位な模様。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.