服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中使用ArrayPool和MemoryPool实例

C#中使用ArrayPool和MemoryPool实例

2022-11-21 14:24码农读书 C#

对资源的可复用是提升应用程序性能的一个非常重要的手段,比如本篇要分享的 ArrayPool 和 MemoryPool,它们就有效的减少了内存使用和对GC的压力,从而提升应用程序性能。感兴趣的可以了解一下

对资源的可复用是提升应用程序性能的一个非常重要的手段,比如本篇要分享的 ArrayPool 和 MemoryPool,它们就有效的减少了内存使用和对GC的压力,从而提升应用程序性能。

什么是 ArrayPool

System.Buffers 命名空间下提供了一个可对 array 进行复用的高性能池化类 ArrayPool<T>,在经常使用 array 的场景下可使用 ArrayPool<T> 来减少内存占用,它是一个抽象类,如下代码所示:

?
1
2
3
public abstract class ArrayPool<T>
{
}

可以想象一下你的业务场景中需要多次实例化 array,这么做有什么后果呢? 很显然每一次 new array 都会在托管堆上分配,同时当 array 不再使用时还需要 GC 去释放,而 ArrayPool<T> 就是为了解决此事而生的,它在池中动态维护若干个 array 对象,当你需要 new array 的时候只需从池中获取即可。

使用 ArrayPool<T>

可以通过下面三种方式来使用 ArrayPool<T>

  • 通过 ArrayPool<T>.Shared 属性来获取 ArrayPool<T> 实例。
  • 通过 ArrayPool<T>.Create() 来生成 ArrayPool<T> 实例。
  • 通过继承 ArrayPool<T> 来生成一个自定义子类。

下面的代码展示了如何从 ArrayPool 中获取一个 size >= 10 的 array 数组。

?
1
2
var shared = ArrayPool<int>.Shared;
var rentedArray = shared.Rent(10);

C#中使用ArrayPool和MemoryPool实例

上面的代码一定要注意,虽然只租用了 10 个 size,但底层会返回 2的倍数 的size , 也就是图中的 2* 8 = 16。

当什么时候不需要 rentedArray 了,记得再将它归还到 ArrayPool 中,如下代码所示。

?
1
shared.Return(rentedArray);

下面是仅供参考的完整代码。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void Main(string[] args)
     {
         var shared = ArrayPool<int>.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 来实现自定义的池化对象,如下代码所示:

?
1
2
3
4
5
6
7
8
9
10
11
public class CustomArrayPool<T> : ArrayPool<T>
{
    public override T[] Rent(int minimumLength)
    {
        throw new NotImplementedException();
    }
    public override void Return(T[] array, bool clearArray = false)
    {
        throw new NotImplementedException();
    }
}

使用 MemoryPool<T>

System.Memory 命名空间下提供了一个内存池对象 MemoryPool<T>,在这之前你需要每次都 new 一个内存块出来,同时也增加了 GC 的负担,有了 MemoryPool<T> 之后,你需要的内存块直接从池中拿就可以了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void Main(string[] args)
      {
 
          var  memoryPool = MemoryPool<int>.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();
      }

C#中使用ArrayPool和MemoryPool实例

ArrayPool<T> vs MemoryPool<T>

从上面的演示可以看出, ArrayPool<T> 是以 array 的形式向外租借,而 MemoryPool<T> 则是以 内存块 的方式向外租借,所以在重复使用 array 的场景下可以优选 ArrayPool<T> 来提高性能,如果你的代码是以 Memory<T> 这种内存块的形式多次使用则优先使用 MemoryPool<T>

到此这篇关于C#中使用ArrayPool和MemoryPool实例的文章就介绍到这了,更多相关C# ArrayPool和MemoryPool内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/ireadme/p/14521356.html

延伸 · 阅读

精彩推荐
  • C#详解C#中的定时器Timer类及其垃圾回收机制

    详解C#中的定时器Timer类及其垃圾回收机制

    这篇文章主要介绍了C#中的定时器Timer类及其垃圾回收机制,讲解了Timer相关的单线程异步工作,需要的朋友可以参考下...

    go,go6692021-11-19
  • C#c# rsa加密解密详解

    c# rsa加密解密详解

    这篇文章主要介绍了c# rsa加密解密的的相关资料,文中代码非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    Kiba5187622022-09-20
  • C#C# 读取ttf字体文件里的Unicode实现

    C# 读取ttf字体文件里的Unicode实现

    这篇文章主要介绍了C# 读取 ttf字体文件里的 Unicode实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    超蓝微猫10312022-10-09
  • C#C#实现主窗体最小化后出现悬浮框及双击悬浮框恢复原窗体的方法

    C#实现主窗体最小化后出现悬浮框及双击悬浮框恢复原窗体的方

    这篇文章主要介绍了C#实现主窗体最小化后出现悬浮框及双击悬浮框恢复原窗体的方法,涉及C#窗体及鼠标事件响应的相关技巧,具有一定参考借鉴价值,需要的...

    我心依旧12152021-10-22
  • C#学习Winform文本类控件(Label、Button、TextBox)

    学习Winform文本类控件(Label、Button、TextBox)

    这篇文章主要和大家一起学习Winform文本类控件,包含标签控件(Label),按钮控件(Button),文本框控件(TextBox)和格式文本控件(RichTextBox),感兴趣的小伙伴们可...

    丿木呈广予口贝10012021-11-22
  • C#Unity实现手机摇一摇震动

    Unity实现手机摇一摇震动

    这篇文章主要为大家详细介绍了untiy实现手机摇一摇震动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    liang_7049597218642022-08-09
  • C#unity自定义弹出框功能

    unity自定义弹出框功能

    这篇文章主要为大家详细介绍了unity自定义弹出框功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    无名之士7862022-08-09
  • C#详解C# Socket编程笔记

    详解C# Socket编程笔记

    这篇文章主要介绍了详解C# Socket编程笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。...

    stg60911342021-12-15