2011-04-25 41 views
0

我知道它的一個愚蠢的問題,要問,爲什麼這個代碼minX在計算上很昂貴,但我想,有人可能會通知我我的錯誤。謝謝C#的計算成本很高,如何讓它更快

// getMap is a 2 dimentional array of type short I need to find maxX,minX,maxY,minY 
//Can't use Math.Min , as it will get the lower bound i.e 0, i want values after filtering 
for (int X = 0; X < getMap.GetLength(0); X++) 
{  
    for (int Y = 0; Y < getMap.GetLength(1); Y++) 
    {   
     if((short)getMap.GetValue(X,Y) != 0) 
     { 
      //if i take it out, it works fine ,I need to 
      if (minX > X) 
       minX = X; 
      else 
       X = minX; 
     // Prints some stuff and does other computation 
     } 
    } 
} 
// Draws image 
+2

它在計算上很昂貴,因爲它遍歷2D數組中的每個元素。你還想找什麼? – 2011-04-25 19:47:40

+3

你爲什麼要改變內循環中循環變量X的值? – 2011-04-25 19:49:26

+1

這將有助於您的問題得到解答:在二維數組中寫入一個值表。然後讓我們知道你在找什麼結果。只爲一個起動器... – 2011-04-25 19:53:22

回答

4

else X = minX;部分沒有多大意義。它會導致無限循環,因爲您將循環變量X設置爲較低的值。

只有在最多1列包含非零值(假設您將minX初始化爲大值)時,您的代碼纔會終止。

例如,假設X=0X=1列在某處都包含非零值。然後當它遇到0列中的非零值minX設置爲0.然後稍後它達到非零值,X=1注意到minX>X爲假並且將X設置回0.並且永久重複。

+1

似乎這在大多數情況下會創建一個無限循環。 – 2011-04-25 19:54:00

1

我不知道(short)getMap.GetValue(X,Y)getmap[X,Y]相比如何,但似乎過於複雜。

你可以做的是用short[][] getMap替換short[,] getMap

陣列(鋸齒狀陣列)在這些嵌套循環場景中通常更快,因爲Jitter可以更好地優化範圍檢查。

+1

我猜'getMap.GetValue'會導致每個項目被裝箱,然後演員開箱取出它。如果有很多值,那麼所有這些裝箱/拆箱操作都會咀嚼處理器週期。 – 2011-04-25 19:52:53

+0

getMap()有一個值,我篩選出超過0用於計算最小值和最大值 – Don 2011-04-25 20:01:46

+0

@Don:是的,它有一個值,但沒有理由調用GetValue()。但先閱讀混沌的答案。你的代碼有缺陷。 – 2011-04-25 20:04:37