×

循环在.net中提高性能的技巧

Kalet Kalet 发表于2009-03-20 12:00:13 浏览205 评论0

抢沙发发表评论

 一些细微的操作有时候可能会决定整个系统的性能。很有可能一个for写的不好就会让你的性能降低N倍
以下是一些比较有效果的提升性能技巧:

     1、循环的时候,使用临时变量保存属性的值循环在.net中提高性能的技巧
           for(int i =0; i < xxx.xxx ;i++)
           大家知道,C#允许在属性里进行编程,也就意味着,有可能在get访问器中做一些其他的事情。
           如果get里面做的事情比较多的事情,那么上面的for语句将变得非常低效。所以,当你确定所访问的属性仅
           仅只会返回字段的时候而且你需要这个字段的意义仅在于遍历,可以这么做,如果不确定,最好使用
           for(int i = 0, j = xxx.xxx; i < j; i++)


      2、循环时候小心的使用返回数组的属性
            在设计返回数组的属性的时候,考虑到系统安全和稳定,大部分人都会在返回的时候只返回一个数组的副本


for(int i =0; i < microsoft.Employee.Length ; i ++)
{
   if(microsoft.Employee[i].Name=="aaa")
     ....
}
上面这段代码,Employee属性返回的是一个数组副本,也就是说,上面的循环将产生2N+1个副本
这对于性能的损耗是巨大的。
          解决这个问题的方法是,使用一个临时的数组变量来接收这个数组副本,这样问题就解决了



Employee[] employees = Microsoft.Employee;
for(inti i = 0, i < employees.Length; i ++)
  ...
    3、切记在循环外部保存固定不变的数据,供循环使用
         有的时候,我们在写循环时会范这样一个错误。
        假设我有一个方法是 GetName(),目的是从数据库中获取一个字段信息,然后返回。
        然后我想给一个string数组的每个成员都赋值成这个字段信息。


for(int i = 0; i < stringArray.Length; i ++)
{
    stringArray[i] = GetName();
}
     这么循环,也就意味着,你必须查询数据库N次来进行赋值。性能损失可想而知,所以,我们可以这么写:


循环在.net中提高性能的技巧
string name = GetName();
for(int i = 0; i < stringArray.Length; i++)
{
   stringArray[i] = name;
}
    4、使用局部变量代替成员或静态变量参与到循环中
          局部变量具有比成员变量和静态变量更好的性能,重复使用效果效果提升比较明显。
        对比性能
  


//方法一
private int _i = 0;
private void aaa()
{
    for(int i = 0; i < 1000 ; i ++)
    {
         _i++;
    }
}


//方法二
private int _i = 0;
private void aaa()
{
    int a = _i;
    for(int i = 0; i < 1000 ; i ++)
    {
         a++;
    }
    _i = a
}循环在.net中提高性能的技巧
二方法的性能在一些时候会比一方法快出几倍



群贤毕至

访客