2013-02-24 8 views
0

Robert Hundt (link 참조)의 Havlak 벤치 마크 Java 코드를 Groovy로 포팅했습니다. 이제는 Groovy 2.1.1을 사용하여 invoke dynamic 및 without을 사용하여 벤치 마크를 실행했지만 계산에 소요되는 시간은 거의 같습니다. 동적 호출을 사용하려면 어떻게해야합니까? 그루비 --indy.jars를 groovy-2.1.1 \ indy에서 groovy-2.1.1 \ lib로 복사했습니다. 그런 다음 groovy-2.1.1 \ lib에서 그 이름에 "groovy .jars"가 삭제되었습니다. 그 후 IntelliJ IDEA에서 파일> 설정> 컴파일러> Groovy 컴파일러> 동적 지원 호출 플래그를 활성화하고 비활성화했습니다.Groovy2.0 +에서 동적 성능을 향상 시키면 어떤 상황에서 성능 향상을 기대할 수 있습니까?

저는 사람들에게 내가 indy 지원을 올바르게 설정했는지 여부를 확인하도록 말하고 있습니다. 그러나 이것은 나의 질문이 아닙니다. 내 질문은 어떤 종류의 상황에서 우리는 동적 호출 때문에 계산 시간이 빨라질 것이라고 기대할 수 있습니다. 나는 그것에 관한 기사를 읽었지 만, 동적 인 것을 호출하는 것에 대해 "이 종류의 코드는 indy 지원으로 더 빨리 실행될 것"이라고 설명하는 것을 번역하기가 어렵습니다. Havlak 벤치 마크는 호출하는 setter를 통해 값이 변경되는 많은 루핑을 수행합니다.

문제에 대해 어느 정도 이해하고있는 사람이라면 여기에 몇 가지 설명을 남기게되어 기쁩니다 .--).

감사합니다, 올리버

답변

1

은 내가 주로 당신이 오리 입력의 어떤 종류를 사용하면 될 것 invokedynamic의 속도를 높이는 생각합니다.

invokedynamic API는 JVM에서 동적 메소드 디스패치를 ​​사용하는 언어에 대해 작성됩니다. 그루비가 분명히 그 중 하나입니다. 하지만 동적 디스패치를 ​​사용하는 메서드를 사용하는 경우에만 indy를 사용할 수 있습니다. 내가 원한다면 예를 드릴 수 있습니다.

그러나 Groovy에서 indy 디스패치 기능을 분석했으며 이전 다이나믹 디스패치 기능을 메소드 핸들에 압축하는 것처럼 보입니다. 사실, 실제로 그렇게한다면 더 빠를 수 없습니다. 내 생각에 invokedynamic의 Groovy 구현은 현재 최적화되지 않았습니다.

+0

그루비는 항상 동적 파견을하고 그것을 분석 할 수 . – blackdrag

+0

예, 항상 동적 디스패치를 ​​수행합니다. invokedynamic은 여러 번 메서드를 사용하는 경우에만 실행 속도를 높일 수 있습니다. 대부분의 프로그램에서 정상적인 사례이지만, – Thorben

+0

을 고려해야합니다. 속도 향상은 호출이 부트 스트랩되어 Comiled MethodHandle에 연결될 때 발생합니다. 그런 다음 무언가가 변경 될 때까지 MethodHandle을 재사용 할 수 있습니다. 인디없이 스크립트 언어 등의 구현에 캐싱 기술이 없으면 디스패치는 모든 단일 메서드 호출에 대해 발생합니다. 아마도 도움이됩니다. – Thorben

0

짧은 대답 : 카테고리를 사용하십시오. 코드를 사용할 때 코드가 훨씬 느려지면 indy를 사용하지 않습니다.

이상 답 : 당신이 어딘가에 코드를 게시 할 수 있다면 원시 최적화 경로가 런타임에만 영향을받을 수있는 특정 조건에서 수행되는 촬영하지 않는