Vì rất khó để tìm ra lời giải thích cho điều này mà không bị ảnh hưởng bởi các ý kiến hoặc tiếp theo là một cuộc chiến của các niềm tự hào, tôi nghĩ phải viết một chút mã trên LINQpad để tự kiểm tra điều này.
Tôi thấy rằng việc sử dụng các chuỗi có kích thước nhỏ thay vì sử dụng i.ToString () sẽ thay đổi thời gian phản hồi (hiển thị trong các vòng lặp nhỏ).
Thử nghiệm sử dụng các chuỗi lặp lại khác nhau để giữ các phép đo thời gian trong phạm vi có thể so sánh hợp lý.
Tôi sẽ sao chép mã ở cuối để bạn có thể tự thử (kết quả. Sơ đồ ... Dump () sẽ không hoạt động bên ngoài LINQPad).
Đầu ra (Trục X: Số lần lặp được thử nghiệm, Trục Y: Thời gian tính bằng tích tắc):
Trình tự lặp lại: 2, 3, 4, 5, 6, 7, 8, 9, 10
Trình tự lặp lại: 10, 20, 30, 40, 50, 60, 70, 80
Trình tự lặp lại: 100, 200, 300, 400, 500
Mã (Được viết bằng 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];
}
}