C#如何使用ArrayPool C#高性能数组池化技术

admin 百科 13
ArrayPool是.NET轻量级线程安全数组池,用于减少GC压力;需租借后配对归还,避免泄漏;正确使用需注意长度边界、清零策略及适用场景。

C#如何使用ArrayPool C#高性能数组池化技术-第1张图片-佛山资讯网

ArrayPool 是 .NET 提供的轻量级、线程安全的数组对象池,用来避免频繁分配和释放数组带来的 GC 压力,特别适合短生命周期、固定大小的数组场景(比如网络缓冲、序列化中间数组、图像处理临时缓存等)。

为什么用 ArrayPool 而不是 new T[n]?

每次 new byte[4096] 都会触发堆分配;高频调用时容易产生大量 Gen 0 对象,增加 GC 频率。而 ArrayPool.Shared.Rent(n) 复用已有数组,租借后不归还也不会泄漏(池内部有上限和老化策略),但主动归还是最佳实践。

怎么正确租借和归还数组?

租借后必须配对归还,否则池中可用数组减少,可能退化为每次都 new。推荐用 try/finallyusing(C# 8+ 支持 IDisposable 的池实例):

  • ✅ 推荐写法(自动归还):

    using var buffer = ArrayPool<byte>.Shared.Rent(8192);<br>
      // 使用 buffer.Array,注意长度是 buffer.Length,不是 buffer.Array.Length

    登录后复制

  • ✅ 手动归还(需确保执行):

    var buffer = ArrayPool<byte>.Shared.Rent(8192);<br>
      try { /* 使用 */ }<br>
      finally { ArrayPool<byte>.Shared.Return(buffer); }

    登录后复制

  • ❌ 错误:只 Rent 不 Return → 池耗尽后后续 Rent 可能 new 新数组,失去池意义

如何控制池行为?自定义 ArrayPool

Shared 是开箱即用的默认池,适合通用场景。如需定制(比如限制最大数组大小、控制池容量或启用清零),可继承 ArrayPool 或用 ArrayPool.Create()

标签: 字节 c# .net 为什么 red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~