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?