MemoryOwner和SpanOwner都可以理解为是对ArrayPool<>的一个包装,无非一个是在堆栈上,一个是在托管堆上。既然做了包装,那肯定随之而来就是改进和优化。

MemoryOwner<>

MemoryOwner<>解决的问题

1.通过ArrayPool的Api MemoryPool.Shared.Rent(size) 获得的IMemoryPool实例的缓冲区会大于我们指定的大小,一般是2的n次方,所以需要我们去切片去获取真正有意义的段数据。但是MemoryOwner<>会存储我们请求的大小,并且在其属性中,如span,自动为我们切片成我们请求的大小,从而免除了切片的操作。

2.IMemoryPool只有Memory属性,我们需要通过Memory再去获取span,但是MemoryOwner<>本身就有span属性供我们调用

3.ArrayPool返回我们租用的缓冲空间的时候默认不会清空,除非设置clearArray,MemoryOwner<>在Allocate的时候就可以设置AllocationMode从而决定在返还缓冲区的时候是否清空其中数据。

但是清空数据将会带来小小的性能消耗,就是我们需要给每一位填上默认值,即填充0

4.MemoryOwner<>最大的优点,就是会重复使用缓冲池中的某个相同的数组,从而最大程度的避免分配。

如下是我们使用原始数组来存储从文件读取到的数据:

using Stream stream = File.OpenRead(path);
byte[] buffer = new byte[(int)stream.Length];
stream.Read(buffer, 0, buffer.Length);
return buffer;

如果我们读取的是一个大文件,则会在内存中分配一个大内存空间,这会在使用完之后给GC很大的压力。

我们使用ArrayPool对代码做一个优化,目的在于从缓冲池中租用一段空间,以避免空间的分配。

using Stream stream = File.OpenRead(path);
byte[] buffer = ArrayPool<byte>.Shared.Rent((int)stream.Length);
stream.Read(buffer, 0, (int)stream.Length);
//切片数组
return buffer[0..((int)stream.Length - 1)];

上述代码有一个很明显的问题,就是最终我们对数组做了切片,所以还是将旧的缓冲区的数据拷贝到了一个新的数组,并且还存在了分配空间的行为。问题的根源就是ArrayPool租用到的大小实际会大于我们的实际请求。

并且我们返回了数组,那么我们还需要再去跟踪这个数组的使用的生命周期,并且需要再合适的时机去调用ArrayPool<>.Shared.Return(buffer)返还到缓冲池中。

为了解决上述问题,我们再使用MemoryOwner<>去重构代码

using Stream stream = File.OpenRead(path);
MemoryOwner<byte> buffer = MemoryOwner<byte>.Allocate((int)stream.Length);
stream.Read(buffer.Span);
return buffer;

MemoryOwner<>.Allocate(size)返回的IMemoryOwner<> 实例将负责释放基础缓冲区

并且MemoryOwner中的所有属性遵循我们请求的实际大小,从而无需再做切片处理,比如Span属性。

SpanOwner<>

SpanOwner<>是从共享内存池租用再堆栈中的缓冲区的类型,功能和API与MemoryOwner<>类似。

和MemoryOwner<>的区别就是它在堆栈上以及它没有实现IMemoryOwner<>这个接口所以没有Memory<>属性。

代码示例:

SpanOwner<int> buffer = SpanOwner<int>.Allocate(length);
Span<int> span = buffer.Span;

总结

1.SpanOwner和MemoryOwner常被用作缓冲区,存储临时数据

2.可以使用using对SpanOwner和MemoryOwner进行生命周期的控制,对于MemoryOwner来说,如果不方便控制,GC最后也会将其返还到缓冲池中。

3.SpanOwner和MemoryOwner可以理解为是对ArrayPool的包装。

本文参考文档:https://learn.microsoft.com/zh-cn/dotnet/communitytoolkit/high-performance/memoryowner

如有问题,多谢指教!

.net开发者应掌握的利器CommunityToolkit.HighPerformance——MemoryOwner与SpanOwner的更多相关文章

  1. PHP开发者应了解的24个库

    @PHP开发者应了解的24个库 本文由 伯乐在线 - 贾朝藤 翻译.未经许可,禁止转载!英文出处:tutorialzine.欢迎加入翻译组. 作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许 ...

  2. [转贴]PHP 开发者应了解的 24 个库

    作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许多多有用的库分发出来,在Github上很容易发现和使用这些库.下面是我曾经遇到过最酷的24个库.你最喜欢的库没有在这个列表里面?那就在评论中分 ...

  3. 转:PHP开发者应了解的24个库

    原文来自于:http://blog.jobbole.com/54201/ 作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许多多有用的库分发出来,在Github上很容易发现和使用这些库.下面是 ...

  4. Web开发者应知的URL编码知识

    原文出处:http://blog.jobbole.com/42246/ 本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding 来引出我们 ...

  5. Web开发者应知的URL编码知识(转)

    原文出处: lunatech   译文出处:oschina - 桔子, lwei, 史涛, Khiyuan, super0555, LinuxQueen, 抛出异常的爱 本文首先阐述了人们关于统一资源 ...

  6. Web开发者应掌握的12个Firebug技巧

    来源: 廖煜嵘 相信很多从事Web开发工作的开发者都听说和使用过Firebug,但可能大部分人还不知道,其实它是一个在网页设计方面功能相当强大的编辑器,它 可以对HTML.DOM.CSS.HTTP和J ...

  7. Apple Pay强势来袭,开发者应做的事情

    "iOS8.1就已经有这个功能了,只是木有现在这么的火,现在的趋势是要火的节奏,因此很多电商平台B2B,P2P,C2C,X2X都有可能需要这个屌丝的付款功能了,在此简单的研究一下." ...

  8. JavaScript开发者应懂的33个概念

    简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的.它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南. 本篇文章是参照 @leonardomso 创立,英文版项 ...

  9. Apple Pay强势来袭,开发者应做的事情(转)

    "iOS8.1就已经有这个功能了,只是木有现在这么的火,现在的趋势是要火的节奏,因此很多电商平台B2B,P2P,C2C,X2X都有可能需要这个屌丝的付款功能了,在此简单的研究一下." ...

  10. web开发者踏入人工智能的利器_Tensorflow.js

    前言 最近公司向员工搜集公司杂志的文章,刚好最近学习了机器学习相关课程.为了赚取购买课程的费用,所以写了如下文章投稿赚取稿费. 如下文章可能涉及一些我所购买课程的内容,所以不便将所有资源进行展示. 当 ...

随机推荐

  1. 关于 manacher 的一个小细节

    在该算法中,我们需要用到一个数组 hw[i] ,代表 i 的最大回文半径.而且这个半径不包括 i 本身(若串为 ccc 则 hw 为 1). 这时最终答案为最大的 hw 减一. 为什么要减一呢?最终的 ...

  2. 解决margin合并问题

    一.什么是外边距合并 外边距合并(叠加)是一个相当简单的概念.但是,在实践中对网页进行布局时,它会造成许多混淆. 所谓的外边距合并就是,当两个垂直外边距相遇时,它们将形成一个外边距.合并的外边距的高度 ...

  3. 3分钟带你了解Hadoop是什么

    Hadoop是一种开源的分布式计算框架,它在Google的MapReduce论文发表后大受欢迎,并被广泛应用.Hadoop框架包括一个分布式文件系统(HDFS),它允许用户以分布式方式存储和管理大量数 ...

  4. 你需要知道的 14 个常用的 JavaScript 函数

    1.确定任意对象的具体类型 众所周知,JavaScript 中有六种原始数据类型(Boolean.Number.String.Null.Undefined.Symbol)和一个对象数据类型.但是你知道 ...

  5. CSS 基础属性篇组成及作用

    #### 学习目标- css属性和属性值的定义- css文本属性- css列表属性- css背景属性- css边框属性- css浮动属性##### 一.css属性和属性值的定义>属性:属性是指定 ...

  6. 一个基于GPT模型实现的Git Commit信息自动生成工具

    每次提交代码的时候,你是否有为如何写Commit Message而迟迟按不下提交的时刻呢?然后,死磨硬泡写了一些并提交后,又被review的小伙伴吐槽了呢?相信很多小伙伴有过这样的经历吧? 趁着最近C ...

  7. Go - 高并发抢到红包实现

    // utils.gopackage mainimport ( "fmt" "math/rand" "sync" "time&qu ...

  8. AlphaFold2无痛安装教程(超级详细)

    目录 介绍 环境 安装 CMAKE安装 hmmer安装 HHsuite安装 Kalign安装 OpenMM安装 PDBfixer安装 Python依赖包安装 AlphaFold安装 AlphaFold ...

  9. OWASP TOP 10 2021

    OWASP TOP 10 2021 2021 年的 TOP 10 中有 3 个新类别.4 个更改了名称和范围的类别以及一些合并. A01. 失效的访问控制 Broken Access Control ...

  10. kubernetes核心实战(六)--- ConfigMap

    8.ConfigMap 抽取应用配置,并且可以自动更新 创建配置文件 [root@k8s-master-node1 ~/yaml/test]# vim configmap.yaml [root@k8s ...