名前を削って「今日からお前の名前は~だ」を生成するC#のプログラムを高速化する方法を検討している記事がある。
これにもう一つアプローチを加えてみたい。
文字列をたくさん連結する場合は、一般にStringBuilderを使うのがよいとされているが、一つの式で+でつなぐことができるならそうしたほうが速い。そうすると、+でつないだ文字列をすべて配列に格納してString.Concat
を一回呼ぶコードが吐かれるからだ。
[Benchmark]
public string ConcatWorkstyle()
{
var newName = Name[1];
return "契約書だよ。そこに名前を書きな。\r\nフン。" + Name + "というのかい。贅沢な名だねぇ。\r\n今からお前の名前は" +
newName + "だ。いいかい、" + newName + "だよ。分かったら返事をするんだ、" + newName + "!!";
}
ベンチマークは.NET Core 3.1 on AMD Ryzen 7 3800Xで。それでもZStringが最速なので、使える場合はZStringを使うべきかと。
| Method | Mean | Error | StdDev |
|--------------------- |----------:|---------:|---------:|
| TraditionalWorkstyle | 455.32 ns | 6.832 ns | 6.391 ns |
| NewWorkstyle | 194.72 ns | 3.654 ns | 4.751 ns |
| AnotherWorkstyle | 284.55 ns | 5.091 ns | 4.762 ns |
| ZStringWorkstyle | 97.90 ns | 1.102 ns | 1.031 ns |
| ConcatWorkstyle | 101.58 ns | 1.525 ns | 1.427 ns |