In früheren Fragen wurde mir gesagt, dass funktionale Programmiersprachen für dynamische Systeme wie eine Physik-Engine nicht geeignet sind, hauptsächlich weil das Mutieren von Objekten teuer ist. Wie realistisch ist diese Aussage und warum?
In früheren Fragen wurde mir gesagt, dass funktionale Programmiersprachen für dynamische Systeme wie eine Physik-Engine nicht geeignet sind, hauptsächlich weil das Mutieren von Objekten teuer ist. Wie realistisch ist diese Aussage und warum?
Antworten:
Sowohl Haskell als auch Clojure ermöglichen eine tatsächliche Veränderlichkeit, sodass dies zunächst kein Problem darstellt.
Wenn Ihre "veränderlichen" Daten aus Zwischenwerten bestehen, die im Rahmen einer größeren Berechnung schrittweise aktualisiert werden, müssen Sie möglicherweise nicht einmal veränderbar sein, um effizient zu sein! Beispielsweise wird in Haskell derzeit nach einer Technik namens Stream Fusion geforscht , bei der der Compiler Verarbeitungsschleifen, Datenproduzenten und Datenkonsumenten zusammenführt, um dazwischenliegende Datenstrukturen vollständig zu eliminieren.
Das Hauptproblem bei Haskell ist hier die Faulheit - in einem Programm zur Zahlenverarbeitung, in dem Sie viele Eingabedaten und viele Ausgabedaten haben und alles wichtig ist, tut Faulheit Ihnen nur sehr wenige Gefälligkeiten, verursacht aber dennoch einen gewissen Overhead. Das heißt nicht, dass Sie in Haskell keine derartigen Programme schreiben können (die Leute tun dies tatsächlich), aber es spielt nicht mit den Stärken der Sprache und Sie müssen das Bewertungsmodell besser verstehen, um die gewünschte Leistung zu erzielen.
Das heißt, starkes Zahlen-Crunching spielt auch nicht mit den Stärken der JVM. Für diese Art von Programm gibt es FORTRAN immer noch.
Ich kann nicht für Clojure sprechen, aber ich kann sagen, dass Haskell viele sehr gut abgestimmte E / A-Pakete zur Verfügung hat, die alle gewünschten Mutationen ermöglichen.
Hier ist eine Antwort auf eine Frage, die ich geschrieben habe, in der jemand die drei häufigsten und ihre Leistung beschreibt: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286
Sie können hier auch ein einfaches Diagramm sehen, das die Leistungsmetriken eines Haskell-Webservers namens Warp zeigt, einer sehr E / A-intensiven Anwendung.
In Bezug auf Haskell herrscht große Verwirrung. Die Wahrheit ist, dass es fantastische E / A-Funktionen mit vielen Hackage-Paketen für die Verwendung von E / A auf sehr unterschiedliche Arten gibt, von denen viele stark optimiert wurden. Der Grund, warum die Leute annehmen, dass dies nicht der Fall ist, ist, dass Haskell große Anstrengungen unternimmt, um E / A von allem anderen zu trennen, aber das hat keinen Einfluss auf die Leistungsmerkmale.
Um nun über Leistungsmerkmale zu sprechen, der Grund, warum die Leute erkennen, dass es eine schlechte Leistung hat, liegt in der verzögerten Bewertung, die dazu führt, dass es sich auf eine Weise verhält, die nicht immer intuitiv ist. Dies ist jedoch etwas, worüber Sie sich wesentlich weniger Sorgen machen müssen, wenn Sie in einem E / A-Kontext mit destruktiven Aktualisierungen beginnen, z. B. in einem System, auf das Sie sich beziehen. Weitere Personen stellen häufig fest, dass bei Leistungsproblemen die eingebauten Einrichtungen zur Instrumentierung und Identifizierung der Ressourcen sehr hilfreich sind.
Eine andere Monade, die es wert ist, nach einem System wie dem von Ihnen beschriebenen gesucht zu werden, ist die ST-Monade, die speziell für destruktive Aktualisierungen von sehr kleinen E / A-Aufrufen vorgesehen ist und eine hervorragende Leistung bietet.
Entschuldigung, ich kann wirklich nicht mit Clojure sprechen, hoffentlich kann jemand anderes dort Details angeben.
Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases