首页 > 编程语言 >编写高性能C#代码 —— Span<T>

编写高性能C#代码 —— Span<T>

时间:2023-11-07 11:45:59浏览次数:26  
标签:Span 测试 C# 切片 高性能 内存 数组 堆栈

Span 提供任意内存的连续区域的类型安全和内存安全表示形式。它是在堆栈而不是托管堆上分配的ref结构,是对任意内存块的抽象 。

1.关于Span

  • 在NET Core 2.1中首次引入

  • 提供对任意内存上的连续区域的读写视图

  • 利用索引/迭代来修改范围内的内存
  • 几乎无开销

2.和内存的关系

   Span 表示任意内存的连续区域。 Span<T>实例通常用于保存数组的元素或数组的一部分。 但是,与数组不同, Span<T>实例可以指向堆栈上托管的内存、本机内存或托管的内存。

3.性能测试

  Span通常用来处理数组,所以本次测试的场景是数组的切分:从一个数组的中间元素开始,获取并返回四分之一个元素。

  3.1 数组初始化

  这里我们准备一个数组分三种不同长度进行初始化,有利于覆盖到更多的测试情况。

 

  3.2 测试采用三种方式,用BenchmarkDotNet比较一下:

  第一种(常规):

   第二种(复制):

   第三种(Span切片):

   性能测试结果如下,可以看到Span的速度是很快的,且不占内存。

 

 4. 切片

  Span<T>.Slice()方法就是对内存进行切片,第三种方法区别于前两种,本质上不创建和销毁对象,可以认为是做到了内存0分配

5. ReadOnlySpan

  ReadOnlySpan是Span的只读表示形式,通常用在string的切片(因为string的不可变性)。

 6. Span<T>局限性

  1. Span是仅限存活在堆栈上的值类型

  2. Span不能是非堆栈类型的字段

  3. Span不能被装箱

  4. Span不能是异步方法的参数或局部变量

  5. Span不能被lambda表达式捕获

标签:Span,测试,C#,切片,高性能,内存,数组,堆栈
From: https://www.cnblogs.com/YKAndXLL520/p/17814671.html

相关文章

  • 《安富莱嵌入式周报》第326期:航空航天级CANopen协议栈,开源USB PD电源和功耗分析,开源Et
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 更新一期视频教程:BSP视频教程第28期:CANopen协议栈专题,CANopen主从机组网实战,CAN词典工具使用方法以及吃透PDO玩法https://www.armbbs.cn/forum.php?mod=viewthread&tid=12161......
  • 【mac】Alfred 无法调用Terminal
    原因:是从macapp商店安装的Alfredclass解决方案:建议从官网下载安装:https://www.alfredapp.com/参考:https://www.alfredforum.com/topic/14287-alfred-doesnt-find-terminalapp/......
  • Oracle中B-tree索引的访问方法(十一)-- 索引的分裂行为
    索引的分裂行为当某个索引块中要插入新的索引条目,但其中又没有可用空间时,就会发生索引的分裂。根据分裂发生所在的索引块类型的不同,可以分为在根块上发生的分裂,在分支块上发生的分裂和在叶子块上发生的分裂。下面,就这三种情况做分别介绍。从前面的实验中,我们已经看到,大约每个索引块......
  • VSS使用手册(VSS 6.0d/Visual SourceSafe)
    1VSS概述    版本控制是工作组软件开发中的重要方面,它能防止意外的文件丢失、允许反追踪到早期版本、并能对版本进行分支、合并和管理。在软件开发和您需要比较两种版本的文件或找回早期版本的文件时,源代码的控制是非常有用的。VisualSourceSafe是一种源代码控制系统,它......
  • C++禁用windows全局鼠标
    禁用全局鼠标的实现方式与禁用键盘类似,也是通过使用WindowsAPI函数来创建钩子来截取鼠标消息,然后在钩子函数中阻止特定鼠标事件的执行。下面是一个使用C++和WindowsAPI来禁用全局鼠标的示例代码:#include<iostream>#include<Windows.h>//定义全局的钩子句柄HHOOKmouseHook......
  • 马氏距离 Mahalanobis Distance
    马氏距离是由印度统计学家马哈拉诺比斯(P.C.Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧式距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的),并且是尺度无关的(scal......
  • SpringBoot获取配置文件-@Value、@ConfigurationProperties方式
    配置文件yml#phantomjs的位置地址phantomjs:binPath:windows:binPath-winlinux:binPath-linuxjsPath:windows:jsPath-winlinux:jsPath-linuximagePath:windows:imagePath-winlinux:imagePath-linuxphantomjs2:binPath2:I‘......
  • 相对熵/KL散度(Kullback–Leibler divergence,KLD)
    相对熵(relativeentropy)又称为KL散度(Kullback–Leiblerdivergence,简称KLD),信息散度(informationdivergence),信息增益(informationgain)。KL散度是两个概率分布P和Q差别的非对称性的度量。     KL散度是用来度量使用基于Q的编码来编码来自P的样本平均所需的额外的比特个......
  • 谷歌Chrome及微软Edge浏览器崩溃问题处理
    问题表现近期用户在使用谷歌Chrome及微软Edge浏览器时,出现网页崩溃无法访问的情况chromeedge原因分析根据错误提示,检查日志,系C:\Windows\System32\winhafnt64.dll文件不符合微软签名规则导致的冲突根据提示信息,检查到该文件发行公司为T.E.CSolutions(GZ,)Limited,查询......
  • 外汇110网:2023年第三季度FCA 共发布488则投资者警告
    11月3日,英国金融行为监管局(FCA)发布了最新的金融推广数据季度报告。该监管机构表示,人们可以通过该报告了解FCA如何提高整个市场标准,为金融消费者提供明确、公平且不具误导性的金融广告。在FCA的介入下,该季度期间共有5310则受监管公司的广告遭修改或撤销,其中39%的广告来自零售投资领......