C#中Span相关的性能优化建议
作者:饭熟了 发布时间:2021-07-05 15:42:26
标签:c#,span,性能
目录
引言
什么是Span
关于String的一段性能提升
测试代码
最终性能对比
写在最后
引言
C# 是一门现代化的编程语言,与Java十分的相似。熟练的开发者甚至能三天无缝切换到Java。生态性能也是遍地开花。今天, 让我们来学习一下C#中的Span相关的性能优化吧
什么是Span
System.Span 是在 .NET 中发挥关键作用的新值类型。使用它,可以表示任意内存的相邻区域,无论相应内存是与托管对象相关联,还是通过互操作由本机代码提供,亦或是位于堆栈上。除了具有上述用途外,它仍能确保安全访问和高性能特性,就像数组一样。
读过官网的一段描述,可知:Span是一个值类型。他的价值在于可以让我们将任何类型存放于相邻区域。这包括:
非托管内存
堆栈
托管内存
关于String的一段性能提升
有些网站呀,做完活动后,通常会公布中奖名单(doge)。现在的需求是,我们要将用户名的中间几个字打码,例如:林深鹿 ,我们要将其写为林*鹿 来保护用户隐私 。
来看一段代码:
我们将 “程序媛小庄” 作为参数,拼接了一下字符串,来看下输出结果:
非常的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个字符,并填充为 *
测试代码
最终性能对比
写在最后
上述代码Span无论是在内存占用还是平均时间上都超过了string 原生的API
Span 提供的一系列API,让我们能够在C#上使用本机代码,给我们以更强的性能。
来源:https://juejin.cn/post/6991844751142027294


猜你喜欢
- 今天要介绍一个概念,对象的克隆。本篇有一定难度,请先做好心理准备。看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和
- 开发环境:jdk版本:JDK8maven版本:maven-3.5.2开发工具:Itellij IDEA 2017.1前提条件:已安装以上软件
- NameServer1.架构设计消息中间件的设计思路一般都是基于主题订阅与发布的机制,RocketMQ也不例外。RocketMQ中,消息生产
- 一、Flutter介绍Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。Flutter可以与现
- 目录登陆界面的实现登陆界面代码Login类login的监听类 LoginListener聊天界面运行图Client类代码Server代码登陆
- 第一篇讨论了面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,本章主要讨论异常处理,Java小应用程序
- 60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计
- 本文实例为大家分享了Android利用Canvas类绘制图形的具体代码,供大家参考,具体内容如下首先介绍一下相关基础知识。1.画笔(pain
- PostMapping接收json参数后返回404问题描述js中传递json数据给后端,后端可以正常接收参数,但返回404。js
- 项目结构这个是在网上找的资源,出处记不得了,记录一下。程序的总体结构,很简单的:核心代码代码如下:ArrComparator.java类im
- 在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高、延迟时
- /// <summary> /// 安装的excel的版本,0为没有安装,大于1说明安装了多个. /// </summar
- 概念 在 HTML 中,<a>, <form>, <img>, <script>,
- Handler每个初学Android开发的都绕不开Handler这个“坎”,为什么说是个坎呢,首先这是Android架构的精髓之一,其次大部
- package com.letv.cloud.spider;import java.util.HashSet;import java.uti
- 1.简述描述:1、对输入的字符串进行加解密,并输出。2、加密方法为:当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如
- 对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题,比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了Mult
- 一,抽象的实现using System;using System.Collections.Generic;using System.Linq
- 一、同步容器 1、Vector——>ArrayList vector 是线程(Thread)同步(Synchron
- 简单工厂模式介绍:概要:简单工厂模式,又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模