Da es schwierig ist, eine Erklärung dafür zu finden, die weder von Meinungen beeinflusst noch von einem Kampf der Stolz gefolgt wird, habe ich mir überlegt, ein bisschen Code auf LINQpad zu schreiben, um dies selbst zu testen.
Ich fand heraus, dass die Verwendung kleiner Zeichenfolgen anstelle von i.ToString () die Antwortzeiten ändert (sichtbar in kleinen Schleifen).
Der Test verwendet verschiedene Iterationssequenzen, um Zeitmessungen in vernünftig vergleichbaren Bereichen zu halten.
Ich werde den Code am Ende kopieren, damit Sie ihn selbst ausprobieren können (results.Charts ... Dump () funktioniert außerhalb von LINQPad nicht).
Ausgabe (X-Achse: Anzahl der getesteten Iterationen, Y-Achse: Zeit in Ticks):
Iterationssequenz: 2, 3, 4, 5, 6, 7, 8, 9, 10
Iterationssequenz: 10, 20, 30, 40, 50, 60, 70, 80
Iterationssequenz: 100, 200, 300, 400, 500
Code (geschrieben mit LINQPad 5):
void Main()
{
Test(2, 3, 4, 5, 6, 7, 8, 9, 10);
Test(10, 20, 30, 40, 50, 60, 70, 80);
Test(100, 200, 300, 400, 500);
}
void Test(params int[] iterationsCounts)
{
$"Iterations sequence: {string.Join(", ", iterationsCounts)}".Dump();
int testStringLength = 10;
RandomStringGenerator.Setup(testStringLength);
var sw = new System.Diagnostics.Stopwatch();
var results = new Dictionary<int, TimeSpan[]>();
RandomStringGenerator.GetRandomString();
foreach (var iterationsCount in iterationsCounts)
{
TimeSpan elapsedForString, elapsedForSb;
sw.Restart();
var str = string.Empty;
for (int i = 0; i < iterationsCount; i++)
{
str += RandomStringGenerator.GetRandomString();
}
sw.Stop();
elapsedForString = sw.Elapsed;
sw.Restart();
var sb = new StringBuilder(string.Empty);
for (int i = 0; i < iterationsCount; i++)
{
sb.Append(RandomStringGenerator.GetRandomString());
}
sw.Stop();
elapsedForSb = sw.Elapsed;
results.Add(iterationsCount, new TimeSpan[] { elapsedForString, elapsedForSb });
}
results.Chart(r => r.Key)
.AddYSeries(r => r.Value[0].Ticks, LINQPad.Util.SeriesType.Line, "String")
.AddYSeries(r => r.Value[1].Ticks, LINQPad.Util.SeriesType.Line, "String Builder")
.DumpInline();
}
static class RandomStringGenerator
{
static Random r;
static string[] strings;
public static void Setup(int testStringLength)
{
r = new Random(DateTime.Now.Millisecond);
strings = new string[10];
for (int i = 0; i < strings.Length; i++)
{
strings[i] = Guid.NewGuid().ToString().Substring(0, testStringLength);
}
}
public static string GetRandomString()
{
var indx = r.Next(0, strings.Length);
return strings[indx];
}
}