2013-01-19 4 views
0

당신의 퍼포먼스 포인트에 더 좋은 코드는? for 루프의 ref 생성이 좋지 않기 때문에 두 번째 코드를 생각합니다.자바 퍼포먼스 프론트 : ref for for 루프

의견을 말씀해 주시겠습니까?

// First Code 
for (int i = 0; i < array.size(); i++) { 
    SipSession abc = (SipSession) array1.get(i); 
} 

// Second Code 
SipSession abc = null; 
for (int i = 0; i < array.size(); i++) { 
    abc = (SipSession) array1.get(i); 
} 
+3

나는, 차이가, 내가 선호 가독성에 대한 첫 번째 잠을 잃고 가치가있다 생각하지 말아 –

+0

더 많은 가능성이 최적화가 올 것입니다 캐스팅하지 않고 크기에 대한 반복 호출을 제거하고 (물론 인라인 될 수도 있음)이 루프 전에 실제 배열로 목록 (아마)을 변환합니다. –

답변

0

나는 둘 사이에 성능 차이가 크다고 생각하지 않습니다. 주요 차이점은 SipSession 참조의 범위입니다. 그러나 만약 당신이 많이 걱정 프로필링을 시도해야합니다.

+0

프로파일 링을 통해이 코드에서 무엇을 발견 할 수 있는지 많이 신경 쓴다면 프로파일 링을 시도해야합니다. for 루프에 걸린 시간? – VJS

+0

해당 코드를 실행하는 데 걸린 시간. – Swapnil

0

첫 번째 코드에서 VM 또는 컴파일러는 범위 내에서 사용되지 않으므로 참조 변수를 제거합니다.

정공 루프 최적화하면서 제거 할 수있는 방법으로 이루어 get 것의 따라

for(int i=0;i<array.size();i++){ 
    array1.get(i);  
} 

최적화한다. 요소에 액세스하는 순서가 중요하지 않은 경우

당신도 할 수 있습니다

for (int i = array.size()-1; 0 <= i ;) { 
    SipSession abc = (SipSession) array1.get(i--); 
} 

이 한 번만 대신 각 루프 반복에서 array.size()을 부를 것이다.

+0

최적화되지 않은 역 루프 문제가 발생할 수 있습니다. (내가 기억할 수있는 마지막 정보는 하드웨어가 잘 최적화되어 있지만 HotSpot은 그렇지 않다는 것입니다.) –

+0

@Tom Hawtin : 최적화는 역방향 루프가 아닙니다. 최적화는 모든 메소드 호출'array.size()'의 회피이다. – MrSmith42

+0

주요 변경 사항은 루프가 뒤로 실행된다는 것입니다. 'size()'에 대한 다중 호출을 제거하고 싶다면'final int size = array.size();'가 그것을 할 수있다. –

1

궁극적으로 차이는 없습니다. JIT는 그 코드를 완전히 똑같은 것으로 최적화 할 것입니다.

유일한 차이점은 물론 범위입니다.

3

코드를 프로파일 링 한 후에 만 ​​성능 기준을 선택하고 병목 현상이 있음을 확인하십시오.

작업을 완료 할 때까지 유지 관리가 더 쉬운 버전을 선택하십시오.

루프를 초과하여 사용하려면 마지막 SipSession 참조가 필요할 때를 제외하고 항상 첫 번째 버전을 선택합니다.

0

이것은 마이크로 최적화이며 병목 현상임을 증명하지 않고 다른 종류의 최적화를 수행하는 것이 좋습니다. 여기서는 그렇지 않습니다.

0

프로파일 링없이 최적화하지 마십시오. JIT 컴파일러는 무거운 짐을 하므로 할 필요가 없습니다.

그 외에도 array은 일반 List<SipSession> 대신에 List 인 것으로 보입니다. Generics는 반드시 코드를 최적화 할 필요는 없지만 이해하고 유지하는 것이 훨씬 쉽습니다. 귀하의 간단한 루프는 다음과 같이 다시 작성할 수 있습니다 : 당신이 당신에게 중요하다면 프로필을해야하지만

List<SipSession> array; 
for(SipSession abc : array){ 
    // Stuff  
}