首页 > 其他分享 >.NET点滴:Span<T>

.NET点滴:Span<T>

时间:2022-12-04 12:00:45浏览次数:46  
标签:arr Span ++ foreach var NET 点滴 内存

  把一个数组的全部元素加1,有什么好办法,于是有了下面的分析:

var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//方法一
foreach (var i in arr)
{
i++;
}
//方法二
for (var i = 0; i < arr.Length; i++)
{
arr[i] += 1;
}
//方法三
foreach (ref var i in arr.AsSpan())
{
i++;
}

  方法一在编译时会报错的,提示如下:无法为"i"赋值,因为它是"foreach"迭代变量,foreach循环时,是通过yield return返回的只读数据,所以不能给它赋值。

  方法二没有问题,遍历元素,轮询加1。

  方法三比较有意思了,是通过Span<T>来用ref(可以理解成指针,或引用)的方式来,来指向数组的元素,实现加1。

  关于Span<T>,借用官方的一句话:“由于 Span<T> 是任意内存块(可以是托管内存,本机内存,堆栈内存)的抽象,因此 Span<T> 具有参数的类型和方法的方法将 Span<T> 在任何对象上操作, Span<T> 而不考虑它所封装的内存类型。”,可以清楚的理解Span<T>的专门作用。

  关于方法二和方法三的性能怎么样,下来是测试代码和结果,供大家参考:

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

BenchmarkRunner.Run<TestSpan>();

public class TestSpan
{
[Benchmark]
public void Demo1()
{
var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach (ref var i in arr.AsSpan())
{
i++;
}
}

[Benchmark]
public void Demo2()
{
var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (var i = 0; i < arr.Length; i++)
{
arr[i] += 1;
}
}
}

结果:

.NET点滴:Span<T>_数组

  想要更快更方便的了解相关知识,可以关注微信公众号 

.NET点滴:Span<T>_数组_02

 

标签:arr,Span,++,foreach,var,NET,点滴,内存
From: https://blog.51cto.com/axzxs/5909952

相关文章

  • .NET点滴:Span<T>
    把一个数组的全部元素加1,有什么好办法,于是有了下面的分析:vararr=newint[]{1,2,3,4,5,6,7,8,9};//方法一foreach(variinarr){i++;}//方......
  • .NET点滴:Span<T>
    把一个数组的全部元素加1,有什么好办法,于是有了下面的分析:vararr=newint[]{1,2,3,4,5,6,7,8,9};//方法一foreach(variinarr){i++;}//方......
  • Kubernetes 的 NameSpace 无法删除应该怎么办?
    概述有时候我们操作不规范,或者删除的先后顺序有问题,或者某项关键服务没有启动,导致Kubernetes经常会出现无法删除NameSpace的情况。这种情况下我们应该怎么办?规范删除流......
  • Kubernetes 的 NameSpace 无法删除应该怎么办?
    概述有时候我们操作不规范,或者删除的先后顺序有问题,或者某项关键服务没有启动,导致Kubernetes经常会出现无法删除NameSpace的情况。这种情况下我们应该怎么办?规范删除......
  • 基于jenkins+kubernetes的cicd流程实践三:清除镜像定时任务
    6.定时清除历史镜像:万里长征的最后一步收尾工作,换一种更“原生”的玩法,找一找新感觉,手搓走起.....参考:https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/......
  • 基于jenkins+kubernetes的cicd流程实践一:环境搭建及方案原理
    1.基础环境:Centos7.9,kubernetes:v1.21.5node-1@112(master):docker,containerd,harbornginx(80),git,etcdnode-2@109(master/worker):docker,containerd,ingress_nginx(80),etcd,glusterfs......
  • 基于jenkins+kubernetes的cicd流程实践二:微服务迁移脚本
    5.web层服务迁移:​ (1)项目启动脚本:start.sh#!/bin/bashsrv_name="goods_web_main"chmod+x./${srv_name}ifpgrep-x${srv_name};thenecho"${srv_name}isr......
  • 推荐一款采用 .NET 编写的 反编译到源码工具 Reko
    今天给大家介绍的是一款名叫Reko的开源反编译工具,该工具采用C#开发,广大研究人员可利用Reko来对机器码进行反编译处理。我们知道.NET7有了NativeAOT的支持,采用NativeAOT......
  • 测试篇 c#net7nativeAOT桌面图标位置备份器
    项目备份windows桌面的图标位置为jsonc#项目是net7nativeAOT的框架,内有json生成器的处理.编译方式在.csproj文件的路径上面(删除路径)输入cmd,回车:dotnetpub......
  • 进击的K8S:Kubernetes基础概念
    Kubernetes简介Kubernetes简称K8S(因为k和s中间有8个字母),是一个开源的容器集群管理平台,基于Go语言编写。使用K8S,将简化分布式系统上的容器应用部署,使得开发人员可以专注于......