C# 中使用 ArrayPool池化数组来提升性能

什么是 ArrayPool
System.Buffers 命名空间下提供了一个可对 array 进行复用的高性能池化类 ArrayPool,在常常使用 array 的场景下可以使用 ArrayPool 来减小内存占用,它是一个抽象类。使用重用模式,专为创建成本高的对象设计。池是预初始化对象的集合,可以跨线程保留和释放这些对象。 池可以定义分配规则,例如限制、预定义大小或增长率。
如何理解Pool
能够想象一下你的业务场景中须要屡次实例化 array,这么作有什么后果呢? 很显然每一次 new array 都会在托管堆上分配,同时当 array 再也不使用时还须要 GC 去释放,而 ArrayPool 就是为了解决此事而生的,它在池中动态维护若干个 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 _arrayPool = ArrayPool.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;
        }
    }

你可能感兴趣的:(C# 中使用 ArrayPool池化数组来提升性能)