对于与网络相关的框架,我需要大量的byte[]
缓冲区来读取和写入数据。创建新的字节数组时,CLR将使用0
初始化所有值。对于与流一起使用的缓冲区,这似乎是不必要的开销:
var buffer = new byte[65536];
var read = await stream.ReadAsync(buffer, 0, buffer.Length);
有没有一种方法可以创建一个byte[]
数组而不用C#中的0
初始化所有值?可能是通过调用malloc
样式方法?我确定这个问题已经回答,但是我没有找到任何线索。
答案 0 :(得分:1)
由于mjwills链接,我偶然发现了System.Buffers的ArrayPool<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;
}
有很大的不同(发布模式):