2011-04-25 5 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 배열의 모든 요소를 ​​반복하므로 계산이 비쌉니다. 너는 무엇을 더 찾고 있니? –

+3

내부 루프 내부에서 루프 변수 X의 값을 변경하는 이유는 무엇입니까? –

+1

이 질문에 답하는 데 도움이 될 것입니다. 2D 배열에 값 표를 작성하십시오. 그 결과로 당신이 찾고있는 것을 알려주십시오. 초심자를 위해서 ... –

답변

4

else X = minX; 부분은별로 의미가 없습니다. 루프 변수 X을 더 낮은 값으로 설정하기 때문에 무한 루프가 발생할 수 있습니다.

최대 1 열에 0이 아닌 값이 포함 된 경우에만 코드가 종료됩니다 (큰 값으로 minX를 초기화했다고 가정).

예를 들어 X=0X=1 열 모두 어딘가에서 0이 아닌 값을 포함한다고 가정합니다. 그런 다음 0 열의 0이 아닌 값에 도달하면 minX이 0으로 설정됩니다. 그런 다음 이 거짓임을 알리는 X=1 고지와 함께 0이 아닌 값에 도달하고 X를 0으로 다시 설정합니다. 영원히 반복하십시오.

+1

이것은 대부분의 경우 무한 루프를 만드는 것처럼 보일 것입니다. –

1

나는 (short)getMap.GetValue(X,Y)가 단지 getmap[X,Y]과 어떻게 비교되는지 모르지만 지나치게 복잡해 보입니다.

short[,] getMapshort[][] getMap으로 바꿀 수 있습니다.

지터가 범위 검사를 더 잘 최적화 할 수 있기 때문에 배열 중 배열 (들쭉날쭉 한 배열)은 일반적으로 이러한 중첩 루프 시나리오에서 더 빠릅니다.

+1

'getMap.GetValue'가 각 항목을 박스 처리 한 다음 캐스트가 unbox합니다. 많은 가치가 있다면, 그 모든 복싱/언 박싱 작업은 프로세서 사이클을 씹을 것입니다. –

+0

getMap()에는 값이 있습니다. 최소 및 최대 값 계산에 0 이상을 필터링합니다. – Don

+0

@Don : 예, 값이 있지만 GetValue()를 호출 할 이유가 없습니다. 그러나 혼돈의 대답을 먼저 읽으십시오. 코드에 결함이 있습니다. –

관련 문제