C# 创建字节数组而不使用0s初始化

C# 创建字节数组而不使用0s初始化,c#,.net,streaming,clr,.net-standard,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风格的方法?我确信这个问题已经得到了回答,但我没

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

var buffer = new byte[65536];

var read = await stream.ReadAsync(buffer, 0, buffer.Length);
有没有一种方法可以创建一个byte[]数组,而不用在C中用0初始化所有值?可能是通过调用malloc风格的方法?我确信这个问题已经得到了回答,但我没有找到任何线索开始。

多亏了link,我偶然发现了ArrayPool:

这与发布模式有很大区别:

DoSomethingWithBuffers:3264ms DoSomethingWithPooledBuffers:470ms
不,没有。您可以使用缓冲池,这样开销只发生一次。然后,您需要确保您的逻辑能够处理阵列中可能包含“旧”数据这一事实。虽然在这里重用阵列是一个良好的开端,但我怀疑您可能还想研究管道,这将为您提供ArrayPool的所有优势,但还有更多优势,包括更好的消费模型,以及使用非连续缓冲区的能力;管道是支撑红隼令人印象深刻的性能的API。你说的是与网络相关的框架——在这种情况下,Pipelines.Sockets.non-official nuget有一个用于直接消费的SocketPipe桥接器,如果你需要中介,还有一个StreamPipe桥接器,SslStream@MarcGravell:非常感谢!尤其是在标记化/解析请求时,API的位置和发展似乎是梦寐以求的。在实现HTTP/2时,我将看一看管道。@Gene注意:HTTP/2客户端和服务器是作为.NET Core 3的一部分添加的;如果你想了解更多使用管道的细节/例子,我已经在博客上写过了extensively@MarcGravell:嗯,这个项目的想法是自己实现HTTP协议,主要是出于教育原因。但我肯定会看看那里的接口。要达到每秒700万个请求,还有很长的路要走:
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;
}