2011-07-07 6 views
23

멤버 변수를 직접 반환하는 대신 Collections.unmodifiableList()를 반환하는 것이 좋습니다. 동료는 성능에 문제가 있다는 점에 우려하고 있습니다. 물론 가장 좋은 대답은 그것을 측정하는 것이고, 우리는 그렇게 할 수 있습니다 - 그러나 나는 당신의 경험과 모든 참고 문헌, 프로 또는 죄수를 알고 싶습니다.Collections.unmodifiableList에 성능 위험이 있습니까?

+2

이것은 미친 듯이 날뛰는 미숙 한, 미숙 한 마이크로 최적화의 일종입니다. 이러한 응답과 소스 코드 자체를 동료에게 알려주십시오. – duffymo

+0

고마워요, 더피; 나는 그것을 할 거 야. 차라리 측정 할 시간이 필요 하겠지만, 나만을 위해서가 아니라 여기에 명확한 대답을하는 것이 좋습니다. 나는 이미이 질문들에 대한 질문을 받았을 것이라고 기대했다. 내가하지 않았을 때 - 글쎄, 나는 물었다. –

+1

@duffymo 전적으로 동의했습니다. @ 칼 마나 스트 당신이 동료에게 물어볼 질문은 '무엇에 비해 성능이 정상입니까?' 그것이 당신이 원하는 경우 제로 시간에 잘못된 대답을 얻을 수 있습니다. 그렇지 않습니다. – EJP

답변

23

번호는 최소한의 OpenJDK implementation 그대로 UnsupportedOperationException의와 수정 방법은, 나머지는 단지 컴파일러 VM (심지어 그래서, 한 단계의에 의해 멀리 최적화 얻을해야 간접적 인 수준을 추가 "대체" 간접 지정은 비용이 많이 들지 않습니다).

수정할 수없는 목록을 반환하려면 정확성의 손실에 비해 성능에 미치는 영향이 약할 것입니다. 성능만으로는 피할 수 없을 것입니다. 너는 필요해.

+6

Java 컴파일러가 아니라 VM (핫스팟)에 의해 최적화되었습니다. –

7

구현을 살펴보면 Collections.unmodifiable은 전달하는 대신 모든 제거/추가 메소드에 대해 예외를 던지는 실제 컬렉션을 감싸는 단순한 래퍼라는 것을 알 수 있습니다. 따라서 성능 저하는 없습니다 (포워딩 통화는 JIT에서 인라인 됨).

그렇습니다. 그렇기 때문에 대부분의 시간 대신 원래의 수정 불가능한 컬렉션을 반환해야합니다. 훨씬 더 나은 코딩 방법입니다.

3

JIT가 함수를 인라인하면, 그렇지 않은 경우, 예, 약간의 성능 저하는 당신은 가능성이 하지 당신이 매우 꽉 루프를 가진 경우가 아니라면 그것을을 알 수있을 것입니다 발생하지만 것입니다.

디버깅을 위해 컴파일하지 않는 한, 함수를 인라인 할 가능성이 높습니다.

관련 문제