在不使用 0 初始化的情况下创建字节数组

Creating byte array without initializing with 0s

对于与网络相关的框架,我需要大量 byte[] 缓冲区来读取和写入数据。当创建一个新的字节数组时,CLR 将用 0 初始化所有值。对于与流一起使用的缓冲区,这似乎是不必要的开销:

var buffer = new byte[65536];

var read = await stream.ReadAsync(buffer, 0, buffer.Length);

有没有办法在 C# 中创建一个 byte[] 数组而不使用 0 初始化所有值?可能是通过调用 malloc 风格的方法?我确定这个问题已经得到解答,但我没有找到任何线索。

感谢mjwills link, I stumbled upon the ArrayPool<T> of System.Buffers:

static void Main(string[] args)
{
    var pool = ArrayPool<byte>.Create();

    var watch = new Stopwatch();
    watch.Start();

    Parallel.For(0, 1000000, (i) =>
    {
        //DoSomethingWithBuffers();
        DoSomethingWithPooledBuffers(pool);
    });

    Console.WriteLine(watch.ElapsedMilliseconds);
}

private static int DoSomethingWithBuffers()
{
    var buffer = new byte[65536];
    return buffer.Length;
}

private static int DoSomethingWithPooledBuffers(ArrayPool<byte> pool)
{
    var buffer = pool.Rent(65536);

    var length = buffer.Length;

    pool.Return(buffer);

    return length;
}

这有很大的不同(发布模式):

  • DoSomethingWithBuffers:3264 毫秒
  • DoSomethingWithPooledBuffers:470 毫秒