使用最少的分配数将整数附加到StringBuilder。有更快的方法吗?
{{1}}
答案 0 :(得分:2)
以下实施速度大约快2倍。
通过使用小的100元素预分配字符串表
来最小化StringBuilder
调用
private static readonly string[] UIntPairStrings =
Enumerable.Range(0, 100).Select(n => n.ToString("00")).ToArray();
并且还通过以2位数对从高到低处理输入值来最小化分割数(以补偿存储的不足)。这样,该操作不会执行超过5次Append
次呼叫。
private static readonly uint[] UIntPairScales = { 100000000, 1000000, 10000, 100 };
public static void AppendInvariant(this StringBuilder builder, uint value)
{
bool next = false;
foreach (var scale in UIntPairScales)
{
if (value >= scale)
{
uint pair = value / scale;
if (!next && pair < 10)
builder.Append((char)('0' + pair));
else
builder.Append(UIntPairStrings[pair]);
value -= pair * scale;
next = true;
}
else if (next)
{
builder.Append("00");
}
}
if (!next && value < 10)
builder.Append((char)('0' + value));
else
builder.Append(UIntPairStrings[value]);
}