Ich habe mich dafür interessiert, da einige der Benchmarks perfekt für Erlang geeignet sind, z. B. die Gensequenzierung. Also auf http://benchmarksgame.alioth.debian.org/ Als erstes habe ich mir die Implementierungen der Rückwärtskomplementierung sowohl für C als auch für Erlang sowie die Testdetails angesehen. Ich fand heraus, dass der Test voreingenommen ist, weil er nicht die Zeit berücksichtigt, die Erlang braucht, um die VM /w die Scheduler zu starten, nativ kompiliertes C wird viel schneller gestartet. Die Art und Weise, wie diese Benchmarks messen, ist grundsätzlich: time erl -noshell -s revcomp5 main < revcomp-input.txt
Jetzt sagt der Benchmark, dass Java 1,4 Sekunden und Erlang /w HiPE 11 Sekunden brauchte. Für die Ausführung des (Single threaded) Erlang-Codes benötigte ich 0,15 Sekunden, und wenn man die Zeit abzieht, die zum Starten des vm benötigt wurde, dauerte die tatsächliche Arbeitslast nur 3000 Mikrosekunden (0,003 Sekunden).
Ich habe also keine Ahnung, wie das bewertet wird, wenn es 100 Mal gemacht wird, dann macht es keinen Sinn, da die Kosten für das Starten der Erlang-VM x100 sein werden. Wenn die Eingabe viel länger ist als angegeben, würde es Sinn machen, aber ich sehe keine Details auf der Webseite dazu. Um die Benchmarks für verwaltete Sprachen fairer zu machen, sollte der Code (Erlang/Java) ein Unix-Signal an Python (das den Benchmark durchführt) senden, dass er die Startup-Funktion getroffen hat.
Abgesehen vom Benchmark führt die Erlang-VM am Ende im Wesentlichen nur Maschinencode aus, ebenso wie die Java-VM. Es gibt also keine Möglichkeit, dass eine mathematische Operation in Erlang länger dauern würde als in Java.
Was Erlang nicht kann, sind Daten, die sich häufig ändern müssen. Wie zum Beispiel eine verkettete Blockchiffre. Sagen wir, Sie haben die Zeichen "0123456789", jetzt Ihre Verschlüsselung xors die ersten 2 Zeichen durch 7, dann xors die nächsten zwei Zeichen durch das Ergebnis der ersten beiden addiert, dann xors die vorherigen 2 Zeichen durch die Ergebnisse der aktuellen 2 subtrahiert, dann xors die nächsten 4 Zeichen etc
Da Objekte in Erlang unveränderlich sind, bedeutet dies, dass das gesamte char-Array jedes Mal kopiert werden muss, wenn es verändert wird. Deshalb hat Erlang Unterstützung für Dinge namens NIFS, das ist C-Code, den man aufrufen kann, um genau dieses Problem zu lösen. In der Tat alle die Verschlüsselung (ssl, aes, blowfish..) und Kompression (zlib,..), die mit Erlang geliefert werden, sind in C implementiert, auch gibt es in der Nähe von 0 Kosten mit dem Aufruf von C aus Erlang verbunden.
Mit Erlang erhalten Sie also das Beste aus beiden Welten, Sie erhalten die Geschwindigkeit von C mit der Parallelität von Erlang.
Wenn ich die Rückwärtskomplementierung auf die SCHNELLSTMÖGLICHE Art und Weise implementieren wollte, würde ich den mutierenden Code in C, den parallelen Code aber in Erlang schreiben. Unter der Annahme, dass die Eingabe unendlich ist, würde ich Erlang auf die > <<Line/binary, ">", Rest/binary>> = read_stream
Übergabe des Blocks an den ersten verfügbaren Scheduler per Round-Robin-Verfahren, bestehend aus unendlich vielen privaten vernetzten EC2-Hidden Nodes, die dem Cluster jede Millisekunde in Echtzeit hinzugefügt werden.
Diese Knoten rufen dann über NIFS C zur Verarbeitung auf (C war die schnellste Implementierung für Reverse-Compliment auf der alioth-Website) und senden dann die Ausgabe zurück an den Knoten-Master, der sie an den Eingabecomputer sendet.
Um all dies in Erlang zu implementieren, müsste ich den Code so schreiben, als ob ich ein Programm mit nur einem Thread schreiben würde, und es würde weniger als einen Tag dauern, diesen Code zu erstellen.
Um dies in Java zu implementieren, müsste ich den Single-Thread-Code schreiben, ich müsste die Leistungseinbußen durch den Aufruf von Managed zu Unmanaged in Kauf nehmen (da wir die C-Implementierung für die Routinearbeit verwenden werden), und ihn dann umschreiben, um 64 Kerne zu unterstützen. Dann neu schreiben, um mehrere CPUS zu unterstützen. Dann schreiben Sie es erneut um, um Clustering zu unterstützen. Dann wieder neu schreiben, um Speicherprobleme zu beheben.
Und das ist Erlang in einer Nussschale.