web-dev-qa-db-fra.com

Quoi de plus performant? Haskell ou OCaml

J'ai passé les 18 derniers mois à maîtriser la programmation fonctionnelle, en commençant par apprendre OCaml et depuis quelques semaines maintenant Haskell. Maintenant, je veux passer à l'étape suivante et implémenter une application réelle: un simple éditeur de terrain en temps réel. J'ai écrit de nombreux moteurs de rendu de terrain en temps réel, c'est donc un sujet familier. Et les algorithmes et structures de données récursifs utilisés semblent très adaptés à une implémentation fonctionnelle.

Cette application étant en temps réel, je recherche naturellement les meilleures performances possibles. Maintenant, certains partisans (à mon humble avis assez ennuyeux) d'OCaml chiennes assez fréquemment contre Haskell étant lent par rapport à OCaml ou F #. Mais selon le The Computer Language Benchmarks Game Haskell bat souvent OCaml, ne serait-ce que par des fractions plutôt petites - il reste le problème, que ce benchmark ne prenne que des échantillons très spécifiques.

La bonne chose à faire serait bien sûr d'implémenter le programme dans les deux langues et de comparer ensuite, mais je ne veux tout simplement pas faire un double travail.

Mais peut-être que d'autres personnes ont fait des applications comparables dans OCaml et Haskell et ont donné quelques chiffres?

55
datenwolf

Selon tous les comptes, OCaml et Haskell ont des compilateurs et des temps d'exécution suffisamment performants pour presque tout. Choisir entre eux sur la base de performances pures me semble idiot. Vous avez fait tout ce chemin - en vous éloignant des langages évidemment les plus bas niveau et les plus performants (C, C++, etc.) au nom d'un code plus clair, plus succinct, plus expressif et de plus haut niveau. Alors pourquoi, alors que les différences de performances impliquées sont beaucoup plus faibles, passer à ce critère maintenant?

J'irais avec des critères plus larges - si vous voulez un parallélisme omniprésent, alors Haskell est le meilleur choix. Si vous voulez une mutation véritablement omniprésente, alors OCaml est mieux.

Si vous ne voulez au mieux qu'un parallélisme très grossier et que vous avez l'intention de vous en tenir à des structures principalement fonctionnelles, choisissez en fonction d'autre chose, comme la syntaxe (je pense que Haskell est beaucoup plus agréable ici, mais c'est subjectif) ou les bibliothèques disponibles (Haskell gagne en quantité)/disponibilité, mais OCaml pourrait néanmoins le contourner dans le département graphique).

Je ne pense pas que tu vas te tromper de toute façon

60
sclv

Avec l'aide de deux collègues très intelligents, j'ai écrit une bibliothèque d'optimisation de flux de données dans Objective Caml et Haskell. La version Haskell est un peu plus polymorphe, a plus de vérification de type à la compilation et a donc moins de vérification à l'exécution. La version OCaml utilise un état mutable pour accumuler des faits de flux de données, qui pourraient être plus rapides ou plus lents cette semaine, selon la phase de la lune. Le fait clé est que dans leurs applications prévues, les deux bibliothèques sont si rapides qu'elles ne valent pas la peine d'être trompées avec . Autrement dit, dans les compilateurs respectifs ( Quick C - et GHC ), si peu de temps est consacré à l'optimisation du flux de données que le le code ne vaut pas la peine d'être amélioré.

L'analyse comparative est un enfer.

38
Norman Ramsey

J'ai écrit de nombreux moteurs de rendu de terrain en temps réel, c'est donc un sujet familier.

Assez familier pour savoir où la plupart du temps sera passé?

Si c'est le cas, vous pouvez peut-être écrire du code pour cette partie dans différentes langues et comparer.

Mais selon The Computer Language Benchmarks Game, Haskell bat souvent OCaml, ne serait-ce que par des fractions plutôt petites - il reste le problème, que ce benchmark ne prend que des échantillons très spécifiques.

Le jeu de benchmarks rapporte 4 ensembles de résultats - un core et quad core , Ubuntu 32 ou 64 bits - et vous pouvez constater que les programmes de benchmark OCaml ou Haskell fonctionnent mieux ou moins bien selon la plate-forme.

Tout ce qu'un benchmark peut faire est de prendre des échantillons très spécifiques, et bien sûr, vous devez ignorer les comparaisons sur des tâches qui ne sont pas celles où la plupart du temps sera passé dans votre application - arithmétique à grands nombres entiers? regex? cordes? - et regardez les comparaisons qui ressemblent le plus à ce que vous avez l'intention de faire.

24
igouy

Question interessante. Ce rendu de terrain sur toute la planète était l'un des derniers programmes que j'ai écrits en C++ avant de migrer vers OCaml. Avec le recul, ce programme aurait été beaucoup plus facile à écrire en OCaml qu'en C++. Haskell devrait faciliter la comparaison, mais les programmes sont généralement beaucoup plus difficiles à optimiser dans Haskell. En théorie, Haskell prend mieux en charge les multicœurs mais, dans la pratique, même les experts obtiennent rarement des résultats décents en utilisant Haskell pour la programmation parallèle.

De plus, pour les applications en temps réel, vous souhaiterez également des temps de pause bas du ramasse-miettes. OCaml a un collecteur incrémental de Nice qui se traduit par quelques pauses au-dessus de 30 ms mais, IIRC, GHC a un collecteur stop-the-world qui encourt des pauses arbitrairement longues.

Je suppose que vous utilisez Linux ou F # serait un bien meilleur choix que OCaml ou Haskell.

EDIT: Si vous souhaitez étudier la fusillade, assurez-vous de lire le code source. Vous pouvez également trouver les pages wiki Haskell à ce sujet intéressantes.

19
Jon Harrop

Sur la base de toutes les données que j'ai vues, elles sont à peu près comparables. Le code que vous écrivez fera une plus grande différence que la langue elle-même.

19
Chuck