関数型プログラミングを始めて、クラス/プロパティをいつ変更可能にするべきかを理解しようとしています。
多数の文字列連結を処理する場合、たとえば次のようにStringBuilderを使用する方がよいことがわかります。
using System;
using System.Diagnostics;
using System.Text;
namespace ConsoleApplication3
{
internal class Program
{
private static string myStr;
private static readonly StringBuilder mySb = new StringBuilder();
private static void Main(string[] args)
{
Profile("+", 100000, () => myStr = myStr + "a"); // Takes 2236 ms
Profile("SB", 100000, () => mySb.Append("a")); // Takes 1 ms
}
private static void Profile(string description, int iterations, Action func)
{
// clean up
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
// warm up
func();
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
}
}
これは一般的に知られているケースであり、演算子を介して文字列を連結する方がはるかにパフォーマンスが高くなります。私の想定では、作成する文字列の数を減らすことでパフォーマンスが向上します。StringBuilder
+
StringBuilder
パフォーマンスと不変性のバランスはありますか、それともこの場合は何らかの理由で例外ですか?