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等,避免不必要的后续循环。


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

你可能感兴趣的:(2017.11.03 .net 性能优化和算法优化)