分享人:陈孚楠
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等,避免不必要的后续循环。
以上很多都是我个人理解,如有错误,请多指正!