在找不到答案后我自己进行了测试(这就是首先发布帖子的原因)。
我的结果如下(多次运行类似)
direct String.PadRight average: 29,291921 ms.
String.PadRight average: 32,328434 ms.
Custom PadRight average: 27,066596 ms.
与
private const int Iterations = 500;
private const int NumStrings = 250000;
private const int TestStringLength = 50;
对于我生成的NumStrings 随机字符串少于TestStringLength 字符的测试,然后用空格将它们全部填充到TestStringLength。
所以基于子字符串的填充似乎更快(但当然不那么通用)。有趣的是,填充的字符串越少,运行的迭代越少,这种趋势就会逆转。然后,String.PadRight 变得更快。
测试代码(here a dotnetfiddle version [减少计数以使其在那里工作,你不能相信你得到的结果,它们因运行而异]):
#region Performance Test
private const int Iterations = 500;
private const int NumStrings = 250000;
private const int TestStringLength = 50;
private static string EmptyLine;
public static string PadRight(string input)
{
return input.PadRight(TestStringLength, ' ');
}
public static string PadRight2(string input)
{
return input + EmptyLine.Substring(0, TestStringLength - input.Length);
}
#endregion // Performance Test
循环是
#region Performance Test
EmptyLine = String.Join("", Enumerable.Repeat(" ", TestStringLength));
var random = new System.Random();
StringBuilder temp = new StringBuilder();
string[] randomStrings = new string[NumStrings];
double[] averageDirect = new double[Iterations];
double[] averageStandard = new double[Iterations];
double[] averageCustom = new double[Iterations];
// init random strings
for (int i = 0; i < NumStrings; ++i)
{
temp.Clear();
for (int k = 0; k < random.Next(0, TestStringLength); ++k)
{
temp.Append((char)('!' + random.Next(0, 93)));
}
randomStrings[i] = temp.ToString();
}
var timer = new Stopwatch();
string padded;
for (int counter = 0; counter < Iterations; ++counter)
{
timer.Reset();
timer.Start();
for (int i = 0; i < NumStrings; ++i)
{
padded = PadRight2(randomStrings[i]);
}
timer.Stop();
averageCustom[counter] = timer.Elapsed.TotalMilliseconds;
timer.Reset();
timer.Start();
for (int i = 0; i < NumStrings; ++i)
{
padded = PadRight(randomStrings[i]);
}
timer.Stop();
averageStandard[counter] = timer.Elapsed.TotalMilliseconds;
timer.Reset();
timer.Start();
for (int i = 0; i < NumStrings; ++i)
{
padded = randomStrings[i].PadRight(TestStringLength, ' ');
}
timer.Stop();
averageDirect[counter] = timer.Elapsed.TotalMilliseconds;
}
Console.WriteLine($"direct String.PadRight average: {averageDirect.Average()} ms.");
Console.WriteLine($"String.PadRight average: {averageStandard.Average()} ms.");
Console.WriteLine($"Custom PadRight average: {averageCustom.Average()} ms.");
#endregion // Performance Test