Dotnet中Span, Memory和ReadOnlySequence之浅见

过年啦,写个短点的。同时,提前给大家拜个年。

总有小伙伴们跑过来讨论关于Span和Memory的使用,眼瞅是最近关于Span的文章有点多,看飞了。

今天写这个,就是往回拉一拉。

写之前,先声明一下。这些内容是我自己使用的一些经验,并不代表这些类的全部内容就是这些,只是说,我是这么用的,而且用得很好。

1. Span

Span在我的概念中,就是一个快速的同步访问器。

就这么简单。

Span很快。在我前边关于Span的文章中分析过,可以移步【传送门】去看。而且,它与foreach一起使用也很快,主要是因为Span的GetEnumerator使用了引用返回。

你看,Span本身就被设计成了一个非常快的东西。

同时,Span是同步的。也就是说,它没有提供任何异步的方法和属性。

说到为什么Span是同步的,这倒是一个问题。我们需要从根上来找找。Span背后的连续内存块,主要来自于以下几个方面:

  • 数组的切片

  • Memory

  • 非托管指针void*

  • stackalloc

其中,第一个是堆上分配的数组的一部分。第二个是基于连续内存的。第三个非托管void*本身就是同步的。

第四个单独说一下。stackalloc提供的是在线程的堆栈上分配内存。如果Span可以使用异步,会导致一个线程可以访问另一个线程的堆栈。显然这是不安全和不合理的。所以,保持Span同步是必须的。

所以,Span就是一个性能非常好的,针对连续内存的同步访问器。

2. Memory

Memory,就是一个实际的内存块。

与Span不同,Memory可以在异步流中使用,同时,它还提供了获取同步访问器的方法Memory<T>.Span()

Memory可以有多种来源,例如:

  • 数组切片

  • MemoryMarshal的各种Create方法,例如MemoryMarshal.CreateFromPinnedArray()这样的。

第一个是最基本的用法,从数组T[]中取一个切片成为Memory。

第二个方法会复杂一些,用了一个特殊的方法来创建Memory。像上边的例子,CreateFromPinnedArray用了一个已经固定的数组。在Dotnet中,可以通过固定一个对象,来禁止GC移动对象。这在将Memory传递给非托管对象时非常有用。

总之,Memory就是一个实际的内存块。这个内存块可以被用到任何地方,并可以使用它的同步访问器Span进行访问。

3. ReadOnlyX

印象中有三种:ReadOnlySpan、ReadOnlyMemory、ReadOnlySequence。

没什么特别的,就是ReadOnly,只读啦。

前两个,ReadOnlySpan、ReadOnlyMemory,就是Span和Memory对应的只读对象。

4. ReadOnlySequence

ReadOnlySequence也不算复杂,就是一个ReadOnlyMemory元素的序列。

基于操作系统的内存管理,有时候Memory不是连续的,可能会分片段,所以就需要有个结构来表示一个Memory链/Memory列表类似的序列。这是ReadOnlySequence的由来,而它本身也是一个ReadOnlyMemory的列表。

同时,它也提供了一些属性来优化序列中包含一个元素的情况:

  • IsSingleSegment,用来快速检查是否只包含一个内存项

  • FirstSpan,该速访问ReadOnlySpan访问器的第一个内存项

因此虽然被定义为序列,但处理单个元素,例如单个Span或Memory也容易很多。

这就是今天的全部内容了。

有没有跟你用的不一样?

文章最后,再次祝大家牛年大吉,万事胜意~

喜欢就来个三连,让更多人因你而受益

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

睹物可否不思人

早上送女儿去兴趣班练舞蹈 顺便去超市买菜 因前阵生病的缘故 休息时都没有做饭 不知道买菜还会勾起我的痛楚 站在那里等着宰鱼 可视线被花甲吸引 注目良久 睹物思人 生活中的细细碎碎 都能令我浮想联翩 一句话 一处景 都能想起你的片段 回忆里有丝丝的甜 回忆里有阵阵的痛 突然…

华为的型号命名规则_华为最实惠5G手机来了!畅享Z 5G宣布:5月24日发

5月18日消息&#xff0c;华为宣布畅享系列首款5G手机畅享Z 5G将于5月24日发布。畅享Z系列的到来将使华为在千元市场实现5G覆盖&#xff0c;这也将成为华为价格最低的5G手机系列&#xff0c;值得期待。目前关于畅享Z的细节还很少&#xff0c;有消息称代号为Teller的5G新机隶属于…

程序员又背锅了!虾米音乐代码注释惊现“穷逼vip”

11 月 19 日&#xff0c;在 V2EX 社区的技术版一名网友发布了一篇名为《虾米 mac 客户端发现个好玩的注释》的帖子&#xff0c;文中贴出了阿里巴巴旗下虾米音乐 Mac 版客户端的代码&#xff0c;引发了网友争议。发帖人称&#xff0c;虾米音乐客户端的程序员竟然称一些短期VIP客…

python list转dict_python中将list转为dict

最近在项目中经常遇到将list转为dict形式&#xff0c;之前都只会用for循环&#xff0c;取出list中的每个值&#xff0c;update到dict中。 示例1 scrabble_scores [(1, "E A O I N R T L S U"), (2, "D G"), (3, "B C M P"), (4, "F H V W …

计算机无法安装小丸工具箱,小丸工具箱电脑版

小丸工具箱电脑版是一款可以压制H264AAC视频的图形界面工具&#xff0c;内核是x264、neroaac、mp4box等开源软件。小丸工具箱电脑版能够封装mp4或抽取mp4的音频或视频&#xff0c;压制视频中的音频。它的功能非常丰富&#xff0c;是属于实用的视频压制器!小丸工具箱&#xff0c…

一个简单的dotnet tool

dotnet tool对应的工具&#xff0c;本质上是一个控制台应用&#xff0c;在调用这个应用时&#xff0c;会根据传入的参数&#xff0c;执行应用内部的逻辑。关于dotnet tool命令使用&#xff0c;参照https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-tool-install下面…

内存和显存_【硬件资讯】显存再升级?Nvidia新卡实锤GDDR6X!显存大升级能否带来性能提升??...

新闻1&#xff1a;美光泄密 RTX 3090显卡用上GDDR6X显存&#xff1a;带宽堪比HBM2NVIDIA新一代显卡越来越近了&#xff0c;8月31日就有可能公布重大消息&#xff0c;安培GPU核心的RTX 30系列最快下个月就能买到。首发的第一波肯定是高端卡&#xff0c;除了RTX 3080、RTX 3080 T…

Web 2.0 编程思想:16条法则

原文&#xff1a;Thinking in Web 2.0: Sixteen Ways 作者&#xff1a;Dion Hinchcliffe URL:http://sd.csdn.net/n/20060518/90603.html 1、在你开始之前&#xff0c;先定一个简单的目标。无论你是一个Web 2.0应用的创建者还是用户&#xff0c;请清晰的构思你的目标。就像“我…

神舟笔记本电源管理软件_笔记本电脑长期不用充不上电了?原来问题就出在这儿...

也许有很多使用笔记本电脑的用户&#xff0c;都会遇到这样一种情况&#xff1a;笔记本电脑长期没有使用&#xff0c;导致电池充不了电的现象。遇到这样一种情况该如何进行解决呢&#xff1f;这确实有点难倒很多用户了&#xff0c;难道电池坏了&#xff0c;需要重新更换新的笔记…

浅析PageRank算法

机器学习很早就对Google的PageRank算法很感兴趣&#xff0c;但一直没有深究&#xff0c;只有个轮廓性的概念。前几天趁团队outing的机会&#xff0c;在动车上看了一些相关的资料&#xff08;PS&#xff1a;在动车上看看书真是一种享受&#xff09;&#xff0c;趁热打铁&#xf…

小学计算机课教学设计,小学信息技术教学设计三篇

【导语】教案是教师为顺利而有效地开展教学活动&#xff0c;根据课程标准&#xff0c;教学大纲和教科书要求及学生的实际情况&#xff0c;以课时或课题为单位&#xff0c;对教学内容、教学步骤、教学方法等进行的具体设计和安排的一种实用性教学文书。无忧考网准备了以下内容&a…

Happy 牛 Year!牛年dotnet云原生技术趋势

首先给大家拜个年&#xff0c;祝大家&#xff1a;新年快乐&#xff0c;牛年大吉&#xff0c;牛转乾坤&#xff0c;一往无前&#xff01;2020年的春节&#xff0c;新冠疫情使得全球业务停滞不前&#xff0c;那时候&#xff0c;没有人知道会发生什么&#xff0c;因此会议被取消&a…

centos7python命令_02.将python3作为centos7的默认python命令

博客为日常工作学习积累总结&#xff1a;由于个人兴趣爱好对python有了解&#xff1a;1.安装Python3&#xff1a;参考博客&#xff1a;https://zhuanlan.zhihu.com/p/47868341安装依赖包&#xff1a;yum -y install zlib zlib-develyum -y install bzip2 bzip2-develyum -y ins…

SELECT语句“加锁选项”功能说明

阅读全文&#xff1a;http://www.cckan.net/forum.php?modviewthread&tid50 SELECT 语句中“加锁选项”的功能说明SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能。用户既能使用SQL Server的缺省设置也可以在select 语句中使用“加锁选项”来实…

windows传真和扫描由于不能访问您的文档_扫描识别工具Dynamic Web TWAIN全年最低价来了!错过再等一年...

Dynamic Web TWAIN是一个专为Web应用程序设计的TWAIN扫描识别控件。你只需在TWAIN接口写几行代码&#xff0c;就可以用兼容TWAIN的扫描仪扫描文档或从数码相机/采集卡中获取图像。然后用户可以编辑图像并将图像保存为多种格式&#xff0c;用户可保存图像到远程数据库或者ShareP…

计算机二级链表,计算机二级c语言上机考试——结构体与链表(3页)-原创力文档...

1&#xff1a;某学生的记录由学号、8门课程成绩和平均分组成&#xff0c; 学号和8门课程的成绩已在主函数中给出&#xff0c;请编写函数fun&#xff0c;其功能是&#xff1a;求出该学生的平均分&#xff0c;并放入记录的ave成员中。void fun(STREC *a){int i&#xff1b;a&…

程序员新人怎样在复杂代码中找 bug?

我曾经做了两年大型软件的维护工作&#xff0c;那个项目有 10 多年了&#xff0c;大约 3000 万行以上的代码&#xff0c;参与过开发的有数千人&#xff0c;代码 checkout 出来有大约 5 个 GB&#xff0c;而且 bug 特别多&#xff0c;open 的有上千&#xff0c;即使最高优先级的…

谈到云原生, 绕不开容器化

传送门什么是云原生&#xff1f;云原生设计理念.NET微服务Containers现在谈到云原生&#xff0c; 绕不开“容器”。在《Cloud Native Patterns》一书中&#xff0c;作者Cornelia Davis指出&#xff1a;“容器是云原生应用的基石”&#xff1b;云原生基金会将微服务容器化作为云…

python与matlab混合编程_python 与 matlab 混编

Matlab的官方文档中介绍了 Matlab 与其余编程语言之间的引擎接口&#xff0c;其中包括对于 Python 开放的引擎 API&#xff0c;可参考官方教程&#xff0c;其中包括引擎安装&#xff0c;基本使用&#xff0c;以及Python与Matlab之间的数据类型转换及交互。 在 Windows 系统中&a…

四川中级职称计算机考试考b级,四川省职称计算机B级考试1卷

一、单选题&#xff1a;(每题一分)1、安装调制调器不需要( )A.选择生产厂商和Modem型号B.Modem连接的端口C.选择所在国家及外拨电话号码D.选择的Modem的尺寸2、在Windows中&#xff0c;窗口还原是指将窗口还原到原来指定的( )A.窗口 B.尺寸C.图标 D.程序3、在Windows中&#xf…