提示された質問を調査していました。文字列を入力として受け取り、文字間にスペースを含む文字列を返す関数を作成する方法。この関数は、1 秒間に何千回も呼び出されたときにパフォーマンスを最適化するように作成されます。
.net には という関数が
String.Join
あり、元の文字列と共にスペース文字を区切り文字として渡すことができることを知っています。を使用しない
String.Join
限り、StringBuilder
クラスを使用して各文字の後にスペースを追加できます。このタスクを達成する別の方法は、2*n-1 文字で文字配列を宣言することです (スペースには n-1 文字を追加する必要があります)。文字配列は、ループで埋めてから String に渡すことができます
constructor
。
私は、これらの各アルゴリズムをパラメーターを使用してそれぞれ 100 万回"Hello, World"
実行し、実行にかかる時間を測定する .net コードを作成しました。方法 (3) は、(1) または (2) よりもはるかに高速です。
(3) は、ガベージ コレクションの対象となる追加の文字列参照を作成しないため、非常に高速であることはわかっていますが、 のような組み込みの .net 関数を使用すると、String.Join
パフォーマンスが向上するはずです。String.Join
手動で作業を行うよりも、使用が非常に遅いのはなぜですか?
public static class TestClass
{
// 491 milliseconds for 1 million iterations
public static string Space1(string s)
{
return string.Join(" ", s.AsEnumerable());
}
//190 milliseconds for 1 million iterations
public static string Space2(string s)
{
if (s.Length < 2)
return s;
StringBuilder sb = new StringBuilder();
sb.Append(s[0]);
for (int i = 1; i < s.Length; i++)
{
sb.Append(' ');
sb.Append(s[i]);
}
return sb.ToString();
}
// 50 milliseconds for 1 million iterations
public static string Space3(string s)
{
if (s.Length < 2)
return s;
char[] array = new char[s.Length * 2 - 1];
array[0] = s[0];
for (int i = 1; i < s.Length; i++)
{
array[2*i-1] = ' ';
array[2*i] = s[i];
}
return new string(array);
}
更新:プロジェクトを「リリース」モードに変更し、それに応じて質問の経過時間を更新しました。