C#中Span相关的性能优化建议

作者:饭熟了 时间:2021-07-05 15:42:26 

目录
  • 引言

  • 什么是Span

  • 关于String的一段性能提升

  • 测试代码

  • 最终性能对比

  • 写在最后

引言

C# 是一门现代化的编程语言,与Java十分的相似。熟练的开发者甚至能三天无缝切换到Java。生态性能也是遍地开花。今天, 让我们来学习一下C#中的Span相关的性能优化吧

什么是Span

System.Span 是在 .NET 中发挥关键作用的新值类型。使用它,可以表示任意内存的相邻区域,无论相应内存是与托管对象相关联,还是通过互操作由本机代码提供,亦或是位于堆栈上。除了具有上述用途外,它仍能确保安全访问和高性能特性,就像数组一样。

读过官网的一段描述,可知:Span是一个值类型。他的价值在于可以让我们将任何类型存放于相邻区域。这包括:

  • 非托管内存

  • 堆栈

  • 托管内存

关于String的一段性能提升

C#中Span相关的性能优化建议

有些网站呀,做完活动后,通常会公布中奖名单(doge)。现在的需求是,我们要将用户名的中间几个字打码,例如:林深鹿 ,我们要将其写为林*鹿 来保护用户隐私 。

来看一段代码:

C#中Span相关的性能优化建议

我们将 “程序媛小庄” 作为参数,拼接了一下字符串,来看下输出结果:

C#中Span相关的性能优化建议

非常的nice,非常的easy

接下来,我们来使用Span实现:


static void Main(string[] args)
{
   Console.WriteLine(ObfuscatePhoneSpan("程序媛小庄"));
}

static string ObfuscatePhoneSpan(string id)
{
   return string.Create(id.Length, id, (sc, value) =>
   {
       int n = id.Length / 2;
       int r = id.Length - (id.Length * 20 / 100) - n; //需替换的个数 = (总长) - (20%) - (一半)

value.AsSpan().CopyTo(sc);
       sc.Slice(n, r).Fill('*');
   });
}

value 变量是个字符串,它提供了AsSpan方法,让我们得到了Span的实例,最终通过Slice方法从n截取r个字符,并填充为 *

测试代码

C#中Span相关的性能优化建议

最终性能对比

C#中Span相关的性能优化建议

写在最后

上述代码Span无论是在内存占用还是平均时间上都超过了string 原生的API

Span 提供的一系列API,让我们能够在C#上使用本机代码,给我们以更强的性能。

来源:https://juejin.cn/post/6991844751142027294

标签:c#,span,性能
0
投稿

猜你喜欢

  • 为什么Spring和IDEA都不推荐使用 @Autowired 注解

    2023-12-08 17:54:44
  • Java基础学习之关键字和变量数据类型的那些事

    2023-09-17 04:31:24
  • C#计算矩阵的逆矩阵方法实例分析

    2021-11-06 18:24:29
  • Java SpringBoot启动指定profile的8种方式详解

    2023-07-31 21:48:03
  • spring boot学习笔记之操作ActiveMQ指南

    2023-09-12 20:11:52
  • C#简单输出日历的方法

    2023-11-13 05:56:10
  • 带你了解Java Maven的打包操作

    2022-08-03 15:23:33
  • 微信随机生成红包金额算法java版

    2023-07-27 16:01:39
  • java中Hibernate缓存形式总结

    2023-10-19 15:57:43
  • java编程约瑟夫问题实例分析

    2022-04-05 22:32:08
  • Java 八种基本类型和基本类型封装类

    2023-11-26 14:15:16
  • JAVA十大排序算法之桶排序详解

    2022-11-08 01:07:47
  • MyBatis在SQL语句中如何获取list的大小

    2021-08-15 12:09:55
  • Java源码解析HashMap成员变量

    2023-04-24 07:20:22
  • Java synchronized锁升级jol过程详解

    2023-04-15 04:58:51
  • Java注解Annotation原理及自定义注解代码实例

    2023-04-30 10:18:09
  • 浅谈Java序列化和hessian序列化的差异

    2022-11-17 07:46:13
  • Spring容器的创建过程之如何注册BeanPostProcessor详解

    2022-02-17 08:39:09
  • java实现简易外卖订餐系统

    2021-11-04 16:01:25
  • maven资源过滤打包后文件变大的处理方法

    2023-10-05 21:38:24
  • asp之家 软件编程 m.aspxhome.com