什么是 ArrayPool
System.Buffers 命名空间下提供了一个可对 array 进行复用的高性能池化类 ArrayPool<T>,在常常使用 array 的场景下可以使用 ArrayPool<T> 来减小内存占用,它是一个抽象类。使用重用模式,专为创建成本高的对象设计。池是预初始化对象的集合,可以跨线程保留和释放这些对象。 池可以定义分配规则,例如限制、预定义大小或增长率。
如何理解Pool
能够想象一下你的业务场景中须要屡次实例化 array,这么作有什么后果呢? 很显然每一次 new array 都会在托管堆上分配,同时当 array 再也不使用时还须要 GC 去释放,而 ArrayPool<T> 就是为了解决此事而生的,它在池中动态维护若干个 array 对象,当你须要 new array 的时候只需从池中获取便可。
未池化前:
[HttpGet("array/{size}")]
public byte[] GetArray(int size)
{
var random = new Random();
var array = new byte[size];
random.NextBytes(array);
return array;
}
池化后:
[ApiController]
[Route("api/[controller]")]
public class PoolController : Controller
{
private static ArrayPool<byte> _arrayPool = ArrayPool<byte>.Create();
public class PooledArray : IDisposable
{
public byte[] Array { get; private set; }
public PooledArray(int size)
{
Array = _arrayPool.Rent(size);
}
public void Dispose()
{
_arrayPool.Return(Array);
}
}
[HttpGet("pooledarray/{size}")]
public byte[] GetPooledArray(int size)
{
var pooledArray = new PooledArray(size);
var random = new Random();
random.NextBytes(pooledArray.Array);
HttpContext.Response.RegisterForDispose(pooledArray); //通过注册释放pooledArray对象
return pooledArray.Array;
}
}