网站建设捌金手指花总十二,珠海住房和建设局网站,深圳福田香格里拉酒店,wordpress保护插件对资源的可复用是提升应用程序性能的一个非常重要的手段#xff0c;比如本篇要分享的 ArrayPool 和 MemoryPool#xff0c;它们就有效的减少了内存使用和对GC的压力#xff0c;从而提升应用程序性能。什么是 ArrayPool System.Buffers 命名空间下提供了一个可对 array 进行复… 对资源的可复用是提升应用程序性能的一个非常重要的手段比如本篇要分享的 ArrayPool 和 MemoryPool它们就有效的减少了内存使用和对GC的压力从而提升应用程序性能。什么是 ArrayPool System.Buffers 命名空间下提供了一个可对 array 进行复用的高性能池化类 ArrayPoolT在经常使用 array 的场景下可使用 ArrayPoolT 来减少内存占用,它是一个抽象类如下代码所示
public abstract class ArrayPoolT
{
}可以想象一下你的业务场景中需要多次实例化 array这么做有什么后果呢很显然每一次 new array 都会在托管堆上分配同时当 array 不再使用时还需要 GC 去释放而 ArrayPoolT 就是为了解决此事而生的它在池中动态维护若干个 array 对象当你需要 new array 的时候只需从池中获取即可。使用 ArrayPoolT 可以通过下面三种方式来使用 ArrayPoolT 。通过 ArrayPoolT.Shared 属性来获取 ArrayPoolT 实例。通过 ArrayPoolT.Create() 来生成 ArrayPoolT 实例。通过继承 ArrayPoolT 来生成一个自定义子类。下面的代码展示了如何从 ArrayPool 中获取一个 size 10 的 array 数组。
var shared ArrayPoolint.Shared;
var rentedArray shared.Rent(10);上面的代码一定要注意虽然只租用了 10 个 size但底层会返回 2的倍数 的size , 也就是图中的 2* 8 16。当什么时候不需要 rentedArray 了记得再将它归还到 ArrayPool 中如下代码所示。
shared.Return(rentedArray);下面是仅供参考的完整代码。static void Main(string[] args){var shared ArrayPoolint.Shared;var rentedArray shared.Rent(10);for (int i 0; i 10; i){rentedArray[i] i 1;}for (int j 0; j 10; j){Console.WriteLine(rentedArray[j]);}shared.Return(rentedArray);Console.ReadKey();}创建自定义的 ArrayPool 你也可以通过重写 ArrayPool 来实现自定义的池化对象如下代码所示public class CustomArrayPoolT : ArrayPoolT{public override T[] Rent(int minimumLength){throw new NotImplementedException();}public override void Return(T[] array, bool clearArray false){throw new NotImplementedException();}}使用 MemoryPoolT System.Memory 命名空间下提供了一个内存池对象 MemoryPoolT在这之前你需要每次都 new 一个内存块出来同时也增加了 GC 的负担有了 MemoryPoolT 之后你需要的内存块直接从池中拿就可以了。static void Main(string[] args){var memoryPool MemoryPoolint.Shared;var rentedArray memoryPool.Rent(10);for (int i 0; i 10; i){rentedArray.Memory.Span[i] i 1;}for (int j 0; j 10; j){Console.WriteLine(rentedArray.Memory.Span[j]);}Console.ReadKey();}ArrayPoolT vs MemoryPoolT 从上面的演示可以看出 ArrayPoolT 是以 array 的形式向外租借而 MemoryPoolT 则是以 内存块 的方式向外租借所以在重复使用 array 的场景下可以优选 ArrayPoolT 来提高性能如果你的代码是以 MemoryT 这种内存块的形式多次使用则优先使用 MemoryPoolT。译文链接https://www.infoworld.com/article/3596289/how-to-use-arraypool-and-memorypool-in-c.html