55 votes

C# / F# comparaison des Performances

Est-il C#/F# comparaison des performances disponibles sur le web pour montrer l'utilisation correcte des nouveau langage F#?

54voto

Stefan Savev Points 376

Natural code F# (par exemple, fonctionnels et immuable) est plus lent que le naturel (impératif/mutable orienté objet) code C#. Toutefois, ce type de F# est beaucoup plus courte que d'habitude le code C#. Évidemment, il s'agit d'un compromis.

D'autre part, vous pouvez, dans la plupart des cas, de réaliser des performances de code F# égale à la performance de code C#. Ceci requiert le codage en impératif ou mutable orientée objet style, profil et supprimer les goulets d'étranglement. Vous utilisez la même outils que vous pouvez autrement utiliser en C#: par exemple .Net réflecteur et un profiler.

Qu'ayant dit, il vaut mieux être au courant de certains de haute productivité des constructions en F# que la diminution de la performance. Dans mon expérience, j'ai vu les cas suivants:

  • références (par rapport à la classe des variables d'instance), uniquement dans le code exécuté des milliards de fois

  • F# comparaison (<=) vs Système.Les Collections.Génériques.Comparer, par exemple en binaire de recherche ou de tri

  • appels tail -- dans certains cas seulement, qui ne peut pas être optimisé par le compilateur ou l' .Net runtime. Comme indiqué dans les commentaires, dépend de la .Net runtime.

  • F# séquences sont deux fois plus lent que LINQ. C'est en raison de références et l'utilisation de fonctions de bibliothèque F# pour mettre en œuvre la traduction de seq<_>. C'est facilement réparable, comme vous l'avez peut remplacer la Seq module, par l'un avec les mêmes signatures qui utilise Linq, PLinq ou DryadLinq.

  • Les Tuples, F# tuple est une classe triés sur le tas. Dans certains cas, par exemple, un int*int n-uplet, il pourrait payer pour utiliser une struct.

  • Les Allocations, il faut se souvenir que la fermeture est une classe, créé avec l'opérateur new, qui se souvient d'accès variables. Il pourrait être intéressant de "lever" la fermeture, ou remplacée par une fonction qui prend explicitement l'accès de variables comme arguments.

  • Essayez d'utiliser en ligne pour améliorer les performances, en particulier pour le code générique.

Mon expérience est à code F# premier et optimiser uniquement les parties de la matière. Dans certains cas, il peut être plus facile d'écrire de la lenteur de fonctions en C# plutôt que d'essayer de bidouiller F#. Cependant, à partir de programmeur de l'efficacité du point de vue du sens pour démarrer/prototype en F#, puis de profil, les démonter et de les optimiser.

Ligne de fond est que votre code F# pourraient finir plus lent que le C# en raison de la conception du programme des décisions, mais en fin de compte de l'efficacité peut être obtenue.

24voto

11voto

Benjol Points 16334

Voici quelques liens sur (ou lié à) cette rubrique:

Ce que je semble me rappeler d'un autre post sur Robert Pickering blog (ou était-ce Scott, Hanselman?) qu'à la fin, parce que les deux sont assis sur le même cadre, vous pouvez obtenir la même performance à la fois, mais parfois vous avez à "twist", l'expression naturelle de la langue pour le faire. Dans l'exemple, je me souviens, il avait à se tordre F# pour obtenir des performances comparables avec C#...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X