2010-01-06 2 views
9

JSR-292가 Groovy 성능에 얼마나 영향을 미칠지 예측이 있습니까?JSR-292 (invokedynamic)은 Groovy 성능에 어느 정도 영향을 줍니까?

+0

invokedynamic의 특정 성능 이점을 얻기 위해 Groovy 코드로 갈 길이 멀다. 내 유전 알고리즘은 invokedynamic을 사용하여 5 배 느리게 수행되었으며 Java 1.8.0 및 Groovy 2.2.1을 사용하여 테스트했습니다! 직접 시도해 보시고 https://github.com/renatoathaydes/MachineLearning을 실행하고'com.athaydes.ml.algorithms.LinearGPTest :: testNonTrivialPrograms' 테스트를 실행하십시오. 일반적으로 4 초 후에 실행되지만 groovy-indy와 invokedynamic을 사용하면 적어도 25 초 후에 실행됩니다. – Renato

+0

또한 indy를 보여준 또 다른 게시물은 실제로 Groovy 코드의 속도를 늦출 수 있습니다. http://derjan.io/blog/2012/08/08/first-steps-with-groovys-invokedynamic-support/ – Renato

답변

4

invokedynamic은 JDK7에서 성능 특성이 항상 변하기 때문에 복잡한 이야기입니다. Groovy를 indy로 이식하는 동안 나는 정말로 Java와 매우 흡사했습니다. 하지만 catchExceptionGuard를 사용해야하는데, 이는 성능을 3-4 번 요소처럼 감소시킵니다. 우리는 여전히 그 경비원을 사용하지 않아도되는 방법을 조사 할 필요가 있습니다. 어쩌면 우리는 Groovy 2.2의 기존 코드를 깨뜨려야 할 것입니다. 어쨌든, 나는 위에서 언급 한 invokeMethod fallback에 대한 경계를 필요로하지 않는다. GroovyRuntimeExceptions에는 아마도 다른 예외가 포함되어 있으므로 다른 것을 unwrap하거나 다른 작업을해야합니다. 따라서 이론적으로 가능한 성능은 Java와 기존 방법의 Java 속도의 절반 사이 인 것으로 보입니다. invokeMethod에 대한 호출 성능은 완전히 다른 이야기입니다.

추가 정보가 필요하면 Groovy 2.0에서 @CompileStatic을 사용하십시오.

3

내가 벤치 마크는 아직 생각하지 않고, 누군가가 그것을 수행 할 때까지 우리는 단지 추측 할 수 ...

당신은 흥미로운이 문제에 this post을 찾을 수 있습니다.

2

일반적으로 약 10-50 배 빠릅니다.

http://www.mail-archive.com/[email protected]/msg00819.html

+1

위로 올려 주실 수 있습니까? 참고 문헌이나 증거가 있으십니까? –

+0

안녕하세요, 링크를 추가했습니다. JSR-292를 통해 Groovy 컴파일러를 작성한 경험을 바탕으로합니다. 그리고 기본적으로 추정치입니다. (질문에서 추정치도 요구 했으므로) – chanwit

+1

정말 오해의 소지가 있습니다. 나는 실제로 indy가 활성화 된 상태에서 5 배의 속도 저하를 보였다. – Renato

0

나는 그것을 적용 그루비에 얼마나 확실하지 않다. 잘 기억한다면 Groovy에는 몇 가지 대체 수단이 있습니다 (예 : invokeMethod 메소드). invokedynamic과 함께 단순히 폴백을 사용하는 것은 불가능하다고 생각합니다.

  • 캐치하는 방법을 찾을 수없는 경우에 throw되는 예외 :

    그러나, 몇 가지 방법이 있습니다. 불행하게도 stacktrace를 어디에서 던지는지 확신 할 수 없으므로 스택 추적을 분석해야 할 필요가 있습니다. invokeMethod 콜백에 의해 처리되는 것과 상관없이 존재하지 않는 메서드를 호출 할 때 상당한 속도 저하가 될 수 있습니다.

  • Groovy ++을 살펴보십시오. 그것은 당신이 몇 가지 제약 사항을 만족한다면 정적 타이핑을 사용할 수있게 해줍니다. 이 경우 이러한 엄격한 변경을 허용하지 않는 "엄격한 동적 모드"로 전환 할 수 있습니다.
관련 문제