kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

.NET Framework 4でのString.Joinの実装変更

昨日書いたStringBuilder遅いよという話(id:kkamegawa:20120814:p1)。会社でちょっとしてみたら、あれ、.NET 3.5ではそんなことなかったのにみたいな話を聞きました。ちょうど今日昨日のblog元ネタのYuanさんがStringBuilderとString.Joinでどのくらい差が出るかという記事を書いていたので、それを.NET 4と.NET 3.5で比べてみました。
Performance Tips: Faster than StringBuilder? - Feng Yuan (袁峰) - Site Home - MSDN Blogs
YuanさんのエントリではSystem.Diagnostics.StopWatch.Restart()を使っていますが、Restart()は.NET 4からのメソッドなので、Reset()/Start()に変えています。こんな感じね。

var watch = new Stopwatch();
//(略)
watch.Reset();
watch.Start();
for (int i = 0; i < Loops; i++) sDest += sSource;
watch.Stop();
Console.WriteLine("Concatenation took {0,8:N3} ms. {1} chars", watch.Elapsed.TotalMilliseconds, sDest.Length);

実行環境:

.NET 3.5のプロジェクトで実行した場合、StringBuilderがこの例では少しですが速いです。

対して、.NET 4のプロジェクトではString.Joinのほうが速いです。

サポート情報にもKB306822なんて載っていますけど、実装がどんどん変わっているので気を付けないといけませんね。ちょうど今日からMSDNVisual Studio 2012が公開されて、ソースコードも公開されているので、興味のある方はソースを見てもいいのではないでしょうか。
上記のオリジナルのblogのコメントでも「昔はString.JoinでStringBuilder使っていたけど、今のソースでは使ってないんだよ」みたいなことを書いてますね。