Sur la Performance et L'interopérabilité Java: Clojure vs. Scala

j'ai déjà lu divers comptes rendus de Clojure contre Scala et tandis que je me rends compte que les deux ont leur place. Il y a quelques considérations que je n'ai pas acquises une explication complète sur quand il vient à comparer les deux Clojure avec Scala:

1.) Laquelle des deux langues est généralement plus rapide ? Je sais que cela variera d'une langue à l'autre, mais une évaluation générale du rendement serait utile. Pour exemple: je sais que les dictionnaires Python sont très rapides. Mais dans l'ensemble, c'est un beaucoup langage plus lent que Java. Je ne veux pas aller avec Clojure et courir dans ce problème sur la route.

2.) Comment est l'interopérabilité avec Java? Tout ce que J'ai lu jusqu'à présent est que Scala a des types de collections natives qui le rendent un peu maladroit à intégrer avec une grande base de code Java, tandis que Clojure suit une manière itérable / itérative simple d'inter-opérer avec des cours de Java. Plus de pensées et de détails à ce sujet?

finalement, si c'est un match nul assez proche entre clojure et scala, je pourrais essayer les deux. Une chose à propos de Clojure est le langage semble très simple. Mais encore une fois, Scala a un système de type très flexible. Mais, je sais que Scala est rapide (basé sur plusieurs comptes personnels). Donc, si Clojure est significativement plus lent, j'aimerais le savoir le plus tôt possible.

80
demandé sur Jonas 2009-10-02 01:54:51

8 réponses

je pense que l'une ou l'autre langue sera assez rapide pour vous. En comparant Python et Java, il semble un peu déraisonnable de blâmer le langage pour la différence de vitesse. Java est compilé JIT (sauf sur les appareils mobiles*) alors que Python est interprété. Ce n'est pas parce que les deux utilisent un code de bytecode que les implémentations auront des performances comparables, même à distance. Mais le Scala et le Clojure sont tous deux des langues JVM, de sorte qu'ils devraient avoir des performances similaires.

Scala a quelques les avantages de la mise en oeuvre par rapport à Clojure et je m'attendrais à un rendement un peu plus élevé. Bien que le typage statique de Scala se traduise normalement par un avantage de vitesse sur le typage de canard de Clojure, Clojure fait type de support indiquant qui peut accélérer le code considérablement. Peut-être, Scala ordinaire est plus rapide que Clojure ordinaire, mais vous avez seulement besoin d'optimiser les goulots d'étranglement. Plus d'un programme du temps d'exécution est générée par une petite quantité de code.

en ce qui concerne interop w/ Java, Scala est plus proche de Java, mais je suis sûr que les deux langues fonctionnent bien. Dans Programming Clojure Stuart Halloween écrit: "[Vous pouvez accéder] tout ce que vous pouvez atteindre à partir du code Java. ".

et depuis que L'auteur de Scala Martin Odersky a écrit le compilateur Java de Sun, je pense qu'aucune balle n'a été lâchée du côté de Scala non plus. :- )

j'ai du mal à choisir deux meilleures langues, même si J'aime aussi Ruby. Pourquoi t'inquiètes-tu de savoir lequel essayer? Pourquoi ne pas essayer les deux? Scala est plus susceptible d'être "le prochain Java", alors qu'il est difficile d'imaginer que le Lisp va finalement décoller après ne pas l'avoir fait pendant plus de 50 ans. Mais il est clair que Lisp est sur son propre niveau unique d'abstraction, et Clojure est assez simple, donc Scala + Clojure ne sera pas beaucoup plus difficile que juste (le assez complexe) Scala et je suis sûr que vous serez heureux que vous avez fait il.

et d'ailleurs ils interopèrent...

* dalvik (android JVM) a obtenu un compilateur JIT en version 2.2 en 2010

71
répondu DigitalRoss 2012-09-17 16:42:00

avec L'actuelle JVM Scala a un avantage sur le fait d'être dactylographié statiquement, car le support JVM pour le Dactylographie dynamique -- réflexion -- est lent. En fait, une caractéristique Scala qui doit être mise en œuvre par les mêmes techniques, les types structurels, est souvent mise en garde contre pour cette même raison.

aussi, Scala accepte les objets mutables très bien, et certains algorithmes sont juste plus rapides à mettre en œuvre avec la mutabilité.

comme Scala et Java sont essentiellement des langages de classe, ils interopèrent plus facilement. Ou, peut-être, de manière plus harmonieuse. Une classe Java est une classe pour Scala, et une classe Scala est une classe pour Java. Des problèmes peuvent se poser quand il s'agit des singletons de Scala ou des membres statiques de Java, en particulier quand il y a un cadre impliquant s'attendre à ce que les choses fonctionnent d'une certaine manière.

donc J'irais avec Scala sur les deux ces comptes. Clojure est, à bien des égards, un meilleur langue , et il a certainement des caractéristiques très intéressantes pas présent (jusqu'à présent) sur Scala, mais vous récoltez de tels avantages en allant pleinement fonctionnelle. Si vous avez l'intention de le faire, alors Clojure est probablement mieux. Si tu ne le fais pas, tu devrais probablement rester avec Scala.

32
répondu Daniel C. Sobral 2010-10-03 19:02:10

notez que Clojure et Scala sont deux types totalement différents de langages de programmation - Clojure est un langage Lisp-like fonctionnel, il est et non orienté objet. Scala est un langage orienté objet qui possède des fonctionnalités de programmation.

À mon avis, les fonctionnalités et les concepts d'une langue (fonctionnelle, OO, ...) sont des critères beaucoup plus importants pour le choix d'une langue que la performance (d'une mise en œuvre bien que je comprenne que vous ne voulez pas être pris au piège dans un langage pour lequel il n'y a pas d'implémentation performante disponible.

J'opterais pour Scala, parce qu'il est orienté objet mais permet aussi d'apprendre la programmation fonctionnelle (si cela vous intéresse). D'un autre côté, si vous ne vous souciez pas de OO et que vous voulez apprendre la programmation fonctionnelle "pure", essayez Clojure.

21
répondu Jesper 2009-10-02 07:36:03

les statistiques produites par le " Computer Language Benchmark Game " sont à peu près les meilleures que vous trouverez probablement.

Ils sont en profondeur et vous pouvez comparer plusieurs langues. Le problème est qu'ils ne couvrent pas Clojure : (

cela dit, il est assez facile de soumettre n'importe quoi--c'est tout open source.

les statistiques disent que Scala est sacrément rapide.

15
répondu Bill K 2009-10-01 22:42:14
  1. Idiomatiques Scala est plus rapide que le idiomatiques Clojure, et le restera.
  2. Scala et Clojure s'assoient facilement sur Java. Il ne s'assoit pas bien en dessous.

si votre code est critique dans le temps ou dans l'espace, collez à Java. Mais ce n'est pas le cas, même si vous le pensez.

Le Le Langage De L'Ordinateur De Référence De Jeu jette peu de lumière sur le coût réel des ressources de Clojure. Aucune structure de données Clojure n'est utilisée. Les abstractions fonctionnelles et séquentielles n'apparaissent pas.

Clojure peut sembler simple. Il n'est pas, mais il est expressif. Il peut fonctionner cinq fois plus lentement que Java, mais la source est cinq fois plus petit (YMMV). Pour la plupart des applications, c'est une grande victoire. Mais pour certains, et pour certaines parties de beaucoup d'autres, c'est une perte dévastatrice.

avec l'expérience du langage Clojure, je crois qu'il est possible de dire à l'avance si votre problème va se cliver proprement dans une partie qui peut être succinctement et adéquatement (en termes de performance) exprimée en Clojure et une partie qui doit faire en Java.

  • Vous pouvez aller pour Scala lite: écriture Java idiomes dans la Scala. Vous gagnerez de l' un peu de brièveté, une syntaxe plus facile à lire, et une cohérence bien que système de type complexe.
  • il n'y a pas de Clojure lite: écrire des idiomes Java Clojure est totalement inutile. Tout ce que tu auras, C'est un slow Java c'est dur pour comprendre, car il coupe à travers le grain des idiomes utilisés pour l'exprimer.

Scala a été dit être Java done right . Clojure n'a rien à voir avec Java. Vous pourriez dire qu'il est Lisp fait droit - un audacieux, certains diraient absurde, prétendre - ce qui est peut-être vrai.

14
répondu Thumbnail 2014-06-06 20:02:41

sur l'interopérabilité, Je ne peux pas parler pour Clojure, mais je m'attendrais à ce qu'il soit dans une situation similaire à Scala.

il est trivialement facile d'appeler Java à partir de Scala.

il est facile d'appeler Scala à partir de Java tant que vous conformez votre API externe aux points communs entre Scala et Java. Par exemple, un objet Scala est utilisé d'une certaine façon comme les méthodes statiques en Java, mais ce n'est pas la même chose. Les classes Scala peuvent compiler à un certain nombre de classes avec les noms drôle en Java.

vous ne voudrez pas mélanger et assortir beaucoup. Bâtiment Scala ou Clojure qui utilise beaucoup de bibliothèques Java est très faisable. Vous pouvez bien sûr faire appel à ce composant depuis Java, mais ce que vous ne voulez pas faire, c'est essayer de consommer une API Scala destinée à être utilisée par les programmes Scala de Java.

SVN prétend être"CVS done right". À mon avis, Scala est Java done right.

9
répondu Kevin Peterson 2009-10-02 07:47:29

le numéro de novembre 2010 de PragPub traite de L'interopérabilité Clojure-Java. Appeler les méthodes Java est simple, mais étendre les classes/interfaces Java est très différent.

Scala d'un autre côté est beaucoup plus proche de Java. L'interopérabilité Scala-Java est développée à http://www.codecommit.com/blog/java/interop-between-java-and-scala

appel au code Java et extension de Java classes / interfaces fonctionne de la même manière que L'appel au code Scala. Certains points douloureux pourraient être des cas extrêmes de traiter avec des génériques Java, parce que le système de type de Scala est beaucoup plus fort que Java. La création de getters et de setters suivant la Convention Java Bean nécessite une annotation .

appeler Scala à partir de Java est la plupart du temps simple, mais par exemple les objets compagnon de Scala nécessite de savoir comment ils sont compilé en bytecode. L'utilisation de traits avec des méthodes non abstraites de Java devrait également être compliquée, et les méthodes d'appel avec des caractères spéciaux nécessiteraient de savoir comment ils sont encodés dans le bytecode.

3
répondu Esko Luontola 2017-05-23 10:29:29

il est maintenant (à partir de mai 2010) la peine de loking au plus tard branche 1.2 de Clojure - Cela inclut beaucoup de soutien supplémentaire pour les types primitifs et le typage statique (par le biais de divers types d'indices et de protocoles).

ma compréhension est que vous pouvez utiliser ces fonctionnalités lorsque vous en avez besoin pour obtenir une vitesse équivalente à écrire exactement le même code en Java pur.

1
répondu mikera 2010-05-18 15:07:03