昨日書いた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);
実行環境:
- Windows 7 x64 SP1
- Visual Studio 2010 SP1/.NET Framework 4.0.3入れた環境
- Core i7 965
.NET 3.5のプロジェクトで実行した場合、StringBuilderがこの例では少しですが速いです。
対して、.NET 4のプロジェクトではString.Joinのほうが速いです。
サポート情報にもKB306822なんて載っていますけど、実装がどんどん変わっているので気を付けないといけませんね。ちょうど今日からMSDNでVisual Studio 2012が公開されて、ソースコードも公開されているので、興味のある方はソースを見てもいいのではないでしょうか。
上記のオリジナルのblogのコメントでも「昔はString.JoinでStringBuilder使っていたけど、今のソースでは使ってないんだよ」みたいなことを書いてますね。