.net开发者应掌握的利器CommunityToolkit.HighPerformance——MemoryOwner与SpanOwner

这篇具有很好参考价值的文章主要介绍了.net开发者应掌握的利器CommunityToolkit.HighPerformance——MemoryOwner与SpanOwner。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

目录
  • MemoryOwner<>
    • MemoryOwner<>解决的问题
  • SpanOwner<>
  • 总结

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

如有问题,多谢指教!文章来源地址https://www.toymoban.com/news/detail-466242.html

到了这里,关于.net开发者应掌握的利器CommunityToolkit.HighPerformance——MemoryOwner与SpanOwner的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

            这十年来 web 得到了快速的发展,随着 webgl 的普及,网页的表现能力越来越强大,网页上已经开始可以做出很多复杂的动画和精美的效果,还可以通过 webgl 在网页中绘制高性能的3d图形,别的不说,凡是入门程序员都离不开github这个网站,细心的人都会发现,gi

    2024年02月01日
    浏览(62)
  • Java开发者的Python进修指南:JSON利器之官方json库、demjson和orjson的实用指南

    JSON作为目前最流行的传输格式,在Python中也有相应的实现方式。由于JSON格式的文本可以跨平台并且简单易用,因此被广泛传播。因此,我们今天的主要讨论内容是如何熟练地应用Python的JSON库来处理将JSON映射到文本,以及如何从文本映射到对象中。现在,让我们开始探讨这个

    2024年01月23日
    浏览(62)
  • C#开发者必备!快速掌握onnxruntime实现YOWOv2视频动作检测技术!

    C#开发者必备!快速掌握onnxruntime实现YOWOv2视频动作检测技术! 目录 介绍 效果 模型信息 项目 代码 Form1.cs YOWOv2.cs 下载 YOWOv2: A Stronger yet Efficient Multi-level Detection Framework for Real-time Spatio-temporal Action 代码实现参考 https://github.com/hpc203/YOWOv2-video-action-detect-onnxrun 训练源码 GitHub

    2024年04月09日
    浏览(56)
  • 掌握 JavaScript:从初学者到高级开发者的完整指南之JavaScript对象(二)

    可以大体分页3大类: 第一类:基本对象,我们主要学习Array和JSON和String 第二类:BOM对象,主要是和浏览器相关的几个对象 第三类:DOM对象,JavaScript中将html的每一个标签都封装成一个对象 1.1.1 基本对象 1.1.1.1 Array对象 语法格式 Array对象时用来定义数组的。常用语法格式有如下

    2024年02月07日
    浏览(59)
  • Redis详解:.NET Core开发者的面试与应用指南

    本指南为.NET Core开发者提供了Redis的全面解析,包括其作为内存数据库的优势、数据类型、持久化策略、高可用性架构等。同时,介绍了如何使用StackExchange.Redis、FreeRedis和NewLife.Redis等.NET客户端库进行Redis操作,并提供了面试中可能遇到的Redis相关问题的解答,是.NET Core开发者和求职者的宝贵资源。

    2024年04月08日
    浏览(45)
  • 为什么超过500万开发者选择了ASP.NET Core?

    ASP.NET Core 是一个新的开源和跨平台的框架,用于构建如 Web 应用、物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序。 ASP.NET Core 应用可运行于 .NET Core 和完整的 .NET Framework 之上。构建它的目的是为那些部署在云端或者内部运行(on-premises)的应用提供

    2024年02月04日
    浏览(49)
  • 【深入浅出Selenium库的百变玩法】: 掌握Web自动化测试的关键技术和策略,包括元素定位、页面操作、动态内容处理等,适用于初学者和高级开发者的综合指南

    Selenium是一个功能强大的库,支持多种高级操作,如处理多窗口、多标签页、键盘与鼠标事件、滚动操作等。掌握Selenium可以大大提高Web应用的测试效率和覆盖范围。希望这篇文章能帮助你开启Selenium进行自动化测试的新篇章。 Selenium也是一个广泛使用的自动化测试工具,它支

    2024年02月20日
    浏览(59)
  • 如何成为一名高效的前端开发者(10X开发者)

    如今,每个人都想成为我们所说的“10倍开发者”。然而,这个术语经常被误解和高估。 本质上,一个高效或者10倍开发者,在我看来,是指那些能够充分利用所有可用工具的人,通过让这些工具处理冗余和重复的任务,使他们能够专注于复杂和创造性的工作。以下是一些成

    2024年02月05日
    浏览(68)
  • 小米手机开发者选项在哪?小米手机怎么打开开发者选项

    小米手机开发者选项在哪?小米手机的开发者选项是什么?开发者选项是小米手机中的隐藏功能,为什么我们会问起这个呢?因为普通的设置我们都很容易就能找到,但开发者模式是需要用特殊的操作才能将其唤醒。下面就让我们看看怎么将这个隐藏设置给唤醒吧! 第1步:

    2024年02月10日
    浏览(42)
  • 极路由怎么申请开发者权限?极路由开发者模式的详细教程

    极路由最新固件已经开通了root权限,供有经验的同学自助开发插件。鉴于部分同学依然不知道如何申请开发者权限,懒蛇写这篇教程简单讲一下申请过程。 1、浏览器输入192.168.199.1,进入极路由管理页面,点击进入云平台。 2、云平台选择“路由器信息” 3、滚动到页面底部

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包