Schnellste funktionale Sprache

18

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.

Farouk
quelle
18
Sprachen sind nicht schnell oder langsam, Implementierungen auch nicht.
Starblue
6
Sprachimplementierungen sind nicht schnell oder langsam. Programme, die mit diesen Sprachimplementierungen ausgeführt werden, sind (im Vergleich zu einigen anderen Programmen). Seien Sie wohltätig - wenn jemand davon spricht, dass eine Programmiersprache schneller ist als eine andere, ist es naheliegend, zu verstehen, dass es sich um bestimmte Programme handelt, die mit bestimmten Sprachimplementierungen ausgeführt werden.
August
3
@starblue: Das ist eine sehr glatte Antwort und keine sehr hilfreiche. Zwar ist es durchaus möglich, zwei Implementierungen derselben Sprache zu erstellen, von denen eine langsamer ist als die andere. Wie Sie es dort ausdrücken, impliziert dies jedoch, dass keine Details des Sprachdesigns vorhanden sind, die zwangsläufig bestimmte Ineffizienzen bei der Implementierung erfordern, die von anderen Sprachen verursacht werden Design, nicht erforderlich. Und das stimmt einfach nicht. (Besonders in diesem speziellen Thema; funktionale Sprachen sind für sie berüchtigt!)
Mason Wheeler
3
@igouy "Sprachimplementierungen sind nicht schnell oder langsam" Dies ist nicht wahr. CPythonvs PyPyfällt mir schnell ein.
NlightNFotis
@NlightNFotis - Wie viele Sekunden braucht CPython? Wie viele Sekunden braucht PyPy? Sprachimplementierungen sind nicht schnell oder langsam. Wie viele Sekunden dauert das Programm mit CPython?
Igouy

Antworten:

25

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.

Weltingenieur
quelle
Ich weiß, dass es viele Faktoren gibt, die berücksichtigt werden müssen, und selbst wenn alle Dinge perfekt wären, könnten sie sich bei verschiedenen Daten unterschiedlich verhalten, meine Frage ist ziemlich vage. Vielen Dank für den Link, sehr hilfreich - ich wusste nie, dass ATS so schnell ist
Farouk
Netter Link mit detaillierten Vergleichsinformationen. Ich bin etwas enttäuscht, dass Clojure viel mehr Speicher verbraucht und deutlich länger dauert als Java. Ich erinnere mich an einige Behauptungen, wonach Clojure eine ähnliche Leistung erbringt, was anscheinend nicht der Fall ist.
DPM
Auf der ATS-Website heißt es, dass ATS eine Vielzahl von Programmierparadigmen unterstützt. Bevor Sie also behaupten, ATS sei schneller als der Rest, müssen Sie nachweisen, dass diese Programme tatsächlich in einem funktionalen Stil geschrieben sind. Es könnte sein, dass funktionierende ATS nicht schneller als der Rest ist.
16.
2
Auf der Scala-Website heißt es, dass Scala objektorientierte und funktionale Funktionen integriert. Haben Sie überprüft, ob die Scala-Programme als funktionale Programme und nicht als objektorientierte Programme geschrieben sind?
August
12

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.

Stephen C
quelle
Das Beste, was Sie tun können, ist die Leistung bestimmter Programme zu messen. Wenn wir die Leistung einer Sprachimplementierung messen, möchten wir herausfinden, wie lange es dauert, ein Programm zu kompilieren, und nicht, wie lange das Programm für die Ausführung benötigt.
16.
Die Laufzeit des Programms ist eine Eigenschaft dieses bestimmten Programms, wenn es unter Verwendung dieser bestimmten Sprachimplementierung auf dieser bestimmten Hardware usw. usw. ausgeführt wird. Da die Laufzeit des Programms keine Eigenschaft der Sprache ist, ist es wohltätig, in diesem Kontext den Namen der Sprache zuzulassen wird als Abkürzung für die üblichen bekannten Sprachimplementierungen verwendet.
Juli
@igouy - das stimmt. Aber viele Leute machen keine Unterscheidung, wie viele alte Websites belegen, die behaupten, "Java ist langsam. Leider wurde dieser Unsinn von einer ganzen Generation von Programmierern wörtlich gelesen ... und das hat Javas Ansehen erheblich geschädigt. DAS Deshalb mache ich diesen Punkt HIER.
Stephen C
„Ein (indirektes) Maß für die Sprache der Implementierung“ - - Wie Sie die Freiheit haben , sagen wollen , bitte erklären , warum jemand anderes nicht frei sein sollte zu sagen - ein (indirektes) Maß für eine Sprache .
Igouy
@igouy - 1) Sie können frei sagen, was immer Sie möchten. Aber das macht dich nicht richtig. 2) Betrachten Sie den Fall, in dem die einzige Implementierung einer Sprache Mist ist. Wir messen es. Dann aktualisieren wir die Implementierung, vergleichen sie und die Leistung hat sich dramatisch verbessert. Bedeutet das, dass sich die Sprachleistung verbessert hat? Wie macht das Sinn ... angesichts der Tatsache, dass sich die Sprache NICHT geändert hat !!!
Stephen C
6

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.)

Zachary K
quelle