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


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

    1.关于Span

    • 在NET Core 2.1中首次引入

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

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

    2.和内存的关系

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

    3.性能测试

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

      3.1 数组初始化

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

     

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

      第一种(常规):

       第二种(复制):

       第三种(Span切片):

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

     

     4. 切片

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

    5. ReadOnlySpan

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

     6. Span局限性

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

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

    3. Span不能被装箱

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

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

  • 相关阅读:
    文件夹怎么加密码?文件夹怎么设置密码?
    STM32F103 CubeMX 使用USB生成鼠标设备
    Mysql主从复制数据架构全面解读
    项目:TCP在线云词典
    牛逼!2022 最新 Spring 面试题
    嵌入式-C语言关系运算符
    java毕业生设计学科竞赛管理系统计算机源码+系统+mysql+调试部署+lw
    请求代理转发(三)
    MybatisPlus简介
    万邦京东获得JD商品详情 API 返回值说明
  • 原文地址:https://www.cnblogs.com/YKAndXLL520/p/17814671.html