2012-03-26 2 views
2

클래스에서 여러 번 사용하는 변수가 있으며 속도가 중요하므로 가장 빠른 방법을 사용하고 싶습니다.Java - 개체의 get 메서드를 로컬 개체를 사용하는 것보다 느리게 호출합니까?

modifyValue(User.getSession().getSessionValue()); 

여러 다른 장소에서 변수를 사용할 때

private String sessionValue; 
sessionValue = User.getSession().getSessionValue(); 
modifyValue(sessionValue); 

같은 로컬 값 정보를 설정 :

사용하여 A 사이의 속도 차이가 있습니까? 어떤 스타일이 더 좋을까요, 아니면 이해하기가 더 명확할까요? 위의 예제가 현재 기존 코드에서 사용되는 경우 리팩터링 할 가치가 있습니까?

+0

컴파일 시간이 조금씩 달라집니다. 명명 변수는 재사용 및 코드 유지 관리에 도움이 될 것입니다. –

답변

9

나는 속도 차이가 있다고 생각하지 않습니다. 이것은 당신을 타락시킬 수있는 미세 최적화의 일종입니다.

쓰기 가능 개인 멤버 변수가 올바르게 동기화되지 않은 경우 스레드 안전성 문제가있을 수 있습니다.

불필요한 쓰기 가능 상태를 피하기 때문에 첫 번째 것을 선호합니다. 물론 조금 더 빠른 시간에 될 것

modifyValue(User.getSession().getSessionValue()); 


를 사용

1

.
런타임보다 컴파일 속도가 더 빠릅니다.
작은 프로그램에서는
이지만 코드의 유지 보수성을 고려할 때
변수를 사용하면 장기적으로 도움이 될 수 있습니다.

+0

이 경우가 '좀 더 빠름'일 수 있습니까? – Jayan

+0

시나리오 1에서 컴파일 시간이 조금 더 빨라질 수 있습니다. 바이트 코드 즉, 최종 결과는 두 경우 모두 동일합니다! –

+0

바이트 코드가 동일하면 JIT 컴파일 시간과 일반 런타임이 동일합니다. 나는 OP가'javac' 컴파일 시간에 대해 묻고 있다고 생각하지 않는다. 비록 그가 있었다고하더라도 컴파일 시간 차이는 너무 작아 측정하기가 어려울 것입니다. –

1

각 메서드 호출에는 시간이 필요합니다. 따라서 객체에 대한 참조를 멤버 필드에 두는 것은 메소드를 호출 할 때 발생하는 연산의 수를 줄여 이론적으로 속도를 증가시킵니다.

그러나 그런 종류의 최적화에 대한 생각은 "Premature optimization"- 소프트웨어 개발자의 잘 알려진 실수입니다. 그것을 피하십시오.

1

아니요, 느리지는 않습니다. 컴파일러와 JVM의 just-in-time 컴파일러는 최적화되어야하므로 동일해야합니다. 하지만 코드 품질/가독성에 대한 문제입니다. 여러 개의 메소드 호출을 사용하여 큰 one-liners를 작성하면 코드를 읽기가 어려워집니다.

0

대부분의 경우이 둘은 속도면에서 동일합니다.

유지 관리와 관련하여이 방법이 사소한 것이 아니라면 로컬 (final) 변수에 값을 저장하는 것을 선호합니다.

데이터 안전성과 관련하여 설명에 따르면 중간 메서드가 결코 null 값을 반환하지 않을 것이라고 코드에서 확신 할 수 없으므로 로컬 변수에 저장하는 것이 좋습니다. 반환하지 않으려는 경우 가치는 getSession()입니다.

2

그런 것들에 대한 성능 최적화는 실제로 코드에 대한 추론이 아니라 측정에 기초하여 정확하게 수행 될 수 있습니다.

진술을 미세 최적화하려고 할 때 정말로 가치가 있는지 물어보십시오.훨씬 더 나은 접근법은 먼저 작동하는 코드를 작성한 다음 프로파일 러를 사용하여 성능 병목 현상이 무엇인지 판별하는 것입니다. 그런 다음 개선에 집중하십시오. 마이크로 최적화 구문을 사용하면 거의 아무 것도 얻을 수 없습니다. 그래서 마이크로 최적화에 대해 걱정하지 말 것을 제안합니다. 프로파일 러가 나타내는 장소에 대한 기본 최적화 노력은 병목 현상입니다.

오라클의 JVM 및 JIT는 런타임에 많은 정교한 최적화 작업을 수행합니다. 예를 들어, 간단한 getter 메소드에 대한 메소드 호출은 인라인 될 가능성이 높으므로 메소드 호출이 필요하지 않습니다. 귀하의 질문에 두 코드 사이에 전혀 차이가 없을 가능성이 높습니다. JIT에 의해 정확히 동일한 코드로 최적화됩니다.

관련 문제