57 votes

Qu'est-ce qui fait que Ruby est lent?

Ruby est lent à certaines choses. Mais quelles sont les parties de celui-ci sont les plus problématiques?

Quel est le garbage collector affecter les performances? Je sais que j'ai eu des moments lors de l'exécution du garbage collector seul a fallu plusieurs secondes, surtout lorsque l'on travaille avec OpenGL bibliothèques.

J'ai utilisé de la matrice des bibliothèques mathématiques avec Ruby qui ont été particulièrement lente. Est-il un problème avec la façon dont ruby met en œuvre des maths de base?

Existe-il des caractéristiques dynamiques dans Ruby ne peut tout simplement pas être mis en œuvre de manière efficace? Si oui, comment faire pour d'autres langues comme le Lua et Python résoudre ces problèmes?

Il y a eu les travaux récents qui ont considérablement amélioré la performance?

70voto

rogerdpack Points 12806

Ruby est lente. Mais quelles sont les parties de celui-ci sont les plus problématiques?

Il n' "fin de recherche" pour les méthodes, pour permettre une certaine flexibilité. Cela ralentit un peu. Il faut aussi garder en mémoire les noms de variables par contexte pour permettre eval, de sorte que les cadres et les appels de méthode sont plus lents. Aussi il lui manque un bon compilateur JIT actuellement, même si l'IRM 1.9 a un compilateur de bytecode (ce qui est mieux), et jruby compile vers le bas pour le bytecode java, qui ensuite (peut) compiler via le HotSpot de la JVM du compilateur JIT, mais il finit par être la même vitesse que le 1.9.

Quel est le garbage collector effet de la performance? Je sais que j'ai eu des moments lors de l'exécution du garbage collector seul a fallu plusieurs secondes, surtout lorsque l'on travaille avec OpenGL bibliothèques.

à partir de certains des graphiques http://www.igvita.com/2009/06/13/profiling-ruby-with-googles-perftools/ je dirais qu'il faut environ 10%, ce qui est tout à fait un peu, vous pouvez diminuer que frappé par l'augmentation de la malloc_limit dans le gc.c et de le recompiler.

J'ai utilisé de la matrice des bibliothèques mathématiques avec Ruby qui ont été particulièrement lente. Est-il un problème avec la façon dont ruby met en œuvre des maths de base?

Ruby 1.8 "ne pas" mettre en œuvre des maths de base mis en œuvre Numérique des classes et vous souhaitez appeler les choses comme Fixnum#+ Fixnum#/ une fois par appel, qui a été lente. Ruby 1.9 triche un peu en inline certaines notions de mathématiques de base de la fpo.

Existe-il des caractéristiques dynamiques dans Ruby ne peut tout simplement pas être mis en œuvre de manière efficace? Si oui, comment faire pour d'autres langues comme le Lua et Python résoudre ces problèmes?

Des choses comme eval sont difficiles à mettre en œuvre de manière efficace, bien que beaucoup de travail qui peut être fait, j'en suis sûr. La bosse de Ruby, c'est qu'il a pour accueillir quelqu'un dans un autre thread, la modification de la définition d'une classe spontanément, de sorte qu'il doit être très prudente.

Il y a eu les travaux récents qui ont considérablement amélioré la performance?

1.9 est comme un 2x plus rapide. Il est également plus efficace de l'espace. JRuby cherche constamment à s'améliorer en termes de vitesse [et probablement passe moins de temps dans la GC que KRI]. Outre que je ne suis pas au courant de grand chose, sauf peu hobby choses que j'ai travaillé. Notez également que de 1,9 chaînes sont à la fois plus lente à cause de l'encodage de la convivialité.

11voto

Mike Woodhouse Points 27748

Ruby est très bon pour la fourniture de solutions rapidement. Moins pour la fourniture de solutions rapides. Cela dépend de quel type de problème que vous essayez de résoudre. Je me rappelle des discussions sur l'ancien CompuServe MSBASIC forum dans le début des années 90: quand on demande qui a été plus rapide pour le développement de Windows, VB ou C, la réponse est "VB, d'environ 6 mois".

Dans son IRM de 1,8 forme, le Rubis est relativement lent pour effectuer certains types de calculs intensifs tâches. Pratiquement n'importe quel langage interprété souffre de cette façon, en comparaison à la plupart des langages compilés.

Les raisons sont multiples: certains assez facilement adressable (la primitive de collecte des ordures dans la 1.8, par exemple), d'autres moins.

1.9 répond à certaines des questions, même si c'est probablement va être un certain temps avant qu'il devient disponible. Certains de l'autre de mise en œuvre de la cible pré-existantes, les runtimes, JRuby, IronRuby, train à sustentation magnétique, par exemple, ont le potentiel d'être beaucoup plus rapide.

Concernant le rendement en mathématiques, je ne serais pas surpris de voir assez lent, le débit: c'est la partie du prix que vous payez pour une précision arbitraire. Encore une fois, choisissez votre problème. J'ai résolu 70+ du Projet Euler problèmes en Ruby avec presque pas de solution de prendre plus que quelques minutes pour s'exécuter. Combien de temps vous avez besoin afin de fonctionner et de combien de temps avez-vous besoin?

9voto

alamar Points 6376

Le plus problématique est "tout le monde".

Les points de Bonus si "tout le monde" n'a pas vraiment l'utilisation de la langue, jamais.

Sérieusement, 1.9 est beaucoup plus rapide et maintenant il est sur le pair avec python, et jruby est plus rapide que python.

Ramasseurs d'ordures sont partout; par exemple, en Java, et c'est plus rapide que le C++ sur la gestion dynamique de la mémoire. Ruby n'est pas bien adapté pour de nombreux calculs; mais rares sont les langues, donc si vous avez de calcul intensif de pièces dans votre programme dans n'importe quelle langue, vous feriez mieux de les réécrire en C (Java est rapide avec les mathématiques en raison de son type primitif, mais il l'a payé cher pour eux, ils sont clairement n ° 1 dans plus laid parties de la langue).

Comme pour les caractéristiques dynamiques: ils ne sont pas rapides, mais le code sans eux, dans langages statiques peuvent être encore plus lente; par exemple, en java utiliser un XML de config au lieu de Ruby à l'aide d'un LIS; et il serait probablement plus LENT depuis d'analyse XML est coûteux.

8voto

Matthew Bloch Points 253

Hmm - j'ai travaillé sur un projet il y a quelques années où j'ai raclé le baril avec Ruby performance, et je ne suis pas sûr que beaucoup de choses ont changé depuis. Maintenant, c'est le caveat emptor - vous avez à savoir pour ne pas faire certaines choses, et franchement les jeux / applications temps-réel serait l'un d'eux (puisque vous parlez de l'OpenGL).

Le coupable pour le meurtre de performance interactive est le garbage collector - autres ici mentionner que Java et d'autres environnements de collecte des ordures, mais Ruby a pour arrêter le monde à exécuter. C'est-à-dire, il doit arrêter l'exécution de votre programme, de numérisation à travers tous les registres et la mémoire du pointeur à partir de zéro, la marque de la mémoire qui est encore en usage, et gratuit le reste. Le processus ne peut pas être interrompu, tout ce qui se passe, et comme vous l'avez peut-être remarqué, il peut prendre des centaines de millisecondes.

Sa fréquence et sa durée d'exécution est proportionnel au nombre d'objets vous pouvez créer et détruire, mais à moins de désactiver complètement, vous n'avez aucun contrôle. Mon expérience a été il y avait plusieurs insatisfaisant des stratégies pour lisser mes Ruby boucle d'animation:

  • GC.désactiver / GC.activer autour de la critique de l'animation des boucles et peut-être un opportuniste GC.départ pour le forcer à aller quand il ne peut pas faire de mal. (parce que ma plate-forme cible était à l'époque 64MO de l'ordinateur Windows NT, cela a provoqué le système à exécuter de mémoire de temps en temps. Mais fondamentalement, c'est une mauvaise idée, sauf si vous pouvez pré-calculer la quantité de mémoire dont vous pourriez avoir besoin avant de le faire, vous risquez de la mémoire de l'épuisement)
  • Réduire le nombre d'objets que vous créez donc le GC a moins de travail à faire pour réduire la fréquence et la durée de son exécution)
  • Réécrire votre animation en boucle dans C (un flic, mais celui que je suis allé avec!)

Ces jours-ci je ne serais probablement aussi voir si JRuby travail comme une alternative d'exécution, comme je le crois, il s'appuie sur Java est plus sophistiqué garbage collector.

L'autre grand problème de performance que j'ai trouvé est de base d'e/S lorsqu'il essaie d'écrire un serveur TFTP en Ruby a tout à l'arrière (ouais je choisir les meilleures de toutes les langues pour mes critiques des performances des projets de cet été était juste une expérience). L'absolu la plus simple, la plus serrée de la boucle pour simplement répondre à un paquet UDP avec un autre, contenant le morceau suivant d'un fichier, doivent avoir été sur 20x plus lent que le stock de C de la version. Je soupçonne qu'il y a eu quelques améliorations à y faire basée sur l'utilisation d'un faible niveau d'IO (sysread etc.) mais la lenteur est peut-être juste dans le fait il n'y a pas de bas niveau de type de données byte - chaque petite lecture est copié dans une Chaîne de caractères. Ce n'est que spéculation mais, je n'ai pas pris ce projet beaucoup plus loin, mais il m'a prévenu off en s'appuyant sur snappy I/O.

La principale vitesse de l'augmentation récente qui a été accompli, même si je ne suis pas complètement à jour, ici, est que la machine virtuelle de mise en œuvre a été refaite pour la 1.9, ce qui accélère l'exécution de code. Cependant je ne pense pas que le GC a changé, et je suis assez sûr il n'y a rien de nouveau sur le I/O avant. Mais je ne suis pas complètement à jour sur le saignement-bord Ruby si quelqu'un d'autre pourrait vouloir à puce d'ici.

4voto

Oleg Andreev Points 446

Steve Dekorte: "la Rédaction d'un ensemble de Mandelbrot calculatrice dans un langage de haut niveau, c'est comme essayer d'exécuter l'Indy 500 en un bus."

http://www.dekorte.com/blog/blog.cgi?do=item&id=4047

Je vous recommande d'apprendre les différents outils afin d'utiliser le bon outil pour le travail. Faire des transformations de matrice pourrait être fait de manière efficace en utilisant des API de haut niveau qui s'enroule autour de boucles serrées avec de calcul intensif des calculs. Voir RubyInline gem pour un exemple d'intégration de code C ou C++ dans le script Ruby.

Il est également Io langue qui est beaucoup plus lent que le Rubis, mais il efficace rend les films de Pixar et surpasse C brutes sur le vecteur de l'arithmétique en utilisant SIMD accélération.

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