Ich weiß, dass das Überschreiten von Grenzen beim Tätigen eines JNI-Aufrufs in Java langsam ist.
Aber ich will wissen , was ist es , dass es langsam macht? Was macht die zugrunde liegende JVM-Implementierung, wenn ein JNI-Aufruf ausgeführt wird, der ihn so langsam macht?
Antworten:
Zunächst ist anzumerken, dass es sich bei "langsam" um etwas handelt, das mehrere zehn Nanosekunden dauern kann. Für triviale native Methoden habe ich 2010 Anrufe mit durchschnittlich 40 ns auf meinem Windows-Desktop und 11 ns auf meinem Mac-Desktop gemessen. Wenn Sie nicht viele Anrufe tätigen, werden Sie es nicht bemerken.
Das Aufrufen einer nativen Methode kann jedoch langsamer sein als das Aufrufen einer normalen Java-Methode. Ursachen sind:
Einige zusätzliche, möglicherweise datierte Diskussionen finden sich in "Java® Platform Performance: Strategies and Tactics", 2000, von Steve Wilson und Jeff Kesselman, in Abschnitt "9.2: Untersuchung der JNI-Kosten". Es ist ungefähr ein Drittel des Weges auf dieser Seite , wie im Kommentar von @Philip unten angegeben.
Das IBM DeveloperWorks-Dokument 2009 "Best Practices für die Verwendung der Java Native Interface" enthält einige Vorschläge zur Vermeidung von Leistungsproblemen mit JNI.
quelle
sun.misc.Unsafe
und ziemlich viele andere Dinge wieSystem.currentTimeMillis/nanoTime
werden von der JVM über "Magie" gehandhabt. Sie sind keine JNI und sie haben überhaupt keine richtigen .c / .h-Dateien, was das JVM-Impl selbst entblößt. Der Ansatz kann nur befolgt werden, wenn Sie die JVM schreiben / hacken.Erwähnenswert ist, dass nicht alle mit gekennzeichneten Java-Methoden
native
"langsam" sind. Einige von ihnen sind intrinsisch , was sie extrem schnell macht. Um zu überprüfen, welche intrinsisch sind und welche nicht, können Siedo_intrinsic
unter vmSymbols.hpp suchen .quelle
Grundsätzlich konstruiert die JVM die C-Parameter für jeden JNI-Aufruf interpretativ und der Code ist nicht optimiert.
In diesem Dokument werden viele weitere Details beschrieben
Wenn Sie daran interessiert sind, JNI mit nativem Code zu vergleichen, enthält dieses Projekt Code zum Ausführen von Benchmarks.
quelle