10 Stimmen

schneller Math.exp() über JNI?

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 .

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.

6voto

jjnguy Punkte 132790

Verwenden Sie Java's.

Außerdem können Sie die Ergebnisse der Berechnung zwischenspeichern und so die Antwort schneller nachschlagen, als sie erneut zu berechnen.

0 Stimmen

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.

5voto

John Millikin Punkte 190278

Sie sollten die Schleife, die die Math.exp() auch in C. Andernfalls wird der Overhead des Marshallings zwischen Java und C jeden Leistungsvorteil zunichte machen.

3voto

Bill the Lizard Punkte 384619

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.

2voto

scubabbl Punkte 12427

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.

0voto

Alan Krueger Punkte 4601

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.com

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.

Powered by:

X