2012-03-05 4 views
1

의 코드 조각 다음 가정 해 봅시다 :메서드 개체에서 정적 메서드 호출을 래핑하는 오버 헤드는 무엇입니까?

public class NotThatWellWrittenClass { 
    public static void doSmth() { 
     /* 
     This code part is actually irrelevant. 
     */ 
    } 
} 

몇 가지 다른 클래스를 사용하는 것이 그 폴더의 유틸리티 다음과 같이 : NotThatWellWrittenClass.do()를 유일한 오버 헤드가 실제로 performing a method call 관련이 있도록.

정말 프로그래밍 방식이 좋지 않으므로 정적 메서드 호출을 사용하는 클라이언트를 손상시키지 않으면 서이 코드 부분을 리팩토링하고 싶습니다. 리팩토링 미리보기 :

public class NotThatWellWrittenClass { 
    public static void doSmth() { 
     new WorkUtil().doSmth(); 
    } 
} 

public class WorkUtil() { 
    public void doSmth() { 
     /* 
      This code part is actually irrelevant. 
     */ 
    } 
} 

지금, 코드가 훨씬 더 객체 지향하고 테스트하고 재사용하기 쉽다. 그러나 이제는 여분의 객체 (메모리 할당)를 만들고 정적 호출 대신 인스턴스 메서드 호출을 수행합니다 (JVM에서 다르게 최적화 됨).

다시 질문을 드리면 다음과 같은 리팩토링에서 눈에 띄는 오버 헤드가 있습니까? 어쩌면 다른 방식으로 수행해야할까요? (나는 항상 객체에 객체를 캐시 할 수 있지만 그만한 가치가 있나?)

감사의 말을 전하고 싶습니다.

+2

나는 이로 인한 오버 헤드를 전혀 느끼지 못했습니다. 대부분의 알고리즘 문제, 거의 코드가없는 비트 및 성능/OO 트레이드 오프가 거의 모든 코드에서 발생하기 때문입니다. 그러나 당신이 정말로 걱정한다면, 당신의 메소드와 클래스를'final'으로 선언하십시오, VM에 가상 호출을 할 필요가 없다는 힌트를줍니다. – biziclop

답변

0

35 바이트 길이로 인라인 될 수 있습니다.

자주 호출되는 메소드 만이 방법으로 최적화됩니다. 예 : 10,000 번 이상.

어쨌든 나노초가 더 걸리면 문제가 될 수 있습니다.

WorkUtil.do()가 충분히 간단하면 객체 할당을 최적화 할 수 있습니다. 유일한 대안은 직접 개체를 재활용하는 것입니다. 이 작업을 실제로 수행해야하는 경우는 거의 없습니다.

public class NotThatWellWrittenClass { 
    private static final WorkUtil THE_WORK_UTIL = new WorkUtil(); 
    public static void do() { 
     // could introduce thread safety issues as the object is now shared. 
     THE_WORK_UTIL.do(); 
    } 
} 
+0

이러한 정적 메서드는 다소 복잡 할 수 있습니다. 이러한 복잡한 메서드는 전제 할 수 없습니다. 또한 정적 메서드이기 때문에 나쁜 방법으로 호출하지 않도록 할 수 없습니다 (예 : 초당 1k 회). 이 리팩토링이 좋은 방법인지 아닌지에 관계없이 일반적인 접근 방식을 찾고 있습니다. –

+0

@ ŁukaszBachman 라이브러리 또는 최종 제품을 코딩하고 있습니까? 그것이 최종 제품이라면 호출 횟수에 대한 완전한 제어권을가집니다. 게다가 메소드 자체가 소수의 작업 만 수행하면 오버 헤드가 미치는 영향이 적습니다. – biziclop

+0

최종 제품, 나는 그것이 현재 어떻게 사용되고 있는지를 알기 위해 소스를 분석 할 수 있다는 것을 알고 있습니다.하지만 dev 팀을 처음 접한 이래로 - 누군가가 다른 하위 프로젝트에서이 util 메소드를 사용하지 않았다는 확신을 가질 수는 없습니다. –

관련 문제