8 Stimmen

Java-Leistung bei numerischen Algorithmen

Ich bin neugierig auf die Leistung von numerischen Java-Algorithmen, z. B. die Multiplikation von Matrizen mit doppelter Genauigkeit, die auf den neuesten JIT-Maschinen ausgeführt werden, z. B. im Vergleich zu manuell getunten SSE-C++/Assembler- oder Fortran-Pendants.

Ich habe im Internet nachgeschaut, aber die meisten Ergebnisse stammen von vor fast 10 Jahren, und soweit ich weiß, hat sich Java seither stark weiterentwickelt.

Wenn Sie Erfahrung mit der Verwendung von Java für numerisch intensive Anwendungen haben, können Sie Ihre Erfahrungen mitteilen. Wie gut ist die Leistung von Java in Kerneln, in denen die Schleifen relativ kurz sind und der Speicherzugriff nicht sehr gleichmäßig ist, aber immer noch innerhalb der Grenzen des L1-Cache liegt? Wenn ein solcher Kernel mehrmals hintereinander ausgeführt wird, kann die JVM ihn dann während der Laufzeit optimieren?

感謝

0voto

davidtbernal Punkte 13013

Außerdem ist es am besten, wenn Sie es selbst testen, da die Leistung je nachdem, was Sie genau tun, etwas variiert. Ich finde es schwierig, Shane C. Masons Antwort zu glauben, dass die Java-Leistung der Leistung von C++ oder Fortran entspricht, da selbst C++ und Fortran für einige wissenschaftliche Berechnungsalgorithmen nicht wirklich vergleichbar sind.

Ich habe einen Strömungsberechnungscode, den ich mit C++ geschrieben habe, und denselben Code im Wesentlichen in Fortran übersetzt. Ich bin mir noch nicht ganz sicher, warum, aber die Fortran-Version ist etwa doppelt so schnell wie die C++-Version. Ich würde vermuten, dass Java mit Funktionen wie Bound-Checking und Garbage Collection langsamer ist als beide, aber ich weiß es erst, wenn ich es getestet habe.

0voto

James Black Punkte 41034

Dies kann sehr davon abhängen, was Sie im C++-Code tun.

Verwenden Sie zum Beispiel die GPU? Editar Ich habe jogl vergessen, also kann Java hier mithalten.

Parallelisieren Sie mit STM oder Shared-Memory, dann kann Java nicht mithalten. Für einen Link zur Analyse der parallelen Matrixmultiplikation: http://www.cs.utexas.edu/users/plapack/papers/ipps98/ipps98.html

Verfügen Sie über genügend Speicher, um die Berechnungen im Speicher durchzuführen, so dass der Garbage Collector nicht benötigt wird, und haben Sie den Garbage Collector für eine optimale Leistung feinabgestimmt? Dann kann Java vielleicht konkurrenzfähig sein.

Verwenden Sie Multicores, und ist C++ so optimiert, dass es die Vorteile dieser Architektur nutzen kann? Dann wird Java nicht mithalten können.

Wenn Sie mehrere miteinander verbundene Computer verwenden, kann Java nicht mithalten.

Verwenden Sie eine beliebige Kombination davon, dann hängt es von der jeweiligen Implementierung ab.

Java ist nicht darauf ausgelegt, mit einem von Hand abgestimmten C++-Programm zu konkurrieren, aber die Zeit, die für die Abstimmung benötigt wird, reicht aus, um genügend Berechnungen durchzuführen, bei denen es eine Rolle spielt. Java kann eine vernünftige Geschwindigkeit liefern, aber mit weniger Arbeit als eine manuelle Abstimmung, aber nicht viel besser als ein C++-Code.

Vielleicht möchten Sie sehen, ob es eine Verbesserung gegenüber Haskell oder Erlang gibt, z. B. gegenüber Ihrem C++, da diese Sprachen besser für diese Art von Arbeit geeignet sind.

0voto

igouy Punkte 2477

Interessieren Sie sich für diese Art von Berechnungen - Fast Fourier Transform, Jacobi Successive Over Relaxation, Monte Carlo Integration, Sparse Matrix Mult, Dense LU Matrix Factorisation?

Sie bilden die SciMark 2.0 zusammengesetzter Benchmark das Sie als Applet auf Ihrem Rechner starten können.

Außerdem gibt es ANSI C-Versionen der Programme, und ein Intel-Dokument (pdf) zur Optimierung und Neukompilierung von SciMark für C++ .


In ähnlicher Weise könnten Sie Folgendes verwenden Die Java Grande Forum Benchmark Suite y der Vergleich C-Programme .

-4voto

Shane C. Mason Punkte 7198

Java verwendet einen Just-in-Time-Compiler (JIT), um den Bytecode in die native Maschinensprache umzuwandeln - beim ersten Durchlauf eines Codeblocks ist er also langsamer, aber sobald das Segment "aufgewärmt" ist, ist die Leistung gleichwertig. Kurz gesagt - die numerische Leistung ist ziemlich gut.

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