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 .
Wie würden Sie die Ergebnisse zwischenspeichern? Das Zwischenspeichern kann ziemlich kostspielig sein: Ich habe es mit einer HashMap versucht, und es war doppelt so langsam wie die einfache Berechnung der Exp. In meinem Test berechne ich 71M exp, aber mit "nur" 1,8M verschiedenen Argumenten.
Möglicherweise können Sie den Vorgang beschleunigen, wenn Sie sie in Stapeln durchführen. Ein JNI-Aufruf verursacht zusätzlichen Overhead, so dass Sie dies nicht für jede exp(), die Sie berechnen müssen, tun möchten. Ich würde versuchen, ein Array mit 100 Werten zu übergeben und die Ergebnisse abzurufen, um zu sehen, ob dies die Leistung verbessert.
Die eigentliche Frage ist, ob dies für Sie zu einem Engpass geworden ist. Haben Sie ein Profil Ihrer Anwendung erstellt und festgestellt, dass dies eine der Hauptursachen für die Verlangsamung ist?
Wenn nicht, würde ich die Java-Version empfehlen. Versuchen Sie nicht, eine Voroptimierung vorzunehmen, da dies die Entwicklung nur verlangsamen wird. Es kann sein, dass Sie viel Zeit mit einem Problem verbringen, das vielleicht gar keines ist.
Dennoch denke ich, dass Ihr Test Ihnen die Antwort gegeben hat. Wenn jni + C langsamer ist, verwenden Sie die Version von Java.
Da der Java-Code mit dem Just-in-Time-Compiler (JIT) zu nativem Code kompiliert wird, gibt es eigentlich keinen Grund, JNI für den Aufruf von nativem Code zu verwenden.
Außerdem sollten Sie die Ergebnisse einer Methode, bei der die Eingabeparameter reelle Fließkommazahlen sind, nicht in den Cache stellen. Der gewonnene Zeitgewinn wird durch den beanspruchten Speicherplatz wieder wettgemacht.
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.