文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#字符串的性能是什么

2023-06-17 23:02

关注

本篇内容介绍了“C#字符串的性能是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

简介

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

背景知识

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

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

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

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

String Comparison and Temporary String Creation

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

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

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

C#字符串的性能是什么

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

String Concatenation inside a loop

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

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

static string BadConcatenate(string [] items)  {      string strRet = string .Empty;       foreach (string item in items)      {          strRet += item;      }       return strRet;  }

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

C#字符串的性能是什么 

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

static string GoodConcatenate(string [] items)  {      System.Text.StringBuilder builder = new System.Text.StringBuilder();       foreach (string item in items)      {          builder.Append(item);      }       return builder.ToString();  }

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

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

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

为什么呢?

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

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

C#字符串的性能是什么

结论

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

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

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

“C#字符串的性能是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯