34 Stimmen

Warum ist Erlang bei all diesen kleinen Mathe-Benchmarks langsamer als Java?

Bei der Suche nach Alternativen zu Java für eine verteilte/gleichzeitige/ausfallsichere/skalierbare Backend-Umgebung entdeckte ich Erlang. Ich habe einige Zeit mit Büchern und Artikeln verbracht, in denen fast alle (sogar Java-begeisterte Leute) sagen, dass Erlang in solchen Umgebungen die bessere Wahl ist, da viele nützliche Dinge auf eine weniger fehleranfällige Art und Weise sofort einsatzbereit sind.

Ich war mir sicher, dass Erlang in den meisten Fällen schneller ist, hauptsächlich wegen einer anderen Garbage-Collection-Strategie (pro Prozess), dem Fehlen eines gemeinsamen Zustands (zwischen Threads und Prozessen) und kompakteren Datentypen. Aber ich war sehr überrascht, als ich fand Vergleich von Erlang- und Java-Mathematikbeispielen wobei Erlang um mehrere Größenordnungen langsamer ist, z. B. von x10 bis x100.

Auch bei gleichzeitigen Aufgaben, sowohl auf mehreren Kernen als auch auf einem einzigen.

Was sind die Gründe dafür? Diese Antworten kamen mir in den Sinn:

  • Verwendung von Java-Primitiven (=> kein Heap/gc) bei den meisten Aufgaben
  • Gleiche Anzahl von Threads in Java-Code und Erlang-Prozessen, so dass das Akteursmodell hier keinen Vorteil hat
  • Oder einfach nur, dass Java statisch typisiert ist, während Erlang nicht typisiert ist.
  • Etwas anderes?

Wenn das daran liegt, dass es sich um sehr spezifische mathematische Algorithmen handelt, kann dann jemand mehr reale/praktische Leistungstests zeigen?

UPDATE: Ich habe die Antworten so weit zusammenfassen, dass Erlang ist nicht das richtige Werkzeug für solche spezifischen "schnelle Java Fall", aber die Sache, die mir unklar ist - was ist der Hauptgrund für solche Erlang Ineffizienz hier: dynamische Typisierung, GC oder schlechte native Kompilierung?

2voto

Andy Till Punkte 3231

Die Tatsache, dass Erlang für jeden Wert Speicher zuweisen muss, während man in Java typischerweise Variablen wiederverwendet, wenn man es schnell haben will, bedeutet, dass es für "enge Schleifen"-Benchmarks immer schneller sein wird.

Es wäre interessant, eine Java-Version mit dem -client-Flag und Boxed Primitives zu testen und mit Erlang zu vergleichen.

Ich halte die Verwendung von hipe für unfair, da es sich nicht um ein aktives Projekt handelt. Es würde mich interessieren, ob irgendeine unternehmenskritische Software auf diesem System läuft.

-8voto

Durandal Punkte 19701

Ich kenne mich mit Erlang nicht aus, aber das scheint sowieso ein Vergleich zwischen Äpfeln und Birnen zu sein. Sie müssen sich darüber im Klaren sein, dass mehr als ein Jahrzehnt lang erhebliche Anstrengungen unternommen wurden, um die Leistung von Java so weit zu verbessern, wie sie heute ist.

Es überrascht mich nicht, dass eine Sprachimplementierung, die von Freiwilligen oder einem kleinen Unternehmen durchgeführt wird, diesen Aufwand nicht übertreffen kann.

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