最快的StringBuilder附加整数

时间:2017-04-01 09:33:47

标签: c# .net

使用最少的分配数将整数附加到StringBuilder。有更快的方法吗?

{{1}}

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]);
}