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#上使用本机代码,给我们以更强的性能。
到此这篇关于C#中Span相关性能优化建议的文章就介绍到这了,更多相关c# Span性能优化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C#中Foreach循环遍历的本质与枚举器详解
目录 前言 1.创建一个控制台应用程序 2.编写测试代码并分析 3.总结 前言 对于C#里面的Foreach学过 语言的人都知道怎么用,但是其原理相信很多人和我一样都没有去深究.刚回顾泛型讲到枚举器让我联想到了Foreach的实现,所以进行一番探究,有什么不对或者错误的地方大家多多斧正. 1.创建一个控制台应用程序 2.编写测试代码并分析 在Program类中写一个foreach循环 class Program { static void Main(string[] args) { List p
-
C#利用File方法对文件的操作总结(字节写入和读取)
C#文件的读和写提供了非常多的方法基本一两行就可以搞定"读和写",在编程里还是比较重要的 什么是读? 你的程序去读你磁盘里的文件 上面是写? 你的程序在你磁盘创建文件 有什么用? 可以保存数据,用户等2次打开时就不用重新加载,或者软件异常,把异常信息或日志信息等进行保存 @符作用: 路径使用是字符串类型,而路径有非常多的" \" 而如\n表示的是换行,为了不让这些"\"起到转义的意思 在路径前使用@表示这字符串并不需要其转义 所以写路径必须得在前
-
关于C#操作文件路径(Directory)的常用静态方法详解
目录 Directory: 创建文件夹 删除文件夹 获取文件夹下的子文件夹 获取同类型的文件 判断文件夹是否存在 移动文件夹 总结 之前发过File对文件的操作 C# (File方法)对文件的操作,字节写入和读取 Directory: 主要用于操作文件的路径,如创建文件夹和获取文件夹的所有子目录, 简单的说就是"操作文件夹",而File是操作文件的 创建文件夹 直接使用静态方法,在C盘创建一个名为a的文件夹 Directory.CreateDirectory(@"C\a&qu
-
C#实现Redis的分布式锁
目录 Redis实现分布式锁(悲观锁/乐观锁) Redis连接池 使用Redis的SetNX命令实现加锁, 调用方式 Redis实现分布式锁(悲观锁/乐观锁) 对锁的概念和应用场景在此就不阐述了,网上搜索有很多解释,只是我搜索到的使用C#利用Redis的SetNX命令实现的锁虽然能用,但是都不太适合我需要的场景. Redis有三个最基本属性来保证分布式锁的有效实现: 安全性: 互斥,在任何时候,只有一个客户端能持有锁. 活跃性A:没有死锁,即使客户端在持有锁的时候崩溃,最后也会有其他客户端能获得
-
C#代码延时的几种实现
目录 Task.Delay();异步实现 线程实现: 计时器方式实现: Task.Delay();异步实现 using System; using System.Threading.Tasks; namespace csharpYS { class Program { static void Main(string[] args) { Console.WriteLine("Mian方法第一次输出..."); #region 第一种形式 var task_1 = Task.Run(asy
-
C#和vb.net实现PDF 添加可视化和不可见数字签名
目录 1. 在VS程序中通过Nuget安装 Spire.PDF for .NET 版本7.8.2,安装步骤如下: 2.在VS程序中添加如下代码添加数字签名 2.1 添加可视化数字签名 2.2 添加不可见数字签名 本文通过C#程序代码展示如何给PDF文档添加可视化数字签名和不可见数字签名.可视化数字签名,即在PDF文档中的指定页面位置添加签名,包含相关文字信息和签名图片等:不可见数字签名,即添加签名时不在文档中指定签名位置,在文档正文中不显示相关数字签名信息. 这里签名是通过PdfOrdinary
-
C#DirectoryInfo类用法详解
DirectoryInfo类是System.IO命名空间的一部分.它用于创建,删除和移动目录.它提供了执行与目录和子目录相关的操作的方法.这是一个密封的类,所以不能继承它. DirectoryInfo类提供了下面列出的构造函数,方法和属性. C# DirectoryInfo语法 [SerializableAttribute] [ComVisibleAttribute(true)] public sealed class DirectoryInfo : FileSystemInfo C# Dir
-
C# 数组删除元素的实现示例
本文主要介绍了C# 数组删除元素的实现示例,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _1207_数组删除元素 { class Program { //只能在动态数组ArrayList类中对数组执行删除元素的操作. //因为动
-
C#中Span相关的性能优化建议
目录 引言 什么是Span 关于String的一段性能提升 测试代码 最终性能对比 写在最后 引言 C# 是一门现代化的编程语言,与Java十分的相似.熟练的开发者甚至能三天无缝切换到Java.生态性能也是遍地开花.今天, 让我们来学习一下C#中的Span相关的性能优化吧 什么是Span System.Span 是在 .NET 中发挥关键作用的新值类型.使用它,可以表示任意内存的相邻区域,无论相应内存是与托管对象相关联,还是通过互操作由本机代码提供,亦或是位于堆栈上.除了具有上述用途外,它仍能确
-
前端性能优化建议
前言: 一说到性能优化,大家都不约而同的想起了雅虎的军规,2-5-8原则,3秒的首屏准则等等,这些规则在开发中虽然不是强制要求的,但是为了追求页面性能的完美体验,就不得不对代码进行修改和优化. 下面就与大家一同分享一下我了解的一些性能优化指标: 一.加载优化 1. 减少HTTP请求:尽量减少向服务器发送的请求数,节省网络资源,所有静态资源都要放在服务器端并设置缓存,并且要尽量使用长缓存. 2. 压缩代码:减少资源大小可加快网页的显示速度,对代码进行压缩,并在服务器开启Gzip 3. 无阻塞:头部
-
oracle 性能优化建议小结
原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 尤其是"主键ID=?"这样的条件. 原则二: SELECT子句中避免使用 ' * ': ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 . 简单地讲,语句执行的时间越短越好(尤其对于系统的终端用
-
jQuery性能优化28条建议你值得借鉴
jQuery性能优化28条建议 一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来.我也做了一个jQuery性能优化的简明样式表,你可以打印出来或者设为桌面背景. 一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 复制代码 代码如下: $('#content').hide(); 或者从ID选择器继承来选
-
Vue中的性能优化方案
目录 减少响应式使用 1. 使用 computed 缓存计算结果 2. 本地化响应式变量 3. 函数式组件(Vue2) 减少 DOM 渲染压力 1. DOM 频繁切换展示的情况使用 v-show 2. keep-alive 缓存组件状态 3. 路由懒加载 4. 图片懒加载 5. 组件销毁时要清除定时器.EventListener 6. 列表使用唯一 key 减少打包体积 1. 开启 gzip 压缩 2. 按需引入第三方组件 最近使用 Vue 开发的过程中使用到一些对于性能有所提升的编码方式,所以
-
JQuery性能优化的几点建议
针对jquery性能优化这个主题,想必大家都有所了解.下面是我搜集点一点资料关于jquery性能优化,大家可以参考参考. 一.选择器性能优化建议 1. 总是从#id选择器来继承:这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了: 2. 在class前面使用tag:jQuery中第二快的选择器就是tag选择器(如$('head')),因为它和直接来自于原生的Javascript方法getElementByTagName().所以最好总是用tag来修饰cla
-
MySQL性能优化技巧分享
MySQL性能优化 在互联网公司MySQL的使用非常广泛,大家经常会有MySQL性能优化方面的需求.整理了一些在MySQL优化方面的实用技巧. Schema与数据类型优化 整数通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREMENT 完全"随机"的字符串(如:MD5().SHA1()或者UUID()等产生的字符串)会任意分布在很大的空间内,会导致INSERT以及一些SELECT语句变的很慢 如果希望查询执行得快速且并发性好,单个查询最好不要做太多的关联查询(互联网公
-
Android 进阶实现性能优化之OOM与Leakcanary详解原理
目录 Android内存泄漏常见场景以及解决方案 资源性对象未关闭 注册对象未注销 类的静态变量持有大数据 单例造成的内存泄漏 非静态内部类的静态实例 Handler临时性内存泄漏 容器中的对象没清理造成的内存泄漏 WebView 使用ListView时造成的内存泄漏 Leakcanary leakcanary 导入 leakcanary 是如何安装的 leakcanary 如何监听Activity.Fragment销毁 RefWatcher 核心原理 流程图 本文主要探讨以下几个问题: And
-
MySQL数据库性能优化介绍
目录 为什么做优化?? 从哪些方面入手?? 解决方案是什么??? 要怎样选择??? SQL优化 总结 为什么做优化?? 因为数据量太多了,项目部署上线再到用户使用,每天数据增长几十万条,给服务器带来非常大的负担,互联网一直追求高性能,可是随着业务规模变大,用户数量变多,服务器的性能越来越差,因此我们不得不对数据库有更高要求. 从哪些方面入手?? 第一,是查询的速度,我们期望数据量到达TB级别仍然能够实现百万级别查询速度. 第二.是并发量,我们对它的要求能够同时处理几千甚至上万的并发访问,还要配
-
.NET性能优化之为集合类型设置初始大小的方法
目录 前言 集合类型 List源码 Queue.Stack源码 HashSet.Dictionary源码 总结 附录 前言 计划开一个新的系列,来讲一讲在工作中经常用到的性能优化手段.思路和如何发现性能瓶颈,后续有时间的话应该会整理一系列的博文出来.今天要谈的一个性能优化的Tips是一个老生常谈的点,但是也是很多人没有注意的一个点.在使用集合类型是,你应该设置一个预估的初始大小,那么为什么需要这样做?我们一起来从源码的角度说一说. 集合类型 我们先来聊一聊.NET BCL库中提供的集合类型,对于
随机推荐
- JAVA/JSP学习系列之八(改写MySQL翻页例子)
- 原创批处理之网站屏蔽与解除屏蔽批处理
- java 中JXL操作Excel实例详解
- 使用Python编写基于DHT协议的BT资源爬虫
- firebird Embedded模式(.net 3.5)
- 嵌套repeater示例分享
- php 文件夹删除、php清除缓存程序
- Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
- python中将阿拉伯数字转换成中文的实现代码
- 给easyui的datebox控件添加清空按钮的实现方法
- Powershell中请求WebServices并以JSON格式输出结果
- java开发gui教程之jframe监听窗体大小变化事件和jframe创建窗体
- 禁止F5等快捷键的JS代码
- 新手站长1月打造5000ip娱乐站
- 深入分析C++中执行多个exe文件方法的批处理代码介绍
- 详解C 语言项目中.h文件和.c文件的关系
- IntelliJ IDEA 安装vue开发插件的方法
- Python实现处理逆波兰表达式示例
- Python数据可视化教程之Matplotlib实现各种图表实例
- 微信小程序表单验证功能完整实例