2017.11.03 .net 性能优化和算法优化

分享人:陈孚楠


1. 垃圾回收

.net Framework 自带的垃圾回收机制。就是会自动判断对象还有没有用,没用的会被回收。而不管对象的创建还是回收都是会消耗性能的,所以要避免不必要的对象创建。

① 避免循环创建。

    For(){
        Model.X x  = DB.X.function();
        …..
}

-----------------------------------------------

Model.X x  = DB.X.function();;
For(){
        …..
}

②在需要逻辑分支中创建对象。

如果一个对象只在一个逻辑分支中用到,那么就把这个对象的创建放在这个逻辑分支内。

    Model.X x = new Model.X();
    If(){
    
}

------------------------------------------------

If(){
    Model.X x = new Model.X();
}

③ 一次创建,多次使用。空间分配的问题。

    Model.X x =null;
For(){
    x = new Model.X();
        …..
}
    ----------------------------
For(){
    Model.X x = new Model.X();
        …..
}

2. String 操作

使用 StringBuilder 做字符串连接

String 是不变类,使用 + 操作连接字符串将会导致创建一个新的字符串。如果字符串连接次数不是固定的,例如在一个循环中,则应该使用StringBuilder 类来做字符串连接工作。因为 StringBuilder 内部有一个 StringBuffer ,连接操作不会每次分配新的字符串空间。只有当连接后的字符串超出 Buffer 大小时,才会申请新的 Buffer 空间。典型代码如下:

StringBuilder sb = new StringBuilder( 256 );
for ( int i = 0 ; i < Results.Count; i ++ )
{
sb.Append (Results[i]);
}

如果连接次数是固定的并且只有几次,此时应该直接用 + 号连接,保持程序简洁易读。实际上,编译器已经做了优化,会依据加号次数调用不同参数个数的 String.Concat 方法。例如:String str = str1 + str2 + str3 + str4;

会被编译为 String.Concat(str1, str2, str3, str4)。该方法内部会计算总的 String 长度,仅分配一次,并不会如通常想象的那样分配三次。作为一个经验值,当字符串连接操作达到 10 次以上时,则应该使用 StringBuilder。

使用最快的空串比较方法
  • 将String对象的Length属性与0比较是最快的方法:if (str.Length == 0)。
  • 其次是与String.Empty常量或空串比较:if (str == String.Empty)或if (str == "")。

3. 算法优化

一般遇到的性能较差的原因是:数据较多导致循环次数多或者循环体里多次使用DB查询数据。
总的来说就是一个函数跑玩需要成千上万次的访问数据库。这时我门就需要数据字典这类东西了。就是在循环之前把循环里多次要访问的数据表一次性查出来(尽量的加上限制条件)

原因:

  • 首先,跑内存是比跑硬盘要快的。 数据库是在硬盘上,更可能在别人的电脑硬盘上。而数组是在自己的电脑内存里。
  • 数据库连接的打开和关闭是很耗时间的。就像在我们循环向数据表插入数据的时候应当用SqlPackage 最后一次性将所有sql语句放到数据库执行,而不是产生一个就DB.Add()一个。

当然,在跑数组的时候,也要尽量优化。比如:在循环的执行体里多加些限制,那么有些语句跑的次数会被减少;还有就是熟练的使用break等,避免不必要的后续循环。


以上很多都是我个人理解,如有错误,请多指正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,323评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,810评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,911评论 6 13
  • 很多年前就想去莽山扯风,领略它传说中的原始壮美,可因种种原因,一次次被搁浅,没想到四月...
    百0阅读 3,150评论 0 0
  • 华风天依阅读 1,319评论 0 0

友情链接更多精彩内容