码迷,mamicode.com
首页 > Windows程序 > 详细

C#程序员应该养成的程序性能优化写法

时间:2019-01-04 12:37:02      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:led   有一个   obj   循环   复杂   分享图片   max   single   exce   

工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率

其实这对大多数程序猿来说都是没有问题的

不过作为一只有理想的CodeMonkey,我还是希望给大家分享一些性能优化心得

曾经在网上听过这样一句话

程序的可读性和性能是成反比的

我非常赞同这句话,所以对于那些极度影响阅读的性能优化我就不在这里赘述了

今天主要说的就是一些举手之劳即可完成的性能优化

 减少重复代码

这是最基本的优化方案,尽可能减少那些重复做的事,让他们只做一次

比较常见是这种代码,同样的Math.Cos(angle) 和Math.Sin(angle)都做了2次

还有另一种 ,在方法中实例化一个对象, 但是这个对象其实是可以复用的

这里的new User()就是不必要的操作,

优化后

正好在第一个栗子里说到了正在表达式(Regex)对象就顺便一起说了

很多人以为正则表达式很快,非常快,超级的快

虽然正则表达式是挺快的,不过千万不要迷信他,不信你看下面的栗子

技术分享图片

结果为10w次循环的时间 ,即使是10个Replace连用,也比Regex好,所以不要迷信他

ConvertQuot2:12479

最后给你们看一个真实的,杯具的栗子

上面说了正则表达式的效率不高,并不是说就不要用他了,至少正则表达式的作用不仅仅如此而已

如果一定要用正则表达式的话也需要注意,能静态全局公用的尽量全局公用

通俗的说就是加了这个枚举,会使得初始化Regex对象变慢,但是执行字符串查找的时候更快, 不使用的话,初始化很多,查询比较慢

之前测过相差蛮大的 ,代码就不比较了,有兴趣的可以自己试试相差多少

另外还有一些枚举项,不确定是否对性能有影响,不过还是按规则使用会比较好

  • RegexOptions.IgnoreCase    // 指定不区分大小写的匹配,  如果表达式中没有字母,则不需要设定
  • RegexOptions.Multiline         // 多行模式。更改 ^ 和 $ 的含义….  如果表达式中没有^和$,则不需要设定
  • RegexOptions.Singleline       // 指定单行模式。更改点 (.) 的含义….  如果表达式中没有.,则不需要设定

让编译器预处理常量的计算

编译器在编译程序段的时候 如果发现有一些运算是常量对常量的,那么他会在编译期间就计算完成,这样可以使程序在执行时不用重复计算了

比如

技术分享图片

不过编译器有的时候也不是那么聪明的

技术分享图片

这个时候就需要我们帮助一下了

技术分享图片

给他加一个括号,让他知道应该先计算常量,这样就可以在编译期间进行运算了

字符串比较

这个可能很多人知道了,但还是提一下

1,2几乎没区别 4,5几乎没区别

不过这个只适用于比较null和空字符串,如果是连续的空白就是string.IsNullOrWhiteSpace最快了,不过这个方法2.0里面没有

所以2.0可以这样 (s+””).trim() == 0

这里的关键就是 s + “”  这个操作可以把null转换为””

注意第二个参数只能是””或string.Empty 这样的累加几乎是不消耗时间的,如果第二个参数是” “(一个空格)这个时间就远远不止了

字符串拼接

字符串累加,这个道理和Regex一样,不要盲目崇拜StringBuilder

在大量(或不确定的)string拼接的时候,StringBuilder确实可以起到提速的作用

而少数几个固定的string累加的时候就不需要StringBuilder 了,毕竟StringBuilder 的初始化也是需要时间的

感谢残蛹 博友提供的说明

ps: 这段我确实记得我是写过的来着,不知道怎么的,发出来的时候就不见了…..

技术分享图片

此外还有一个string.Concat方法,该方法可以小幅度的优化程序的速度,幅度很小

他和string.Join的区别在于没有间隔符号(我之前常用string.Join(“”,a,b,c,d),不要告诉我只有我一个人这么干)

另一种经常遇到的字符串拼接

对于3.5以上可以直接使用Linq辅助,这种方案代码少,但是性能相对差一些

这种现象常见于新手程序员中

一般类型的判断有2种形式

1,这种属于代码比较好写,但是性能比较低, 原因就是GetType()的时候消耗了很多时间 

使用枚举作为索引

下面这个是一个真实的例子,为了突出重点,做了部分修改,删除了多余的分支,源代码中不只4个

字符类型Char,分支判断时的处理技巧

这部分内容比较复杂,而且适用范围有限,如果平时用不到的就可以忽略了

在处理字符串对象的时候,有时会需要判断char的值然后做进一步的操作

 摘取部分blqw.Json的代码

C#程序员应该养成的程序性能优化写法

标签:led   有一个   obj   循环   复杂   分享图片   max   single   exce   

原文地址:https://www.cnblogs.com/DreamRecorder/p/10218506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!