2017-02-25 141 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,性能並沒有像你所擁有的那麼少的循環迭代來實現。

代碼可讀性,每次都過早和不必要的優化。