关于c#:如何使用-ArrayPool

50次阅读

共计 1433 个字符,预计需要花费 4 分钟才能阅读完成。

如果不停的 new 数组,可能会造成 GC 的压力,因而在 aspnetcore 中举荐应用 ArrayPool 来重用数组,本文将介绍如何应用 ArrayPool。

应用 ArrayPool

ArrayPool 是一个动态类,它提供了一个共享的数组池,能够用来重用数组。它能够用来防止频繁的调配和回收数组,从而缩小 GC 的压力。

ArrayPool 的应用非常简单,只须要调用它的静态方法 Rent 即可。Rent 办法有两个参数,第一个参数是数组的长度,第二个参数是数组的最小长度。如果你不晓得数组的最小长度,能够传递一个默认值,比方 16。上面是一个应用 ArrayPool 的 C# 示例:

using System;
using System.Buffers;

class Program
{static void Main(string[] args)
    {
        // 创立一个数组池
        var pool = ArrayPool<int>.Shared;

        // 从池中获取一个长度为 10 的数组
        int[] array = pool.Rent(10);
        try
        {
            // 在数组中填充一些数据
            for (int i = 0; i < array.Length; i++)
            {array[i] = i;
            }

            // 应用数组中的数据
            foreach (int i in array)
            {Console.WriteLine(i);
            }
        }
        finally
        {
            // 将数组偿还到池中
            pool.Return(array);
        }
    }
}

在下面的示例中,咱们首先通过调用 ArrayPool<int>.Shared 来获取一个数组池的实例。接下来,咱们通过调用 pool.Rent(10) 办法从池中获取一个长度为 10 的整数数组。在数组中填充数据后,咱们遍历数组并输入其中的元素。最初,咱们通过调用 pool.Return(array) 办法将数组偿还到池中。

须要留神的是,在应用完数组后,必须将其偿还到池中,否则该数组将始终占用池中的内存,导致内存透露。

应用场景

一个典型的场景是在高吞吐量的网络应用程序中,例如 Web 服务器或音讯队列服务器中。这些服务器须要解决大量的网络申请或音讯,这些申请或音讯可能波及到大量的内存调配和开释。如果在每个申请或音讯解决期间都须要调配和开释内存,那么垃圾回收器将面临重大的压力,导致系统性能降落。

应用 ArrayPool 能够通过池化内存缓解这种状况。这样,当须要调配数组时,能够从池中获取可用的数组而不是调配新的数组,从而缩小垃圾回收的压力。一旦应用结束,将数组返回到池中,以便能够重复使用。

例如,一个 HTTP 服务器可能须要同时解决多个客户端申请,每个申请都须要读取和解决申请注释。在这种状况下,能够应用 ArrayPool 来池化内存,以便在每个申请解决期间重复使用雷同的缓冲区。这将缩小内存调配和垃圾回收的开销,从而进步服务器的性能和吞吐量。

总结

ArrayPool 是一个动态类,它提供了一个共享的数组池,能够用来重用数组。它能够用来防止频繁的调配和回收数组,从而缩小 GC 的压力。

参考

  • ArrayPool1

感谢您的浏览,如果您感觉本文有用,请留下评论。

欢送关注作者的微信公众号“newbe 技术专栏”,获取更多技术内容。

  • 本文作者:newbe36524
  • 本文链接:https://www.newbe.pro/Others/0x01F-how-to-use-arraypool/
  • 版权申明:本博客所有文章除特地申明外,均采纳 BY-NC-SA 许可协定。转载请注明出处!

  1. https://learn.microsoft.com/d… ↩

正文完
 0