介绍C#字符串的性能

简介

我们提供的服务有:成都网站制作、成都做网站、外贸营销网站建设、微信公众号开发、网站优化、网站认证、珠晖ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的珠晖网站制作公司

你在代码中处理C#字符串的方法可能会对性能产生令人吃惊的影响。程序中需要考虑两个由于使用字符串而产生的问题:临时字符串变量的使用和字符串连接。

背景知识

1.String是引用类型,在堆上分配内存。

2.String运算时会产生一个新的实例。当看到 myString.ToUpper() 时,我经常都会忘记它并不是改变 myString 的内容而是返回一整个全新的字符串(这是由于C# 字符串是不可变的)。

3.String 对象一旦生成不可改变(Immutable)。

4.定义相等运算符(== 和 !=)是为了比较 String 对象(而不是引用)的值。

String Comparison and Temporary String Creation

下面的例程是一个蹩脚的非大小写敏感的字符串比较。用于比较的例程的代码是:

 
 
 
 
  1. static bool BadCompare(string stringA, string stringB)
  2. {
  3.     return (stringA.ToUpper() == stringB.ToUpper());
  4. }

对于这段代码,FxCop 给出如下的建议:

这项建议的意思是每次对 ToUpper() 的调用都会创造一个临时字符串,而这个临时字符串是由垃圾收集器来创建和管理的。这需要额外的时间和使用更多的内存。 String.Compare 方法(相对来说)更加高效。

String Concatenation inside a loop

***那对测试例程设想字符串的连接是在一个循环里面进行的。

“蹩脚”的测试例程的代码如下:

 
 
 
 
  1. static string BadConcatenate(string [] items)
  2. {
  3.     string strRet = string .Empty;
  4.     foreach (string item in items)
  5.     {
  6.         strRet += item;
  7.     }
  8.     return strRet;
  9. }

当 FxCop 看到这段代码,它就会很愤怒,甚至用红色标记这项被破的规条! FxCop 这样说道:

“优良”的测试例程的代码如下:

 
 
 
 
  1. static string GoodConcatenate(string [] items)
  2. {
  3.     System.Text.StringBuilder builder = new System.Text.StringBuilder();
  4.     foreach (string item in items)
  5.     {
  6.         builder.Append(item);
  7.     }
  8.     return builder.ToString();
  9. }

这段代码几乎被用作展示 System.Text.StringBuilder 的用法的***例子。蹩脚的代码的问题是创建了过多的临时字符串。由于字符串的不可变特性,连接操作符(+=)实际上用原来那两个字符串来创建一个新的字符串,然后把原来的字符串实例指向这个新的字符串。

但是,依据 nprof 来研究代码性能,我们发现运行 BadConcatenate 只需总执行时间的 5.67% ,而 GoodConcatenate 则是 22.09% 。也就是说:

使用 StringBuilder 耗费的时间几乎是简单的字符串连接的四倍!

为什么呢?

部分原因在于这个测试的设计——连接例程仅仅连接了十个简短的字符串。 StringBuilder 是一个比简单的不可变的字符串类更复杂的类,因此创建一个 StringBuilder 比起进行十个简单的字符串连接在性能上是昂贵很多的。

我重复地做不同数目的字符串连接的测试,并且发现以下结果:

结论

使用 String.Compare 方法进行非大小写敏感的C#字符串比较。这样更快。而且代码优雅和简单。

仅当你在一个循环里进行超过 600 次的字符串连接时,使用 StringBuilder 来获得更好的速度。这里需要提醒的是,你所处理的字符串的长度也会影响最终的速度,同样会影响垃圾收集器的效果,所以你应该根据你实际的代码具体问题具体分析

使用 StringBuilder 来处理字符串的连接应该是绝大多数 .NET 开发人员的共识了。但你有否曾经怀疑过这一经验原则的适用性是否真如想象中那么广泛呢?读过本文后,或许你已经意识到这是个适度的问题。对小规模的字符串连接使用 StringBuilder 所带来的改善根本不足以抵偿因 StringBuilder 本身的复杂性所产生的开销;只有当连接规模达到临界规模,两者才能相互抵偿从而达至平衡。

文章名称:介绍C#字符串的性能
转载来源:http://www.hantingmc.com/qtweb/news5/237005.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联