web-dev-qa-db-fra.com

Haskell, Scala, Clojure, que choisir pour la correspondance de motifs haute performance et la concurrence

J'ai commencé à travailler sur FP récemment après avoir lu de nombreux blogs et articles sur les avantages de FP pour l'exécution simultanée et les performances. Mon besoin de FP a été largement influencé par l'application que je développe, mon application est un injecteur de données basé sur l'état dans un autre sous-système où le timing est très crucial (près de 2 millions de transactions par seconde). J'ai quelques ces sous-systèmes qui doivent être testés. J'envisage sérieusement d'utiliser FP pour son parallélisme et je veux adopter la bonne approche, de nombreux articles sur SO parlent des inconvénients et avantages de Scala, Haskell et Clojure par rapport aux constructions de langage, aux bibliothèques et à la prise en charge de la JVM. Du point de vue de la langue, je suis d'accord pour apprendre n'importe quelle langue tant que cela m'aidera à atteindre le résultat.

Certains articles favorisent Haskell pour la correspondance des modèles et la simplicité du langage, la JVM basée FP lang ont un gros avantage par rapport à l'utilisation des bibliothèques Java Java. JaneStreet est un grand Supporteur OCAML mais je ne suis vraiment pas sûr du support développeur et des forums d'aide pour OCAML.

Si quelqu'un a travaillé sur la gestion de données aussi volumineuses, veuillez partager votre expérience.

41
2ndlife

Voulez-vous rapide ou voulez-vous facile ?

Si vous voulez rapide, vous devez utiliser C++, même si vous utilisez FP principes pour aider à l'exactitude. Étant donné que le timing est crucial, le support de soft (et hard, si besoin est) réel La programmation en temps réel sera importante. Vous pouvez décider exactement quand et comment vous avez le temps de récupérer de la mémoire, et ne consacrer que le temps dont vous disposez à cette tâche.

Les trois langages que vous avez indiqués sont tous ~ 2-3x plus lents que le C++ réglé à la main de manière presque optimale , puis uniquement lorsqu'ils sont utilisés d'une manière impérative plutôt traditionnelle. Ils utilisent tous la collecte des ordures, ce qui entraînera des retards aléatoires incontrôlés dans vos transactions.

Maintenant, cela dit, c'est beaucoup de travail pour que cela fonctionne de manière pare-balles avec C++. L'application des principes FP nécessite beaucoup plus de passe-partout (même en C++ 11), et la plupart des bibliothèques sont modifiables par défaut. (Edit: Rust devient un bon alternative, mais il est hors de la portée de cette réponse de décrire Rust suffisamment en détail.)

Peut-être que vous n'avez pas le temps et que vous pouvez vous permettre de revenir sur d'autres spécifications. Si ce n'est pas le timing mais le débit qui est crucial, par exemple, alors vous probablement voulez Scala sur Clojure (voir le Computer Languages ​​Benchmark Game , où Scala gagne tous les tests de référence au moment de l'écriture et a une taille de code inférieure dans presque tous les cas (Edit: CLBG n'est pas utile à cet égard plus, bien que vous puissiez trouver des archives soutenant ces déclarations sur les archives Web)); OCaml et Haskell devraient être choisis pour d'autres raisons (scores de référence similaires, mais ils ont une syntaxe et une interopérabilité différentes, etc.).

En ce qui concerne le système qui a le meilleur support de concurrence, Haskell, Clojure et Scala sont tous très bien alors qu'OCaml est un peu manquant.

Cela se réduit à peu près à Haskell et Scala. Avez-vous besoin d'utiliser Java? Scala. Avez-vous besoin d'utiliser des bibliothèques C? Probablement Haskell. N'avez-vous pas besoin des deux? Ensuite, vous pouvez choisir l'une ou l'autre sur la base de celle que vous préférez stylistiquement sans avoir trop à vous soucier d'avoir rendu votre vie beaucoup plus difficile en choisissant la mauvaise.

51
Rex Kerr

Je l'ai fait avec Clojure, qui s'est avéré assez efficace pour les raisons suivantes:

  • Être sur la JVM est un énorme avantage en termes de bibliothèques. Cela a effectivement exclu Haskell et Ocaml pour mes besoins, car nous avions besoin d'un accès facile à Java et intégration avec des outils basés sur JVM (construction Maven, etc.)
  • Vous pouvez passer en pur Java si vous avez besoin d'optimiser étroitement les boucles internes. Nous l'avons fait pour certains codes personnalisés traitant de grands tableaux doubles [], mais 99% du temps Clojure peut vous obtenir les performances voir http://www.infoq.com/presentations/Why-Prismatic-Goes-Faster-With-Clojure pour quelques exemples sur la façon de rendre Clojure très rapide (vidéo assez technique, suppose une certaine connaissance préalable!). Une fois que vous commencez à compter la facilité d'exploitation de plusieurs cœurs, Clojure est très compétitif en termes de performances.
  • Clojure a un support de concurrence multicœur très agréable. Cela s'est avéré extrêmement utile pour gérer des tâches simultanées. Voir http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • Le REPL fait un très bon environnement pour les tests et les travaux exploratoires sur les données.
  • Clojure est paresseux ce qui le rend approprié pour gérer des ensembles de données plus grands que la mémoire (en supposant que vous faites attention de ne pas essayer de forcer l'ensemble de données en mémoire immediatement). Il y a aussi quelques bibliothèques Nice disponibles dans un tel environnement, les plus notables sont Storm et Aleph . Storm peut être particulièrement intéressant pour vous, car il est conçu pour le traitement distribué en temps réel d'un grand nombre d'événements.

Je ne peux pas parler avec autant d'expérience des autres langues, mais mon impression d'une expérience pratique de Haskell et Scala est:

  • Haskell est idéal si vous vous souciez de la pureté et de la programmation fonctionnelle stricte avec des types statiques. Le typage statique peut être une forte garantie d'exactitude et pourrait donc le rendre approprié pour un travail hautement algorithmique. Personnellement, je trouve le FP a petit trop rigide - il y a de nombreuses fois où un état mutable est utile et je pense que Clojure a un équilibre légèrement meilleur ici (en permettant une muabilité contrôlée grâce à des références gérées).
  • Scala est un excellent langage et partage avec Clojure les avantages d'être sur la JVM. Pour moi Scala ressemble plus à un "meilleur Java" avec des fonctionnalités fonctionnelles et un système de type très impressionnant. C'est moins un changement de paradigme de Clojure. L'inconvénient est que le système de type peut devenir assez complexe/déroutant.

Dans l'ensemble, je pense que vous pourriez être satisfait de tout cela. Cela dépendra probablement de la façon dont vous vous souciez de la JVM et de votre vision des systèmes de type.

26
mikera