Ce qui est vraiment plus performant? Haskell ou OCaml
J'ai passé les 18 derniers mois, à rendre la poignée de la programmation fonctionnelle, en commençant par l'apprentissage et OCaml depuis quelques semaines maintenant Haskell. Maintenant, je veux passer à l'étape suivante et de mettre en œuvre une réelle demande: Un simple temps réel à l'éditeur de terrain. J'ai écrit de nombreux temps réel le terrain des moteurs de rendu, donc c'est un sujet courant. Et le récursive algorithmes et structures de données semblent très en forme pour une fonctionnelle de la mise en œuvre.
Avec ce cours en temps réel de l'application bien sûr, je suis à la recherche pour les meilleures performances que je peux obtenir. Maintenant, certains (à mon humble avis assez ennuyeux) promoteur de OCaml, très souvent, les chiennes contre Haskell être lent par rapport à OCaml ou F#. Mais selon le La Langue De L'Ordinateur De Repères De Jeu Haskell souvent beats OCaml, si seulement plutôt par petites fractions — il reste encore le problème, que ce test ne prend que très spécifique des échantillons.
La bonne chose à faire serait bien sûr de mettre en œuvre 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 ne comparables applications en OCaml et Haskell et de donner quelques chiffres?
- J'oserais dire que le SÈCHE principe s'applique à de plus petits "niveaux de granularité" de l'ensemble de l'application; il aurait plus de sens à la méthode ou le niveau de la classe. Je suis d'accord avec l'OP, que vous ne pouvez comparer directement les deux langues et les plates-formes lorsque les deux sont essentiellement de faire exactement la même chose-mais bien sûr, cela est plutôt une façon extrême de trouver et pas très pratique dans la plupart des cas.
- L'écriture de deux programmes équivalents de comparer leurs caractéristiques de performance n'a rien à voir avec le principe de la SEC. SEC, c'est avoir un canoniques source d'une information, pas beaucoup de sources indépendantes. Dans ce cas, ni le programme en lui-même contient les informations nécessaires, de sorte à SEC n'entrerait en jeu si vous l'avais déjà écrit la comparaison et ont examiné l'écrire de nouveau pour une mystérieuse raison. Deux est le nombre minimal de programmes nécessaires pour une comparaison, donc je ne vois pas ce que cela peut être brut "inefficace" en comparaison.
- ok vous sont effectivement à droite (supprimé mon premier commentaire, pour éviter les confusions), Peut-être que ça les fais appliquer, je serais parti avec ne repet vous-même et non avec le dont repet vous-même principe 🙂 je ne sais pas, mais si c'est un très petit morceau de logiciel, il n'a pas de sens pour moi de construire deux fois, je voulais juste le signaler.
- Qu'entendez-vous par "en temps réel"? En fonction de votre réponse, Haskell peut ne pas être bien adapté pour votre tâche. (Et peut-être pas OCaml soit.)
- "en temps réel", comme dans: Tesselated élévation de la grille avec un nombre illimité (enfin, uniquement limité par la mémoire), les niveaux de détail, de manière interactive modifiable avec réponse immédiate, c'est à dire du taux d'actualisation devrait être >30Hz. BTDT à l'aide de C. Penser le long des lignes de ce que les simulateurs de vol à faire pour rendre le terrain.
- La langue des repères de jeu a fait l'objet d'une certaine controverse sur la OCaml liste de diffusion récemment certaines règles semblent affecter OCaml plus que d'autres. Par exemple OCaml arbre binaire code s'exécute dans 47. En OCaml arbre de code trouvé dans la "alternative intéressante" article court dans 12.67 s qui le mettrait à la deuxième place derrière C. Le code alt airs le garbage collector, qui je pense va à l'encontre des règles de l'arbre binaire code. Je ne peux pas vraiment commenter si Haskell est plus rapide que OCaml ou pas, mais une partie du code utilisé pour les tests sont sous-optimales.
- Bizarre que j'ai (et je suis sûr que pas mal d'autres personnes) de savoir de qui vous parlez. De toute façon, inb4 certains radotage sur hashmaps et la fonction floor en Haskell, et une déclaration que l'ensemble de la langue est inutile à cause de cela.
- Yoshiuchi, l'arbre binaire de référence affecte Haskell assez mal depuis trop paresseux arbre n'est pas autorisé.
- Yoshiuchi >> Par exemple OCaml arbre binaire code s'exécute dans 47. En OCaml arbre de code trouvé dans la "alternative intéressante" article court dans 12.67 s << Vous semblez ignorer l'OCaml arbre binaire de code qui s'exécute dans 15 ans? shootout.alioth.debian.org/u32q/...
- Je n'ai pas l'ignorer, je n'en étais pas consciente. Je ne suis pas en train de redémarrer la controverse sur la liste de diffusion, je suis contente de souligner qu'il existe des règles pour les points de référence auxquels ne s'applique pas nécessairement à un éditeur de terrain.
- Yoshiuchi - Désolé, mais ce que vous avez écrit n'est pas de savoir si les critères de référence des règles du jeu s'appliquent à un éditeur de terrain. Ce que vous avez écrit était sur OCaml et les repères de jeu.
- Si vous voulez étudier la fusillade alors assurez-vous de lire le code source. Vous pouvez également trouver le Haskell pages wiki à ce sujet intéressant: haskell.org/haskellwiki/Great_language_shootout
- Le principal point d'intérêt est sûrement qu'OCaml augmentation de la GC engage des pauses de 10 ms en moyenne, jusqu'à 30ms max (pour bien comportés code) alors que GHC du cessez-le-monde GC engage arbitrairement longues pauses. Étonnamment, personne d'autre ne l'a mentionné, sauf moi, et j'ai eu 3 downvotes pour mes ennuis...
Vous devez vous connecter pour publier un commentaire.
Par tous les comptes, à la fois OCaml et Haskell ont suffisamment performant compilateurs et environnements d'exécution pour presque rien. La cueillette entre eux sur la base de performances pures semble ridicule à moi. Vous êtes venu ici, éloigner de la évidemment le plus bas niveau performant et langages (C, C++, etc.) au nom de la plus claire, plus concise, plus expressif, code de niveau supérieur. Pourquoi, alors que les différences de performances impliqués sont beaucoup plus petites, passer à des critères maintenant?
J'irais avec certains des critères plus larges -- si vous voulez envahissants du parallélisme, puis Haskell est le meilleur choix. Si vous voulez vraiment omniprésente mutation, OCaml, c'est mieux.
Si vous souhaitez que seules les très grosses parallélisme au mieux, et vous avez l'intention de rester avec la plupart des structures fonctionnelles, puis choisissez l'une basée sur autre chose, comme la syntaxe (je pense que Haskell est beaucoup plus agréable ici, mais c'est subjectif) ou de bibliothèques (Haskell l'emporte sur la quantité, la disponibilité, mais OCaml peut-bord dans le département de graphisme néanmoins).
Je ne pense pas que vous allez faire de mal de toute façon
Avec l'aide de deux très intelligent collègues, j'ai écrit un flux de données-optimisation de la bibliothèque dans les deux Objective Caml et Haskell. Le Haskell version est un peu plus polymorphes, a plus au moment de la compilation de vérification de type, et a donc moins au moment de l'exécution de la vérification. La version OCaml utilise mutable état à accumuler des flux de données, de faits, qui pourrait être plus rapide ou plus lent cette semaine, selon la phase de la lune. L'essentiel est que dans leurs applications, ces bibliothèques sont si rapides qu'ils n'en valent pas la tromper avec. C'est dans les compilateurs (C Rapide-- et GHC), si peu de temps est consacré à l'optimisation des flux de données que le code n'est pas la peine de s'améliorer.
Benchmarking, c'est l'enfer.
Assez familière pour savoir où la plupart de temps sera consacré?
Si oui, alors peut-être que vous pouvez écrire du code pour seulement une partie dans différentes langues et de les comparer.
Les repères de jeu des rapports de 4 séries de résultats - un cœur et quad core, 32 ou 64 bits d'Ubuntu et vous pouvez trouver que les OCaml ou Haskell indice de référence des programmes de réaliser le meilleur ou le pire selon la plate-forme.
Tous un point de repère pouvez faire est de prendre très spécifique des échantillons, et bien sûr, vous devriez ne pas tenir compte des comparaisons sur les tâches qui sont contrairement à, où la plupart du temps sera passé dans votre application - grand arithmétique des nombres entiers? regex? les chaînes? - et regardez les comparaisons qui sont les plus comme ce que vous comptez faire.
Fondée sur toutes les données que j'ai vu, ils sont à peu près comparables. Le code que vous écrivez va faire une plus grande différence que la langue elle-même.
Question intéressante. Cette toute la planète-terrain moteur de rendu a été l'un des derniers programmes que j'ai écrit en C++ avant j'ai migré vers OCaml. En regardant en arrière, ce programme aurait été nettement plus facile d'écrire en OCaml que C++. Haskell devrait le rendre comparable facile, mais les programmes sont généralement beaucoup plus difficile à optimiser en Haskell. En théorie, Haskell a un meilleur support pour multicores mais, dans la pratique, même les experts rarement obtenir de bons résultats en utilisant Haskell pour la programmation parallèle.
Également, pour des applications en temps réel vous voulez aussi le faible temps de pause du garbage collector. OCaml a une belle différentiels collector que les résultats dans quelques pauses au-dessus de 30ms, mais, autant que je me souvienne, GHC a un cessez-le-monde collecteur qui engage arbitrairement longues pauses.
Je suppose que vous êtes sous Linux ou F# serait un bien meilleur choix que OCaml ou Haskell.
EDIT: Si vous voulez étudier la fusillade alors assurez-vous de lire le code source. Vous pouvez également trouver les Haskell pages wiki à ce sujet intéressant.