Ich muss Folgendes berechnen Math.exp()
von Java sehr häufig, ist es möglich, eine native Version schneller laufen zu lassen als java 's Math.exp()
??
Ich habe es mit jni + C probiert, aber es ist langsamer als einfach nur java .
Ich muss Folgendes berechnen Math.exp()
von Java sehr häufig, ist es möglich, eine native Version schneller laufen zu lassen als java 's Math.exp()
??
Ich habe es mit jni + C probiert, aber es ist langsamer als einfach nur java .
Das Problem bei der Verwendung von JNI ist der Overhead, der durch den Aufruf von JNI entsteht. Die virtuelle Maschine von Java ist heutzutage ziemlich optimiert, und Aufrufe der eingebauten Math.exp() werden automatisch so optimiert, dass sie direkt die C-Funktion exp() aufrufen, und sie könnten sogar in direkte x87-Gleitkomma-Assemblerbefehle optimiert werden.
Es gibt einfach einen Overhead, der mit der Verwendung der JNI verbunden ist, siehe auch: http://java.sun.com/docs/books/performance/1st_edition/html/JPNativeCode.fm.html
Wie bereits von anderen vorgeschlagen, sollten Sie versuchen, die Vorgänge zusammenzufassen, bei denen die JNI verwendet wird.
Die Anrufe über die JNI-Grenze hinweg sind mit Kosten verbunden.
Wenn Sie die Schleife, die exp() aufruft, auch in den nativen Code verschieben könnten, so dass es nur einen nativen Aufruf gibt, dann könnten Sie bessere Ergebnisse erzielen, aber ich bezweifle, dass es wesentlich schneller als die reine Java-Lösung sein wird.
Ich kenne die Details Ihrer Anwendung nicht, aber wenn Sie eine recht begrenzte Anzahl möglicher Argumente für den Aufruf haben, könnten Sie eine vorberechnete Nachschlagetabelle verwenden, um Ihren Java-Code schneller zu machen.
Es mag nicht mehr relevant sein, aber nur damit Sie es wissen, in den neuesten Versionen des OpenJDK (siehe hier ), sollte Math.exp zu einem intrinsischen Element gemacht werden (wenn Sie nicht wissen, was das ist, lesen Sie hier ).
Dies macht die Leistung auf den meisten Architekturen unschlagbar, denn es bedeutet, dass die Hotspot-VM den Aufruf von Math.exp zur Laufzeit durch eine prozessorspezifische Implementierung von exp ersetzt. Diese Aufrufe sind nie zu schlagen, da sie für die Architektur optimiert sind...
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Haben Sie irgendwelche Leistungstests durchgeführt, um genaue Zahlen der Zeit zu erhalten, die Math.exp() im Vergleich zur JNI-Version benötigt? Wie wäre es mit einem 10k-maligen Aufruf, um den Effekt des JIT zu sehen?
0 Stimmen
Dies hängt von Ihrer JVM ab, aber normalerweise
Math.exp
ist in C implementiert . Möglicherweise möchten Sie aber einen schnelleren (weniger präzisen) Algorithmus verwenden.