创建字节数组而不用0初始化

时间:2019-04-01 07:42:41

标签: c# .net streaming clr .net-standard

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

var buffer = new byte[65536];

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

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

1 个答案:

答案 0 :(得分:1)

由于mjwills链接,我偶然发现了System.BuffersArrayPool<T>

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毫秒