2017-02-25 98 views
-3

下面我有嵌套循环:C#:一个循环内优化条件

(...) 
    while (some_condition) 
    { 
    (...) 
    MyObject p = new MyObject(i, j); 
    for (int r = -1; r <= 1; r++) 
    { 
     for (int c = -1; c <= 1; c++) 
     { 
      // check matrix bounds 
      if (p.y + r <= 0 || p.y + r >= bound1 || 
       p.x + c <= 0 || p.x + c >= bound2) 
      { 
       continue; 
      }     
      else if (matrix[p.y + r][p.x + c]=='$') // at this point no IndexOutOfBounds may be raised as it is checked in previous condition 
      { 
       continue; 
      } 

      AddItem(r, c); 
     } 
    } 
} 

myObject的是,其中包括具有以下attirbutes类:

public class MyObject { 
     public int x; 
     public int y; 

     public MyObject(int x, int y) 
     { 
     this.x = x; 
     this.y = y; 
     } 

     // Other methods .... 
} 

所以我担心的表现,我的意思是,我不喜欢循环中的条件,因为性能可能会下降,所以我该如何优化?

此外,我想使代码更易读,所以我有如下改写它:

while (some_condition) 
{ 
    (...) 
    MyObject p = new MyObject(i, j); 
    for (int r = -1; r <= 1; r++) 
    { 
     for (int c = -1; c <= 1; c++) 
     { 
      if (!IsOutOfBounds(r, c, p) && !IsDollar(r, c, p)) 
      { 
       AddItem(r, c); 
      } 
     } 
    } 
} 

private bool IsOutOfBounds(int r, int c, MyObject p) 
{ 
    return (p.y + r <= 0 || p.y + r >= bound1 || 
      p.x + c <= 0 || p.x + c >= bound2); 
} 

private bool IsDollar(int r, int c, MyObject p) 
{ 
    // matrix is global 
    return (matrix[p.y + r][p.x + c]=='$'); 
} 

但现在,循环中调用函数也降低性能,所以如何做,内联函数?我是否必须在两个函数之前添加[MethodImpl(MethodImplOptions.AggressiveInlining)]属性?

+3

我认为代码审查网站会更好。 –

+2

我还建议先查看他们的[帮助中心](http://codereview.stackexchange.com/help)。 – Incomputable

+0

_“不喜欢条件循环内的性能可能会下降”_但作为一种安慰,它可以节省异常。 –

回答

1

该方法调用和如果语句不会真的伤害到你的性能,除非你每秒调用这个方法1000次或者你在一台非常旧的机器上,而且编译器会进一步优化。因此,如果程序运行缓慢,您应该更专注于使代码更具可读性并搜索真正的瓶颈。

但是我也有一个关于你的代码的问题,好像你永远不会改变你的循环中的x和y,所以你不能在循环之外带出界限和美元检查。

+0

我输入了带有错误的代码,很抱歉,现在我已更正它。再次查看帖子。 – user1624552

+0

我可以问,你的电脑有多好/多旧,你担心的是性能如此之多? –

+0

我的电脑是新的,但我对这些事情非常偏执,如果可以,我总是尽量避免在循环中使用条件。 – user1624552

1

好的工作让它更具可读性并且方法的正确命名。由于for循环只执行3次,对于值-1,0和1,性能并没有像你所拥有的那么少的循环迭代来实现。

代码可读性,每次都过早和不必要的优化。