40 votes

Performances de Haskell et de JVM

Je veux écrire un système backend pour un site web (ce sera un service de recherche personnalisé). Il doit être hautement concurrent et rapide. Étant donné mon désir de concurrence, je prévoyais d'utiliser un langage fonctionnel tel que Haskell ou Scala.

Toutefois, la vitesse est également une priorité. http://benchmarksgame.alioth.debian.org Les résultats semblent montrer que Java est presque aussi rapide que C/C++, que Scala est généralement assez bon, mais que Haskell est de plus en plus lent, voire beaucoup plus lent pour la plupart des tâches.

Quelqu'un a-t-il une idée des performances ou de l'expérience de l'utilisation de Haskell, Scala ou Java pour l'exécution de tâches hautement concurrentes ?

Certains sites que j'ai consultés suggèrent que Scala présente des fuites de mémoire, ce qui pourrait être terrible pour les services à long terme tels que celui-ci.

Dans quel langage dois-je écrire mon service, ou que dois-je prendre en compte avant de choisir (les performances et la concurrence étant les plus grandes priorités) ?

Gracias

21voto

Dan Burton Points 26639

Cette question porte superficiellement sur les performances du code compilé avec GHC par rapport au code exécuté sur la JVM. Mais il y a beaucoup d'autres facteurs qui entrent en jeu.

Personnes

  • Une équipe travaille-t-elle sur ce projet, ou seulement vous ?
    • Dans quelle mesure cette équipe est-elle familière/à l'aise avec ces langues ?
    • Est-ce une langue dans laquelle vous voulez (tous) investir du temps pour l'apprendre ?
  • Qui en assurera la maintenance ?

Comportement

  • Combien de temps ce projet est-il censé durer ?
  • Quand, le cas échéant, les temps d'arrêt sont-ils acceptables ?
  • Quel type de traitement ce programme effectuera-t-il ?
    • Existe-t-il des bibliothèques connues qui peuvent vous aider dans ce domaine ?
    • Êtes-vous prêt à créer votre propre bibliothèque ? Quelle difficulté cela représenterait-il dans cette langue ?

Communauté

  • Dans quelle mesure comptez-vous vous inspirer de l'open source ?
  • Dans quelle mesure envisagez-vous de contribuer à l'open source ?
  • La communauté est-elle vivante et utile ?
    • sur StackOverflow
    • sur irc
    • sur Reddit
    • travailler sur des composants open source que vous pourriez utiliser

Outils

  • Avez-vous besoin d'un IDE ?
  • Avez-vous besoin du profilage du code ?
  • Quel type de test voulez-vous faire ?
  • La documentation du langage est-elle utile ? Et pour les bibliothèques que vous utiliserez ?
  • Existe-t-il des outils pour combler des besoins dont vous ne soupçonniez pas encore l'existence ?

Il y a un million et un autres facteurs que vous devez prendre en compte. Que vous choisissiez Scala, Java ou Haskell, je peux presque vous garantir que vous serez en mesure de répondre à vos exigences de performance (c'est-à-dire qu'il faut probablement à peu près la même quantité d'intelligence pour répondre à vos exigences de performance dans n'importe lequel de ces langages). La communauté Haskell est notoirement utile, et mon expérience limitée avec la communauté Scala a été à peu près la même qu'avec Haskell. Personnellement, je commence à trouver Java assez répugnant par rapport aux langages qui ont au moins des fonctions de première classe. De plus, il y a beaucoup plus de programmeurs Java, ce qui entraîne une prolifération d'informations sur Internet à propos de Java, pour le meilleur (plus de chances que ce que vous devez savoir soit disponible) ou pour le pire (beaucoup de bruit à passer au crible).

tl;dr Je suis presque sûr que les performances sont à peu près les mêmes. Considérez d'autres critères.

10voto

Rex Kerr Points 94401

Vous devriez choisir le langage que vous connaissez le mieux et qui dispose de la meilleure bibliothèque pour ce que vous essayez d'accomplir (notez que Scala peut utiliser les bibliothèques Java). Haskell est très probablement adapté à vos besoins, si vous apprenez suffisamment pour l'utiliser efficacement, et il en va de même pour Scala. Si vous ne connaissez pas assez bien le langage, il peut être difficile d'écrire du code performant.

J'ai observé que l'on peut écrire modérément plus vite et un code parallèle plus compact et performant en Scala qu'en Haskell. Cependant, vous ne pouvez pas vous contenter d'utiliser ce qui vous vient à l'esprit dans l'un ou l'autre de ces langages et vous attendre à ce que votre code soit extrêmement rapide.

Scala n'a plus de fuites de mémoire liées aux acteurs sauf si vous utilisez les acteurs par défaut dans un cas où soit vous êtes limité par le CPU et que les messages sont créés plus vite qu'ils ne sont consommés, soit vous oubliez de traiter tous vos messages. Il s'agit d'un choix de conception plutôt que d'un bogue, mais cela peut être le mauvais choix de conception pour certains types d'applications tolérantes aux pannes. Akka surmonte ces problèmes en utilisant une implémentation différente des acteurs.

6voto

sclv Points 25335

Jetez un coup d'œil à la comparaison tête-à-tête. Pour certains problèmes, ghc et java7-server sont très proches. Pour un nombre égal de problèmes, la différence est de 2x, et pour un seul, elle est de 5x. Ce problème est le k-nucléotide pour lequel la version de GHC utilise une table de hachage mutable roulée à la main car il n'y en a pas de bonne dans les stdlibs. Je serais prêt à parier que certaines des nouvelles structures de données fournissent de meilleures tables de hachage que celle-là.

Quoi qu'il en soit, si votre problème ressemble davantage à la première série de problèmes (calcul pur), il n'y a pas une grande différence de performances. S'il ressemble davantage à la deuxième série de problèmes (faisant typiquement un usage essentiel de la mutation), même avec la mutation, vous remarquerez probablement une certaine différence de performances.

Mais encore une fois, cela dépend vraiment de ce que vous faites. Si vous effectuez une recherche sur un grand ensemble de données, vous aurez tendance à être limité par les entrées-sorties. Si vous optimisez la traversée d'une structure immuable, Haskell sera parfait. Si vous modifiez une structure complexe, alors vous pouvez (selon les cas) payer un peu plus.

De plus, les threads verts légers de GHC peuvent rendre certains types d'applications serveur extrêmement efficaces. Donc, si le service/commutation lui-même a tendance à être un goulot d'étranglement, alors GHC peut avoir l'avantage.

Il est bon de se préoccuper de la vitesse, mais la vraie différence se situe entre l'utilisation d'un langage compilé et d'un langage de script. Au-delà de cela, les différences dont nous parlons ne se produisent que dans certaines situations de calcul intensif. vraiment va avoir de l'importance.

5voto

Peter Lawrey Points 229686

Le benchmark shootout suppose que le même algorithme est utilisé dans toutes les implémentations. Cela donne le plus grand avantage au C/C++ (qui est l'implémentation de référence dans la plupart des cas) et aux langages similaires. Si vous deviez utiliser une approche différente, adaptée à un autre langage, vous seriez disqualifié.

Si vous commencez par un problème qui se décrit plus naturellement en Haskell, vous obtiendrez de meilleurs résultats dans ce langage (ou un langage très similaire).

Souvent, lorsque les gens parlent d'utiliser la concurrence, ils oublient que la raison pour laquelle ils le font est de rendre l'application plus rapide. Il existe de nombreux exemples où l'utilisation de plusieurs threads n'est pas beaucoup plus rapide ou beaucoup plus lente. Je commencerais par une implémentation efficace à un seul thread, aussi profilée/accordée que possible, puis j'examinerais ce qui pourrait être exécuté simultanément. Si ce n'est pas plus rapide avec plus d'un CPU, ne le rendez pas concurrent.

IMHO : Les performances sont votre priorité absolue (derrière la correction), la concurrence n'est une priorité que dans le cadre des devoirs.

2voto

aishwarya Points 1455

Je dirais Scala, mais comme j'ai fait des expériences avec Scala, ma préférence irait sans aucun doute à Scala. Quoi qu'il en soit, j'ai vu un certain nombre d'applications multithreadées très performantes écrites en Java, et je ne vois pas pourquoi cette nature d'application exigerait d'opter pour la FP. Je vous suggère d'écrire un tout petit module basé sur ce dont votre application a besoin en Scala et en Haskell et de mesurer les performances de votre installation. Et, puis-je aussi ajouter clojure au mélange ? :-) Je pense que vous devriez rester avec Java, à moins que vous ne cherchiez à bénéficier d'une autre fonctionnalité du langage que vous choisissez.

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