一、前言

昨天在群里讨论怎么样效率的把一个字符串进行反转,一般的情况我们都知道,只要对String对象进行操作,
那么就会生成新的String对象,比如"1"+"2" 这样的操作会生成新的String对象。

二、通正方案

通常我们要反转一个字符中我们都是使用如下方法:

static string Reverse1(string original)
{
char[] arr = original.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}

这种方式,只是通过将数组反转的方式重新排列了字符的顺序,最终还是要重新生成新的String对象,这样无疑会在数据量比较大的时候,会增加GC负担的。

三、unsafe方案

本文主要想讲述使用**unsafe**的方式来优化性能,当然在最后面还提到了**c# 7.0**中的新特性来实现相同功能。

unsafe关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。有关更多信息,请参见不安全代码和指针(C# 编程指南)。

可以在类型或成员的声明中使用 unsafe 修饰符。因此,类型或成员的整个正文范围均被视为不安全上下文。

c#在默认情况下生成的都是安全代码,即进行了代码托管(.NET的CLR机制好处之一就是自动进行代码托管,适时的释放内存,程序员便不必考虑资源的回收问题),而此时,指针不能出现在安全代码的编译条件下。
如果因需要想在c#中使用指针,那么unsafe便是一个通道(当然在使用前,需在项目属性的生成选项中,选择“允许不安全代码”)。

直接上代码吧:

string hello = "hello world你好";

int len = hello.Length * ;

fixed (char* strs = hello)
{
byte* start = (byte*)strs;
byte* end = start + len - ;
byte[] ch = new byte[];
if (start != null)
{
while (start < end)
{
ch[] = *start;
ch[] = *(start + ); *start = *(end-);
*(start+) = *(end); start = start + ; *(end - ) = ch[];
*(end) = ch[]; end = end - ;
}
} }

fixed 语句设置指向托管变量的指针并在 statement 执行期间“钉住”该变量。如果没有 fixed 语句,则指向可移动托管变量的指针的作用很小,因为垃圾回收可能不可预知地重定位变量。C# 编译器只允许在 fixed 语句中分配指向托管变量的指针。(这句话是机器翻译的,呵呵)

好了最终的结果就是: hello="好你dlrow olleh" , 但是我们并没有new String哦!

四、C#7 Ref locals ?

其实对说新的C# 7.0来说,它为我们带来了新ref关键字,来处理本地引用(Ref locals )。

让我们来开一下脑洞,下面是段成立的代码:

string hello = "hello world你好";
ref char strRef = ref getStringArray(ss, ); static ref char getStringArray(char[] str,int index)
{
return ref str[index];
}

strRef是什么?我们是不是可以通过这样的方式,来达到与使用指针相同的目地?请继续关注下一篇文章。

同时宣传一下我的新博客,当然博客园我也会更新的。 http://www.dotnet.ren

.NET Core中妙用unsafe减少gc提升字符串处理性能的更多相关文章

  1. .net core中关于System.Text.Json的使用

    在.Net Framework的时候序列化经常使用Newtonsoft.Json插件来使用,而在.Net Core中自带了System.Text.Json,号称性能更好,今天抽空就来捣鼓一下. 使用起 ...

  2. asp.net core中IHttpContextAccessor和HttpContextAccessor的妙用

    分享一篇文章,关于asp.net core中httpcontext的拓展. 现在,试图围绕HttpContext.Current构建你的代码真的不是一个好主意,但是我想如果你正在迁移一个企业类型的应用 ...

  3. 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题

    在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关 ...

  4. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  5. ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化

    原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...

  6. ASP.NET Core 中文文档 第三章 原理(15)请求功能

    作者:Steve Smith 翻译:谢炀(kiler398) 校对:姚阿勇(Dr.Yao).孟帅洋(书缘) 涉及到如何处理 HTTP 请求以及响应的独立 Web 服务器功能已经被分解成独立的接口,这些 ...

  7. 减少GC开销的措施

    程序的运行会直接影响系统环境的变化,从而影响GC的触发.若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响.为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销.具体 ...

  8. 减少GC开销的5个编码技巧

    在这篇文章中,我们来了解一下让代码变得高效的五种技巧,这些技巧可以使我们的垃圾收集器(GC)在分配内存以及释放内存上面,占用更少的CPU时间,减少GC的开销.当内存被回收的时候,GC处理很长时间经常会 ...

  9. 最近发现的.net core中的一些bugs

    1.使用.net core的过程中发现TypeInfo.GetCustomAttributes()只能写在主线程中,否则如果该自定义特性存在于nuget中就会报错,貌似nuget中的dll仅在主线程使 ...

随机推荐

  1. Oracle用户权限分配

    一.权限分类 系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言). 实体权限:某种权限用户对其它用户的表或视图的存取权限.(是针对表或视图而言的). 二.系统权限管理 1.系统权限分类: ...

  2. 笔记整理--socket_server

    epoll精髓 - 彭帅 - 博客园 - Google Chrome (2013/10/11 20:47:52) epoll精髓 在linux的网络编程中,很长的时间都在使用select来做事件触发. ...

  3. JAVA WEB 中的编码分析

    JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...

  4. mybatis 参数为list时,校验list是否为空, mybatis ${}与#{}的区别,Mybatis sql in

    1.mybatis 参数为list时,校验list是否为空 2. mybatis ${}与#{}的区别 简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select * fr ...

  5. Add Strings Leetcode

    Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2 ...

  6. Java经典案例之-“成绩等级划分”

    /** * 描述:在对话框中输入学习成绩,利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示, * 60分以下的用C表示. * 分析:可以利用三目运算符 ...

  7. Hibernate常见异常

    1.数据库编码问题 主要错误信息 WARN: SQL Error: 1366, SQLState: 22001 ... ERROR: Data truncation: Incorrect string ...

  8. phpcms推荐位数据库字段详解

  9. 修改GitHub上项目语言显示的问题

    问题 最近将自己写的博客放到github上了.由于使用了富文本编辑器.jQuery.Bootstrap等第三方插件,导致js.css等代码远远超过你自己写的代码. 于是也就成这样了 而且这里也显示Ja ...

  10. 在Winfrom下实现类似百度、Google搜索自能提示功能

    前记:数据源来自页面的一个ComboBox的数据源List<Contract>集合 页面放置一个TextBox(搜索框).ListBox(显示搜索出来的数据),ListBox位置位于Tex ...