改进编码周期

本文关键字:周期 编码 | 更新日期: 2023-09-27 18:18:55

我有这个对象:Dictionary<byte, BitArray>()

它是由huffman树的值填充的。要将流的每个字节编码为霍夫曼二进制值,我这样做:

// Bytes are the bytes to be encoded, encoded is the output string
foreach (byte c in Bytes)
{
    encoded += _translationTable[c].ToBitsString();
}

这是扩展方法:

//Converts the bitarray in a binary string
public static string ToBitsString(this BitArray bitArr)
{
    string retStr = string.Empty;
    foreach (bool bit in bitArr)
    {
        retStr += (bit) ? "1" : "0";
    }
    return retStr;
}

编码64kb的数据需要近3秒,是否有一种方法可以更快地实现这一结果?

改进编码周期

听起来像是在循环中执行字符串连接。这是一种非常低效的构建新字符串的方式。我怀疑你想要:

var builder = new StringBuilder();
foreach (byte c in Bytes)
{
    builder.Append(_translationTable[c].ToBitsString());
}
var encoded = builder.ToString();

现在我们可以看到ToBitsString的作用,很容易重写它以接受StringBuilder附加到:

public static void AppendBitsTo(this BitArray bitArray, StringBuilder builder)
{
    foreach (bool bit in bitArray)
    {
        builder.Append(bit ? "1" : "0");
    }
}

则循环体为:

_translationTable[c].AppendBitsTo(builder);