gpt4 book ai didi

c# - 最快的 StringBuilder 追加整数

转载 作者:行者123 更新时间:2023-11-30 23:14:20 25 4
gpt4 key购买 nike

以最少的分配量将整数附加到 StringBuilder。有没有更快的方法?

    public static void AppendInvariant(this StringBuilder builder, int value)
{
// Deal with negative numbers
if (value < 0)
{
builder.Append('-');
uint uint_value = uint.MaxValue - ((uint)value) + 1; //< This is to deal with Int32.MinValue
AppendInvariant(builder, uint_value);
}
else
{
AppendInvariant(builder, (uint)value);
}
}

public static void AppendInvariant(this StringBuilder builder, uint value)
{
if (value == 0)
{
builder.Append('0');
return;
}

// Pad out space for writing.
int length = UintLength(value);
builder.Append('0', length);
length = builder.Length;

uint tmp_value;
do
{
tmp_value = value;
value /= 10;
builder[--length] = (char)('0' + (tmp_value - value * 10));
} while (value > 0);
}

private static int UintLength(uint i)
{
if (i < 100000)
{
if (i < 10) return 1;
if (i < 100) return 2;
if (i < 1000) return 3;
if (i < 10000) return 4;
return 5;
}
else
{
if (i < 1000000) return 6;
if (i < 10000000) return 7;
if (i < 100000000) return 8;
if (i < 1000000000) return 9;
return 10;
}
}

最佳答案

以下实现大约快 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]);
}

关于c# - 最快的 StringBuilder 追加整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43155120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com