返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中使用ArrayPool和MemoryPool实例
  • 614
分享到

C#中使用ArrayPool和MemoryPool实例

2024-04-02 19:04:59 614人浏览 独家记忆
摘要

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

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

什么是 ArrayPool

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


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 数组


var shared = ArrayPool<int>.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 = 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 来实现自定义的池化对象,如下代码所示:


    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> 之后,你需要的内存块直接从池中拿就可以了。


  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();
        }

ArrayPool<T> vs MemoryPool<T>

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

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

--结束END--

本文标题: C#中使用ArrayPool和MemoryPool实例

本文链接: https://lsjlt.com/news/127032.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#中使用ArrayPool和MemoryPool实例
    对资源的可复用是提升应用程序性能的一个非常重要的手段,比如本篇要分享的 ArrayPool 和 MemoryPool,它们就有效的减少了内存使用和对GC的压力,从而提升应用程序性能。...
    99+
    2024-04-02
  • c#中token的使用方法实例
    目录token的存在意义使用方法token的存在意义 这是我初略了解的token的存在意义 用户使用用户名密码来请求服务器服务器进行验证用户的信息服务器通过验证发送给用户一个toke...
    99+
    2024-04-02
  • C#中Task.ContinueWith连续任务使用实例
    通过任务,可以指定在任务完成之后,应开始运行之后另一个特定任务。例如,一个使用前一个任务的结果的新任务,如果前一个任务失败了,这个任务就应执行一些清理工作。任务处理程序都不带参数或者...
    99+
    2024-04-02
  • C#类使用实例分析
    这篇“C#类使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#类使用实例分析”文章吧。实例using ...
    99+
    2023-06-17
  • C++BoostHeap使用实例详解
    目录一、说明Boost.Heap二、功能示例一、说明Boost.Heap Boost.Heap 也可以称为 Boost.PriorityQueue,因为该库提供了几个优先级队列。但是...
    99+
    2022-11-13
    C++ Boost Heap C++ Boost Heap库函数
  • C#中ListView用法实例
    目录添加标题显示网格添加数据到表格中自定义其他属性结束添加标题 在 Winfrom 界面中添加一个 ListView 组件,然后点击右上角的箭头,点击编辑列 添加下面标题,然后点击...
    99+
    2024-04-02
  • c++中vector的使用和模拟实现
    一、接口介绍 1、插入数据 void push_back(const T& x) 在当前vector尾部插入x,如果容量不够扩大二倍。 iterator insert(it...
    99+
    2024-04-02
  • C++中allocator类使用示例
    目录动态内存管理StrVec类实现细节总结动态内存管理 之前我们讲述过动态内存的开辟,可以通过new, malloc,以及alloc等方式,本文通过介绍alloc方式,构造一个Str...
    99+
    2024-04-02
  • vue3中watch和watchEffect使用实例分析
    watchwatch监听单个数据<template> <input type="text" v-model="text1" /> </template> ...
    99+
    2023-05-14
    Vue3 watcheffect watch
  • 基础使用和示例:C语言中scanf函数
    C语言中scanf函数的基本用法与示例 简介:在C语言中,scanf函数是一种常用的输入函数,用于从标准输入设备(通常是键盘)获取数据,并把数据存储到变量中。本文将详细介绍scanf函...
    99+
    2024-02-25
    - 示例 - c语言 c语言编程
  • C++实例讲解引用的使用
    目录1.什么是引用2.引用的用法2.1 普通引用2.2 const 引用2.3 作用在函数参数2.4 作用在函数返回值3.引用的本质1.什么是引用 引用可以看作是一个已经定义的变量的...
    99+
    2024-04-02
  • C++的lambda使用实例分析
    这篇“C++的lambda使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++的lambda使用实例分析”文章吧...
    99+
    2023-06-29
  • C++模板使用实例分析
    这篇文章主要介绍了C++模板使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++模板使用实例分析文章都会有所收获,下面我们一起来看看吧。非类型模板参数模板参数分类类型形参与非类型形参。类型形参:出现...
    99+
    2023-06-30
  • C#中使用async和await实现异步Udp通讯的示例代码
    目录C/S架构客户端实现客户端主流程和实现客户端发送消息实现客户端监听消息实现服务器实现服务器主流程和实现服务器发送消息实现服务器监听消息实现总结在之前的C#版本中, 如果我们想要进...
    99+
    2024-04-02
  • C#中RadioButton的实例用法
    本篇内容介绍了“ C#中RadioButton的实例用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C# RadioButton是大家经常...
    99+
    2023-06-17
  • C# CLR学习 C++使用namespace实例详解
    目录一:背景二:聊一聊 namespace1. 简单的隔离2. 使用 using 导入3. 使用 using 定义别名4. 使用 using namespace 导入一:背景 相信大...
    99+
    2024-04-02
  • C#中线程和任务实例分析
    这篇文章主要介绍“C#中线程和任务实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#中线程和任务实例分析”文章能帮助大家解决问题。线程线程:对于所有需要等待的操作,例如移动文件,数据库和网络...
    99+
    2023-06-29
  • C++中map和set封装实现示例
    目录mao和set模拟实现 模拟实现 取K的仿函数 Insert 迭代器 begin和end  ++和--&nb...
    99+
    2023-02-06
    c++ set map c++ map封装 c++map的使用
  • C# 中使用隐式和显式操作符的示例
    目录什么是显式,什么是隐式创建 DTO 类Model 和 DTO 之间的相互转换使用隐式操作符使用显式操作符C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换...
    99+
    2024-04-02
  • Android中ViewFlipper和AdapterViewFlipper使用的方法实例
    目录一、ViewFlipper二、AdapterViewFlipperAndroid ViewFlipper、AdapterViewFlipper对比复用性动画效果属性配置总结一、V...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作