2016-07-07 3 views
0

:Java를 통한 인스턴스 메소드 호출 Reflection/Scala Reflection : 어느 것이 더 빠릅니까? 간단한 클래스 정의에 대한

class Example { 

    def r() = Random.nextLong() + Random.nextLong() //I'm using scala utility class to be succinct 
} 

r()를 호출하는 2 가지 방법이있다 "FN"두 클래스 "예"와 함수 이름은 "호출의 오버 헤드를 최소화하는 (동적하지만, 이미 컴파일 알려진 경우 fn "반복적으로) : Java Reflection & 스칼라 리플렉션.

자바 리플렉션에는 훨씬 간단한 API가 있습니다. Class.getMethodWithParameterType을 사용하여 반사 방법을 얻고 즉시 Example 클래스의 모든 인스턴스에 적용 할 수 있습니다.

스칼라 반영이 더 복잡합니다. Example 클래스의 모든 인스턴스에 대해 인스턴스 미러를 먼저 확보 한 다음이를 사용하여 메소드를 호출해야합니다.

놀라운 점은 그러한 복잡성이 있더라도 스칼라 반사가 더 빠를 것 같습니다 (비교는 Scala TypeTags and performanceFaster alternatives to Java's reflection의 답변 참조). 아무도 내 추측을 확인할 수 있습니까? 이 격차의 원인은 무엇입니까?

통찰력을 가져 주셔서 감사합니다.

+1

수십억 번 방법을 호출해야하는 경우가 아니라면 조기 최적화입니다. 프로파일 링을 통해 실제로 문제가 있는지 확인할 때까지는 걱정하지 마십시오. 그것은 중요하지 않을 것입니다. –

+0

둘 다 백업으로 구현 중이지만 프로파일 링 결과가 다른 사람의 관찰과 일치하는지 알고 싶습니다. – tribbloid

답변

1

메서드 호출의 경우 Scala reflection uses Java reflection이므로 거의 빠를 수 없습니다.

스칼라 반사 빨리 그냥 숫자를 비교하면

(비교 자바의 반사에 스칼라 TypeTags 성능과 빠른 대안의 답변을 참조) 것 같다, 스칼라 반사 훨씬, 훨씬 더 느린 것 : 자바는 5 천만 반복에 0.4 초, 스칼라는 100 회 반복에 ~ 0.01 초가 걸립니다.

물론이 숫자를 비교할 수는 없습니다. 다른 컴퓨터에서 다른 설정, 다른 JVM 버전, 다른 워밍업을 사용하여 수행됩니다. 스칼라는 Java가 한 번 가져오고 호출 할 때마다 메소드를 검색합니다. 여러 번, 측정 된 방법이 다른 경우 등

+0

일부 테스트를 수행하고 추측을 확인했습니다. – tribbloid

관련 문제