63 Stimmen

C# / F# Leistungsvergleich

Gibt es irgendeinen C#/F# Performance-Vergleich im Web zur Verfügung, um die richtige Verwendung der neuen F#-Sprache zu zeigen?

62voto

Stefan Savev Punkte 1249

Natürlicher F#-Code (z. B. funktional/unveränderlich) ist langsamer als natürlicher (imperativer/veränderlicher objektorientierter) C#-Code. Allerdings ist diese Art von F#-Code viel kürzer als gewöhnlicher C#-Code. Offensichtlich gibt es einen Kompromiss.

Andererseits können Sie in den meisten Fällen mit F#-Code die gleiche Leistung erreichen wie mit C#-Code. Dazu ist es in der Regel erforderlich, im imperativen oder veränderlichen objektorientierten Stil zu kodieren, Profile zu erstellen und Engpässe zu beseitigen. Sie verwenden dieselben Tools, die Sie auch in C# verwenden würden: z. B. den .Net-Reflektor und einen Profiler.

Dennoch lohnt es sich, sich einiger hochproduktiver Konstrukte in F# bewusst zu sein, die die Leistung verringern. Nach meiner Erfahrung habe ich die folgenden Fälle gesehen:

  • Referenzen (im Gegensatz zu Klasseninstanzvariablen), nur in milliardenfach ausgeführtem Code

  • F#-Vergleich (<=) vs. System.Collections.Generic.Comparer, z.B. bei binärer Suche oder Sortierung

  • Tail-Aufrufe - nur in bestimmten Fällen, die nicht durch den Compiler oder die .Net-Laufzeit optimiert werden können. Wie in den Kommentaren erwähnt, hängt dies von der .Net-Laufzeitumgebung ab.

  • F#-Sequenzen sind doppelt so langsam wie LINQ. Dies ist auf Referenzen und die Verwendung von Funktionen in der F#-Bibliothek zurückzuführen, um die Übersetzung von seq<_> zu implementieren. Dies ist leicht zu beheben, da Sie das Seq-Modul durch ein Modul mit denselben Signaturen ersetzen können, das Linq, PLinq oder DryadLinq verwendet.

  • Tupel, F# Tupel ist eine auf dem Heap sortierte Klasse. In manchen Fällen, z.B. bei einem int*int Tupel, kann es sich lohnen, ein struct zu verwenden.

  • Allokationen ist zu bedenken, dass eine Closure eine Klasse ist, die mit dem new-Operator erstellt wird und sich die zugegriffenen Variablen merkt. Es könnte sich lohnen, die Closure herauszunehmen oder sie durch eine Funktion zu ersetzen, die die Variablen, auf die zugegriffen wird, explizit als Argumente aufnimmt.

  • Versuchen Sie, Inline zu verwenden, um die Leistung zu verbessern, insbesondere bei generischem Code.

Meiner Erfahrung nach sollte man zuerst in F# programmieren und nur die wichtigen Teile optimieren. In bestimmten Fällen kann es einfacher sein, die langsamen Funktionen in C# zu schreiben, als zu versuchen, F# zu optimieren. Aus der Sicht der Programmierereffizienz ist es jedoch sinnvoll, mit dem Prototyping in F# zu beginnen und dann das Profil zu erstellen, zu zerlegen und zu optimieren.

Unterm Strich könnte Ihr F#-Code aufgrund von Programmdesign-Entscheidungen langsamer sein als C#, aber letztendlich kann Effizienz erreicht werden.

3 Stimmen

Interessante Punkte, aber Sie müssten auf mehr als nur eine Laufzeit zu überprüfen; mit CLI 2, x86 und x64 hatte sehr unterschiedliche Schwanz-Aufruf; es wurde offensichtlich teilweise aufgrund der Unterstützung von F# gestärkt, aber dies kann C#-Profile verzerren.

10 Stimmen

"Dies erfordert in der Regel eine Kodierung im imperativen oder veränderlichen objektorientierten Stil. Nein, Sie wollen Mutation für Leistung, aber Sie müssen vermeiden objektorientierten Stil zu Gunsten des Fortran-Stils. OOP ist auch langsam...

1 Stimmen

Wenn sie wirklich schnell sein müssen, sollten sie Assembler über alles stellen.

24voto

3 Stimmen

Der erste Link sagt: Seite nicht gefunden.

11voto

Benjol Punkte 60397

Hier sind einige Links zu diesem Thema (oder zu verwandten Themen):

Ich glaube mich an einen anderen Beitrag in Robert Pickerings Blog (oder war es Scott Hanselman?) zu erinnern, der besagt, dass man letztlich, da beide auf demselben Gerüst sitzen, die kann Sie können mit beiden die gleiche Leistung erzielen, aber manchmal müssen Sie dafür den natürlichen Ausdruck der Sprache "verdrehen". In dem Beispiel, an das ich mich erinnere, musste er F# verdrehen, um eine vergleichbare Leistung mit C# zu erzielen...

6 Stimmen

Das Umgekehrte gilt auch, wenn Sie von F#-spezifischen Funktionen profitieren, wie z. B. inline .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X