中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

StringBuilderを最適化してみる

StringBuilderを最適化してみる

StringBuilderみんな使ってますよね。Stringの連結2,3回以上するなら、こっち使いますよね。

でこのSBを速くするにはどうしたらいいかといろいろやってみました。

どノーマル。Length=0して使いまわす、Capacityをどかんと増やす。

はっきり言ってどれも数字があんまかわらんとです。

正直がっかり。

結局小手先でいろいろやってもAppendの遅さで芥子粒みたいな効果しか上がらないです。

ほかにはAppendFormatするか、Appendをいっぱいやってフォーマットするかも試してみました

AppendFormatで"{0} + {1} = {2}"とつなぐか、5回に分けてAppendするかです。

これはやく倍91:55でAppendFormatの勝ち(環境や与えるテストデータによって大きく変わる可能性があるので、イメージでとらえてください)

投稿日時 : 2007年2月8日 11:14

コメントを追加

# re: StringBuilderを最適化してみる 2007/02/08 17:10 R・田中一郎

>正直がっかり。

しかし、変わらないという情報が得られたことも、とてもありがたいのです。

>これはやく倍91:55でAppendFormatの勝ち

これは何となく AppendFormat の方が速そうだな、というのはわかるのですが、結構違いがでるものなのですね。

# re: StringBuilderを最適化してみる 2007/02/08 17:22 ぽぴ王子

意訳(ぉぃ)
Append × 5 だと Append 1回あたりの処理が遅いので結構時間がかかる
AppendFormat だと、Format してから Append するので、Append が遅くても
Format でまとめてしまえばかなり速くなる

ということですね。

Append("1" + " + " + "1" + " = " + "2");

なんてやると、Append が遅いばかりか文字列連結の部分でめっさ遅くなるので
よい子は真似をしないようにね!ってことでしょうか。

# re: StringBuilderを最適化してみる 2007/02/09 17:32 刈歩 菜良

そだよね。

+ でつなぐと結局String型で連結してるからStringBuilderの意味なくなっちゃうもんね。

# 未読フィード とうとう1,000超えちまった。こんな細かい突込みしかできないわたくしを許して。
# いつ自分の記事を書けるのやら...
(T_T)

# re: StringBuilderを最適化してみる 2007/02/10 13:44 データ

> Append("1" + " + " + "1" + " = " + "2");

静的な文字列の連結は、コンパイル時に行われますけど。

# re: StringBuilderを最適化してみる 2007/02/10 14:04 データ

StringBuilderのctorで与えるcapacityをいかに適切に指定するかが重要だと思いますが、その点が評価として抜けていますよね。

実際どういう実装しているかは知りませんが、AppendFormatで、まず最初に可変引数を文字列に変換すれば長さがわかるので、必要なバッファサイズに一回でリアロケートできます。
これに対して、Appendを繰り返せば、リアロケートを繰り返すことになり、結果として遅くなります。

capacityの既定値は16なので、実験ではおそらくリアロケートは発生しているのではないでしょうか?


あと、
StringBuilderを使いまわすというのは、実験計測すると大して変わらないでしょうが、GCというとてつもなく高コストな処理のことを考慮すると、使用頻度が高い(テキスト処理が多い場合)全体ではかなり効果はあると思います。

タイトル
名前
URL
コメント