2010-03-19 6 views
16

La question dit tout.Quelle est la performance de Scala par rapport à Java?

La raison derrière cette question est que je suis sur le point de commencer un petit projet de côté et que je veux le faire en Scala. J'apprends le scala depuis un mois et maintenant je suis à l'aise pour travailler avec. Le compilateur scala lui-même est assez lent (sauf si vous utilisez fsc). Alors, comment cela fonctionne-t-il sur JVM? Je travaillais auparavant sur groovy et j'avais vu parfois plus de performé que java. Ma question est de savoir comment scala fonctionne sur JVM par rapport à Java. Je sais que scala a quelques très bonnes caractéristiques (FP, lang dynamique, statiquement typé ...) mais la fin de la journée nous avons besoin de la performance ...

+2

Il faut seulement s'attendre à ce que ce ne soit pas aussi rapide que ce à quoi vous vous êtes habitué dans des langues plus simples. –

Répondre

25

Une grande partie de mon travail utilise Scala comme un langage de haute performance. Si on fait vraiment attention aux performances, Scala est presque toujours aussi bon que Java (sinon équivalent). Si l'on néglige par exemple créations d'objets, cela peut être bien pire - comme cela peut être le cas en Java si vous utilisez une bibliothèque qui néglige les créations d'objets. (En fait, mon code Scala est souvent plus rapide que mon code Java parce que je trouve tellement plus facile de rendre mon code hautement optimisé pratique à utiliser et réutiliser - mais le Java serait aussi rapide ou plus rapide si seulement j'avais plus de temps et patience.)

Si vous voulez des données qui démontrent que Scala peut être aussi rapide que Java, consultez les résultats sur le Computer Languages Benchmark Game. (Une autre comparaison moins utile mais néanmoins intéressante pour la programmation multicœur à haut débit est Wide Finder 2 de Tim Bray, ce qui est moins utile car l'algorithme n'est pas défini à l'avance, donc une grande partie des différences se résument à des différences d'algorithme.)

+2

La création d'objets dans une Java JVM 1.5> moderne est pratiquement gratuite, c'est juste FUD. Scala est plus lent que le Java natif à cause de toute l'indirection pour toutes les fonctionnalités du langage spécifique à Scala, tout comme Groovy. Vous devriez vous attendre à une pénalité de vitesse de 5X par rapport à Java sur la même JVM. –

+11

@Fuzzy: Vous avez tout simplement tort. Allez voir les repères auxquels je me suis connecté. Est-ce qu'ils soutiennent votre position? Vous voulez en poster d'autres qui le font? Avez-vous fait un microbenchmarking pour dire à quelle vitesse la création d'objets est comparée à une couche d'indirection - et comment le JIT peut-il supprimer l'indirection quand ce n'est pas vraiment nécessaire? (Indice: j'ai, et c'est pourquoi j'ai posté ce que j'ai fait.) –

+10

@fuzzy J'appuie Rex ici. La création d'objets est bon marché, mais si vous ne faites qu'une poignée d'opérations mathématiques dans la boucle interne, alors, par comparaison, la création d'objets est très coûteuse. –

13

Scala est compilé en octets et est typé statiquement de sorte que les mêmes optimisations que pour les langages statiquement typés comme Java (par opposition aux langages dynamiquement typés comme Groovy) peuvent être effectuées. Donc, comparer Groovy à Scala compare les pommes aux oranges.

Maintenant, Java à la comparaison Scala:

Vous pouvez vous attendre Scala d'être à égalité avec Java dans la plupart des situations. Scala peut être lent si vous programmez de façon stupide, par exemple, des tons de mix-ins via Traits pourraient fournir une surcharge que Java n'aurait pas.

Mais ...

Si les caractères résolvent effectivement un problème complexe de bon goût, puis une solution en Java ordinaire aurait pour lutter contre cette même complexité. Qui peut dire que la solution que vous écrivez en Java en utilisant vos propres patterns va être plus efficace que ce que vous obtenez gratuitement dans Scala (souvenez-vous, le compilateur Scala a été écrit par des gens qui sont probablement un meilleur programmeur que vous). D'un autre côté, si vous utilisez des fonctions de langage sans raison valable (par exemple, des objets entiers lorsque les primitives intenses seront utilisées), votre code sera gonflé, lent, peu importe la langue que vous utilisez.

En outre, considérons la classe spéciale d'applications basées sur la demande-réponse qui interagissent avec une base de données ou une autre ressource intensive d'E/S. Le goulot d'étranglement ne sera pas le «nouvel» opérateur ou l'invocation de la méthode virtuelle - ce sera presque certainement l'E/S. En résumé, les performances entre Scala et Java sont à peu près les mêmes, et ne devraient pas être la principale raison pour laquelle vous choisissez l'une par rapport à l'autre dans 99% des cas. Étant donné que le travail humain qualifié coûte plus cher que le matériel informatique, il vaut mieux choisir la langue que vous pouvez (ou pouvez apprendre à) programmer le plus efficacement (y compris vos coéquipiers). Si Scala vous permet d'écrire un dixième du code en tant que Java, vous pourriez en tirer 10 fois le bénéfice en l'utilisant.Si Scala vous ralentit 10 fois (parce que c'est trop difficile à lire), restez avec Java!

+5

Tout cela est vrai en théorie. En pratique, si vous mesurez des choses au lieu de simplement attendre des choses, le code Scala a tendance à être significativement plus lent que le code Java, tout comme en pratique le code Java a tendance à être plus lent que le code C++. L'argument "ne pas s'inquiéter de la vitesse, lancer du matériel au code lent" est moins vrai tous les jours. Côté client, les netbooks et les téléphones portables ne sont PAS rapides. Côté serveur, il y a une pression pour réduire la consommation d'énergie. Nous n'allons pas revenir à l'ASM à la main, mais cela vaut la peine de réfléchir à ce que Scala vous achète. – Porculus

+1

En fait, je ne peux pas encore rencontrer d'accélération mesurable en transférant n'importe quel programme de Scala à Java seul. –

+6

@Porculus: Avez-vous des données réelles pour soutenir votre opinion? Bien que je puisse être d'accord avec votre comparaison entre Java/C++, je ne vois pas comment cela s'applique à Scala vs. Java. C'est la même chose que de soutenir que GCC crée des binaires qui ont tendance à être significativement plus lent, parce que vous avez utilisé l'analyseur A au lieu de l'analyseur B pour C++. – soc

5

Je suis d'accord avec les commentaires de Rex dans cet article, et j'ai une expérience personnelle à l'appui. J'ai converti une applet de traitement de java en scala, sans modifier les détails d'implémentation, et les deux applets ont rendu un cadre en ~ 6ms, avec peu de variation. Gardez à l'esprit que le compilateur Scala a beaucoup plus de travail à faire que le compilateur Java.

Questions connexes