在不使用 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 毫秒
对于与网络相关的框架,我需要大量 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 毫秒