Java에서 JNI 호출을 할 때 '교차 경계'가 느리다는 것을 알고 있습니다.
그러나 느리게 만드는 것이 무엇인지 알고 싶습니다 . JNI 호출을 수행 할 때 기본 jvm 구현이 느리게 만드는 것은 무엇입니까?
Java에서 JNI 호출을 할 때 '교차 경계'가 느리다는 것을 알고 있습니다.
그러나 느리게 만드는 것이 무엇인지 알고 싶습니다 . JNI 호출을 수행 할 때 기본 jvm 구현이 느리게 만드는 것은 무엇입니까?
답변:
먼저, "느리게"함으로써 수십 나노초가 걸릴 수있는 것에 대해 이야기하고 있습니다. 사소한 기본 방법의 경우 2010 년에 Windows 데스크톱에서 평균 40ns, Mac 데스크톱에서 11ns의 통화를 측정했습니다. 전화 를 많이 하지 않으면 눈치 채지 못할 것입니다.
즉, 기본 메소드 호출 은 일반 Java 메소드 호출보다 느릴 수 있습니다 . 원인은 다음과 같습니다.
날짜에 대한 추가 논의는 "9.2 : JNI 비용 조사"의 Steve Wilson과 Jeff Kesselman의 "Java 플랫폼 성능 : 전략 및 전술"(2000)에서 찾을 수 있습니다. 아래 @Philip의 의견에 제공된 이 페이지 의 1/3 정도입니다 .
2009 IBM developerWorks 백서 "Java Native Interface 사용을위한 우수 사례" 에서는 JNI의 성능 저하를 피하는 방법에 대한 제안을 제공합니다.
sun.misc.Unsafe
것과 같은 다른 많은 것들이 System.currentTimeMillis/nanoTime
있습니다. 그들은 JNI가 아니며 적절한 .c / .h 파일이 없으므로 JVM impl 자체를 차단합니다. JVM을 쓰거나 해킹하지 않으면 접근 방식을 따를 수 없습니다.
표시된 모든 Java 메소드 native
가 "느리게" 있는 것은 아닙니다 . 그들 중 일부는 본질적으로 매우 빠릅니다. 고유하고 사람이되지 않는, 당신이 볼 수있는 사람을 확인하려면 do_intrinsic
에서 vmSymbols.hpp .
기본적으로 JVM은 해석 적으로 각 JNI 호출에 대한 C 매개 변수를 구성하며 코드는 최적화되지 않습니다.
이 백서 에 더 많은 세부 정보가 있습니다.
JNI와 네이티브 코드의 벤치마킹에 관심이 있다면 이 프로젝트 에는 벤치 마크를 실행하기위한 코드가 있습니다.