2011-02-13 4 views
0

아래의 것과 같이 4 개의 내부 루프를 사용하는 정적 메서드를 작성했습니다. 나는 실행될 때 사용 된 힙에 대해 많은 테스트를 해왔다. 그것은 수천과 수천 개의 "int []"객체를 생성하는 것으로 보이는데, 이것들은 내가 만든 루프에서 오는 것이라고 생각합니다.거대한 메모리가 여러 개의 내부 루프에 사용되었습니다.

이 메모리 문제를 해결할 방법이없는 것처럼 보입니다. 루프가 필요하지만 모든 루프에 대해 int [] 객체를 많이 만들 필요는 없습니다. 이러한 오류가 이러한 루프 자체에서 발생합니까? 그리고 메모리 사용량을 줄이기 위해 할 수있는 일이 있습니까? 루프 강화 기능을 고려 중이었습니다.하지만 같은 문제 일 수 있습니다 ...

고마워요!

public static double[] calculateHand(final int card1, final int card2, final int card3, 
     final int card4, final int card5) 
{ 
    int ahead = 0, tied = 1, behind = 2; 
    int[][] HP = new int[3][3]; 
    int[] HPTotal = new int[3]; 

    int ourrank = HandEval.hand5Eval(HandEval.encode(card1, card2, card3, card4, card5)); 

    int[] remainingCards = filterCardsFromDeck(card1, card2, card3, card4, card5); 

    int kM = 1 

    for (int i = 0; i < remainingCards.length; i++) 
    { 

     for (int k = kM; k < remainingCards.length; k++) 
     { 
      int index = -1; 
      int oCard1 = remainingCards[i]; 
      int oCard2 = remainingCards[k]; 

      int opprank = HandEval.hand5Eval(HandEval 
        .encode(oCard1, oCard2, card3, card4, card5)); 

      if (ourrank > opprank) 
      { 
       index = ahead; 
      } 
      else if (ourrank == opprank) 
      { 
       index = tied; 
      } 

      else 
      { 
       index = behind; 
      } 

      HPTotal[index]++; 
      int[] newArray = filter2Cards(remainingCards, oCard1, oCard2); 

      int riverMinimumIndex = 1; 
      for (int turnIndex = 0; turnIndex < newArray.length; turnIndex++) 
      { 

       for (int riverIndex = riverMinimumIndex; riverIndex < newArray.length; riverIndex++) 
       { 

        int turnCard = newArray[turnIndex]; 
        int riverCard = newArray[riverIndex]; 
        int ourbest = HandEval.hand7Eval(HandEval.encode7(card1, card2, card3, card4, 
          card5, turnCard, riverCard)); 

        int oppbest = HandEval.hand7Eval(HandEval.encode7(oCard1, oCard2, card3, card4, 
          card5, turnCard, riverCard)); 

        if (ourbest > oppbest) 
        { 
         HP[index][ahead]++; 
        } 

        else if (ourbest == oppbest) 
        { 
         HP[index][tied]++; 
        } 

        else 
        { 
         HP[index][behind]++; 
        } 
       } 
       riverMinimumIndex++; 
      } 
     } 
     kM++; 
    } 

    ..... 

    return result; 
} 
+0

분명히 '작동'비트가 무엇인지 보여줄 필요가 있습니다 ..... –

+0

완료, 범인을 정확히 찾아 낼 수 없습니다. – skyllo

+3

가능성이있는 행 : int [] newArray = filter2Cards (remainingCards, oCard1, oCard2); –

답변

2

배열은 그 방법에서 만든 (또는 아마 생성) 네 개의 장소가 있습니다

int[][] HP = new int[3][3]; 
int[] HPTotal = new int[3]; 
... 
int[] remainingCards = filterCardsFromDeck(card1, card2, card3, card4, card5); 
... 
int[] newArray = filter2Cards(remainingCards, oCard1, oCard2); 

(다른 방법 중 일부는 사용자가 만든 ... 폐기를 호출하는 것도 가능하다 ... 임시 배열. 쉽게 찾을 수 있어야합니다.)

처음 세 개는 메서드 호출 당 한 번 발생하며 중요한 문제는 아닙니다. 마지막 레벨은 2 레벨 루프에서 발생하고, (내 읽기가 정확하다면) O(N**2) 번, N은 카드의 수입니다.

어떻게해야합니까? 명백한 답은 응용 프로그램 성능에 영향을 준다는 확실한 증거가 없다면 혼자 남겨 두는 것입니다. 그러나 나는 당신이 그 과거라고 가정합니다.)

가장 좋은 생각은 코드를 리팩터링하여 filter2Cards이 걸리는 것입니다. 기존 배열을 인수로 사용하여 필터링 된 카드로 채 웁니다. int을 반환해야 어레이에 추가되는 값의 개수를 알 수 있으며 다음 코드는 배열의 길이 대신이 값을 사용해야합니다. 그런 다음 배열의 생성을 가장 바깥 쪽 루프 앞에 놓습니다.

분명히, 이것은 코드를 더욱 복잡하게 만듭니다. 그건 당신이 지불하는 벌칙입니다 ...

+0

"배열에 추가 된 값의 수를 나타내는 int를 반환해야하며 다음 코드는 배열의 길이 대신이 값을 사용해야합니다." 그냥 ArrayList를 사용하십시오. – rlibby

+0

네 ... 그게 더 간단합니다. –

0

내 생각에 VM의 개발의 일부로 잡힌 것 같은 추측 인 히프 인플레이션입니다. 그게 아니라 당신은 VM의 문제를 볼 수 있지만 나머지 코드를 게시하지 않고, 내 생각에 그 문제는 단지 루프가 아니며 다른 코드에서 소개 한 것일 가능성이 큽니다. 게시하면 더 많은 도움을받을 수 있습니다.

관련 문제