2017-10-11 1 views
1

Java의 성능 향상에 대한 도움이 필요합니다. 동일한 호출 스택 내에서 중복 된 메소드 호출 (동일한 매개 변수 값을 갖는 동일한 메소드)이 있는지 여부를 이해할 수있는 방법이 있습니까? 동일한 호출 스택 내에서 중복 호출 식별 -

은 더 명확를 유지하려면 :

MethodA(int A) - 반환이 방법은 다른 클래스의 수에서 다른 모듈에서 호출됩니다 것을 말할 수

B.

int로. 이 메소드가 동일한 입력 매개 변수 MethodA(1)을 사용하여 여러 번 호출되면 단일 긴 체인 트랜잭션에서 성능이 저하됩니다. 대신 매번 MethodA(1)을 호출하는 대신 항상 첫 번째 호출에서 결과를 사용하는 것이 더 나은 접근 방법이라고 생각합니다.

모든 것을 수동으로 분석하는 것 외에는 중복 호출을 식별 할 수 있습니까? 현재로서는 동일한 쿼리 매개 변수를 사용하여 같은 메서드에 대한 호출을 피하기 위해 결과를 로컬에서 캐시하려고합니다. 그러나 여전히 중복 호출을 식별하여 근본 원인까지 좁힐 수 있습니다.

도움을 주시면 감사하겠습니다.

+0

당신은 코드를 최적화하려고합니까? 이 경우 최적화가 가장 잘 된 핫스팟을 나타내는 [프로파일 러] (https://www.ej-technologies.com/products/jprofiler/overview.html)를 먼저 사용하는 것이 좋습니다. –

+0

시간을 내 주셔서 감사합니다. 우리는 dynatrace를 사용하지만 각 메소드에 대해 얼마나 많은 호출이 이루어 졌는지는 식별하지만, 단일 트랜잭션 내에서 중복 호출이 발생하는지 여부는 정확하게 식별하지 않습니다. 누락 된 부분이 있으며 프로파일 러를 사용하여 얻을 수 있습니다. – user1785961

+0

난 그냥 메서드를 캐싱 할 수 있도록 비교 분석에 더 많은 시간을 낭비 할 것 같아요. 분석을 위해 호출을 기록한 다음 로그 문을 그룹화하여 일부 그룹에 많은 항목이 있는지 확인합니다. – lexicore

답변

1

매개 변수의 주어진 값을 가진 모든 호출에서 이 항상이 같은 값을 반환하므로 주어진 메서드에는 부작용이 없어야합니다.

CGLIB를 사용하여 메소드/클래스 프록시를 만든 다음 모든 캐시 구현을 사용하여 동일한 입력에 대해 알려진 캐시 된 결과를 반환 할 수 있습니다.

예 (참조 https://gist.github.com/ksauzz/1563486는) :

List<String> proxyAry = (List<String>)Enhancer 
.create(TargetClass.class, new MyInvocationHandler(ary)); 

static class MyInvocationHandler implements MethodInterceptor { 

    private TargetClass<String> ary; 

    public MyInvocationHandler(TargetClass<String> ary) { 
     this.ary = ary; 
    } 

    @Override 
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 
     if (isFouthGet(method, args)) { 
      return "Bow!!"; 
     } 
     return proxy.invoke(ary, args); 
    } 
+0

감사합니다. 예, 반환 값이 같을 때마다. 하지만 잠재적으로 동일한 매개 변수를 사용하여이 메서드를 호출 할 수있는 모든 호출자 메서드가 무엇인지 알아 내려고 노력 중입니다. 따라서 캐시에서 캐싱 및 검색하는 대신 중복 호출을 피하는 방법을 찾는 데 도움이됩니다. – user1785961