【问题标题】:Does BitConverter.GetBytes() always allocate a new byte[] every time? [duplicate]BitConverter.GetBytes() 是否总是每次都分配一个新的字节[]? [复制]
【发布时间】:2020-01-13 07:48:26
【问题描述】:

BitConverter.GetBytes(SomeType) 总是返回一个byte[],似乎每次调用它时都会在内存中创建一个新的byte[],并在一段时间后被GC 回收。我需要多次调用它才能将大量数据转换为字节,这会对性能产生影响吗? 是否有像GetBytes(SomeType input, byte[] buffer) 这样的另一种方法可以将数据写入您自己的缓冲区? 用例是我要将一些数据序列化成二进制格式的文件。

【问题讨论】:

标签: c#


【解决方案1】:

BitConverter.GetBytes 的每个实现如下所示:

public static byte[] GetBytes(ulong value)
{
    return GetBytes((long)value);
}

或者

public unsafe static byte[] GetBytes(long value)
{
    byte[] array = new byte[8];
    byte[] array2 = array;
    fixed (byte* ptr = array2)
    {
        *(long*)ptr = value;
    }
    return array;
}

它们最终都会分配一个新数组。

上面的代码是使用 ILSpy 反编译的。

【讨论】:

  • 你也在内存中创建一个新数组byte[] array = new byte[8];
  • @AthanasiosKataras - 不,我不是。这是来自框架本身的代码。这是反编译的代码。
【解决方案2】:

嗯,BitConverter 本身目前还没有那么聪明。

但这取决于您要转换哪种数据?我假设像intstring 这样的原始类型。然后你可以在缓存方面做得更好:例如,Dictionary<int, byte[]> 会给你带来很大的性能提升:本质上,你会将每个不同的整数转换为位数组一次,然后将其存储在字典中;将相同整数转换为字节数组的所有其他尝试都将检索 cahced 实例。

实际上,同样的方法也适用于非原始对象,但您必须保持EqualsGetHashCode 的正确实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多