Vor kurzem habe ich mich mit funktionaler Programmierung befasst, insbesondere mit Haskell und F #. Nach einigem Durchstöbern konnte ich keinen Benchmark-Vergleich der bekannteren funktionalen Sprachen (Scala, F # usw.) finden.
Ich weiß, dass es für einige Sprachen nicht unbedingt fair ist (Scala fällt mir ein), da es sich um Hybriden handelt, aber ich möchte nur wissen, welche bei welchen Operationen und insgesamt welche besser abschneiden als welche.
CPython
vsPyPy
fällt mir schnell ein.Antworten:
Laut dem Great Benchmarks Game ist ATS mit Haskell, Scala und einer der Varianten von Common Lisp schneller als der Rest. Danach sind Ocaml und F # in etwa gleich schnell, wobei Racket und Clojure hinterherhinken ...
Fast nichts davon bedeutet jedoch wirklich etwas. Es ist alles eine Frage des Problems, der Maschine, des Compilers, der Codierungstechniken und in einigen Fällen des reinen Glücks. Im Allgemeinen übertreffen direkt maschinencodierte Sprachen wie Haskell VM-kompilierte Sprachen wie F # und nur interpretierte Sprachen bei Weitem. Außerdem sind statisch typisierte Sprachen aufgrund der statischen Analyse im Allgemeinen schneller als dynamisch typisierte Sprachen, sodass alle Typoperationen zur Kompilierungszeit und nicht zur Laufzeit berechnet werden können. Auch dies sind allgemeine Regeln, es wird immer Ausnahmen geben. "Paradigmen" haben wenig damit zu tun.
quelle
Es sollte auch darauf hingewiesen werden, dass Sie die Leistung einer Programmiersprache nicht messen / quantifizieren können . Das Beste, was Sie tun können, ist die Leistung einer bestimmten Implementierung der Sprache auf bestimmten Plattformen zu messen , auf denen bestimmte Programme ausgeführt werden.
Wenn Sie also nach der "schnellsten funktionalen Sprache" fragen, was Sie wirklich nach den besten der aktuellen Implementierungen der Sprache (n) fragen.
Der Kommentar von @igouy weist darauf hin, dass es andere Leistungsindikatoren für die Sprachumsetzung gibt. zB Übersetzungszeit. Dies ändert jedoch nichts an der Tatsache, dass die Laufzeit des Anwendungsprogramms ein (indirektes) Maß für die Implementierung einer Sprache ist und kein Maß für die Sprache selbst.
Betrachten Sie zum Beispiel Java. Angenommen, ich schreibe einen Single-Threaded-Benchmark, der ausschließlich die Sprachfunktionen von klassischem Java (Java 1.0) verwendet. Wenn ich mit JDK 1.0 kompiliere und starte, wird die Leistung schlecht (weil JDK 1.0 keinen nativen Code-Compiler hatte). Wenn ich von JDK 1.1 zu ... JDK 1.7 wechsle, erhalte ich höchstwahrscheinlich progressiv bessere Ergebnisse. Dies liegt jedoch nicht an Änderungen der Java- Sprache, da mein Benchmark dieselbe Sprachuntermenge verwendet. Die Beschleunigung ist vielmehr auf Verbesserungen der Compiler, des Laufzeitsystems und / oder der Implementierung von Klassenbibliotheken zurückzuführen. Dies sind alles Implementierungsprobleme .
Der andere Punkt ist, dass diese Implementierungsunterschiede für dieselbe Sprache wirklich signifikant sein können (z. B. Größenordnungen). Die Tatsache, dass die beste Implementierung für Sprache X schneller ist als die beste (oder einzige) Implementierung von Sprache Y, sagt also nicht unbedingt viel über die Sprache selbst aus.
quelle
Wenn Sie Sprachen nur nach der Ausführungsgeschwindigkeit betrachten, fehlen Ihnen einige wichtige Punkte. Geschwindigkeit ist eine gute Sache, aber es ist nicht die einzige Sache.
Haskell verwendet ein sehr robustes Typensystem, um Programme zu erstellen, die mit größerer Wahrscheinlichkeit fehlerfrei und robust sind.
Erlang verwendet sein integriertes Überwachungssystem, um Fehlersysteme zu erstellen, die Ihnen ein hohes Maß an Zuverlässigkeit bei verschiedenen Arten von Fehlern bieten. Darüber hinaus bietet Erlang eine Parallelität, die in anderen Sprachen nur schwer zu erreichen ist.
In Wahrheit würde ich die Geschwindigkeit der Ausführung in der heutigen Zeit als ziemlich weit unten auf der Liste der Dinge betrachten, die ich in den meisten Fällen in Betracht ziehen würde. (OK, wenn ich massive numerische Berechnungen durchführen würde, würde ich wahrscheinlich Fortran für die Geschwindigkeit verwenden wollen, aber sonst ist es einfach nicht wichtig genug, um eine Rolle zu spielen.)
quelle