41 votes

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

J'ai commencé à travailler sur FP récemment après avoir lu beaucoup de blogs et articles sur les avantages de la PF pour une exécution simultanée et de la performance. Mon besoin de PF a été largement influencée par l'application que je développe, Ma demande est un état basé sur les données de l'injecteur dans un autre sous-système où le calendrier est très important (près de 2 millions de transactions par seconde). J'ai un couple de ces sous-systèmes, qui doit être testé. Je songe sérieusement à l'aide de FP pour son parallélisme et que vous voulez prendre la bonne approche, de nombreux messages sur AFIN de parler des avantages et des inconvénients de la Scala, Haskell et Clojure wrt les constructions de langage, des bibliothèques et de la prise en charge JVM. À partir d'une langue de point de vue, je suis ok pour apprendre n'importe quelle langue, tant que ça me permettra d'atteindre le résultat.

Certains postes faveur Haskell pour le filtrage et la simplicité de la langue, de la JVM en fonction FP lang ont un gros avantage par rapport à l'utilisation de bibliothèques java existantes. JaneStreet est un grand OCAML partisan, mais je suis vraiment pas sûr de support de développeur et de forums d'aide pour OCAML.

Si quelqu'un a travaillé avec le traitement de telles données de grande taille, s'il vous plaît partager votre expérience.

51voto

Rex Kerr Points 94401

Voulez-vous rapide ou voulez-vous facile?

Si vous voulez rapidement, vous devriez utiliser le C++, même si vous êtes à l'utilisation de la PF principes d'aide à la décision correcte. Depuis le moment est crucial, le support souple (et dur, si nécessaire), à la programmation temps-réel sera important. Vous pouvez décider exactement comment et quand vous avez le temps de récupérer de la mémoire, et de passer autant de temps que vous avez sur cette tâche.

Les trois langues, vous avez affirmé que tous sont ~2-3x plus lent que la quasi-optimale de la main-écoute C++ tend à être, et alors seulement lorsqu'il est utilisé de façon plutôt traditionnelle impératif façon. Ils utilisent tous la collecte des ordures, qui introduira incontrôlée aléatoire des retards dans vos transactions.

Maintenant, cela dit, il est un beaucoup de travail pour obtenir ce fonctionnement à l'épreuve des balles de la mode avec le C++. L'application FP principes nécessite beaucoup plus passe-partout (même en C++11), et la plupart des bibliothèques sont mutables par défaut.

Peut-être que vous n'avez pas le temps et ne peut se permettre à l'échelle de retour sur d'autres spécifications. Si ce n'est pas le timing , mais le débit , ce qui est déterminant, par exemple, alors vous avez probablement envie de Scala sur Clojure (voir l' Ordinateur de Langues de Référence de Jeu, où Scala gagne chaque référence de cette écriture et de la faible taille de code dans presque tous les cas); OCaml et Haskell doit être choisi pour d'autres raisons (similaire scores de référence, mais ils ont une syntaxe différente et l'interopérabilité, et ainsi de suite).

Dans la mesure où un système est le meilleur de la simultanéité de soutien, Haskell, Scala, Clojure et sont tout beaux tout en OCaml est un peu défaut.

Ce joli beaucoup se rétrécit vers le bas à Haskell et Scala. Avez-vous besoin d'utiliser des bibliothèques Java? Scala. Avez-vous besoin d'utiliser des librairies en C? Probablement Haskell. Avez-vous besoin non plus? Ensuite, vous pouvez choisir soit sur la base de celle que vous préférez sur le plan stylistique, sans avoir à se soucier trop de choses que vous avez fait de votre vie considérablement plus difficile en choisissant le mauvais.

27voto

mikera Points 63056

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. Ceci a effectivement exclu Haskell et Ocaml pour mes fins, comme nous avions besoin d'un accès facile à l'écosystème Java et de l'intégration avec des outils basés sur la JVM (Maven build etc.)
  • Vous pouvez vous déplacer dans la pure Java si vous avez besoin de bien optimiser les boucles internes. Nous l'avons fait pour certains de code personnalisé de traitement de gros double[] tableaux, mais 99% du temps Clojure pouvez-vous obtenir les performances dont vous avez besoin. Voir http://www.infoq.com/presentations/Why-Prismatic-Goes-Faster-With-Clojure pour quelques exemples de la façon de faire Clojure aller très vite (assez technique vidéo, suppose une certaine connaissance préalable!). Une fois que vous commencez à compter de la facilité de l'exploitation de plusieurs cœurs, Clojure est très compétitive sur les performances.
  • Clojure est très agréable de multi-cœur, de la simultanéité de soutien. Cela s'est avéré extrêmement utile pour la gestion de 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 le travail exploratoire sur les données.
  • Clojure est paresseux qui le rend approprié pour traiter de plus grandes que la mémoire des ensembles de données (en supposant que vous êtes prudent de ne pas tenter de forcer l'ensemble du jeu de données en mémoire à la fois). Il y a aussi quelques belles bibliothèques disponibles dans un tel environnement, les plus remarquables sont la Tempête et Aleph. La tempête peut être particulièrement intéressant pour vous, car il est conçu pour la distribution de traitement en temps réel d'un grand nombre d'événements.

Je ne peux pas parler avec tout autant de l'expérience des autres langues, mais j'ai l'impression à partir de l'expérience pratique de Haskell et Scala est:

  • Haskell est excellent si vous vous souciez de la pureté et de la stricte programmation fonctionnelle avec des types statiques. Le typage statique peut être une forte garantie de l'exactitude, de sorte que cela soit approprié pour très algorithmique de travail. Personnellement, je trouve pure FP un peu trop rigides, il y a beaucoup de moments où mutable état est utile et je pense que Clojure est un peu meilleur équilibre ici (en permettant aux contrôlés muability thorugh géré références).
  • Scala est un langage parfait et actions avec Clojure les avantages d'être sur la JVM. Pour moi, la Scala est plus comme un "meilleur Java" avec les caractéristiques fonctionnelles et très impressionnant système de type. C'est moins un changement de paradigme de Clojure. Inconvénient, c'est que le type de système peut être assez complexe / confus.

Dans l'ensemble, je pense que vous pourriez être heureux avec n'importe quel de ces. Il viendra sans doute de la façon dont beaucoup vous vous souciez de la JVM et votre point de vue sur les systèmes de type.

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