Pourquoi les gens disent-ils que Ruby est lent? [fermé]

184

J'aime Ruby on Rails et je l'utilise pour tous mes projets de développement web. Il y a quelques années, on parlait beaucoup du fait que Rails était un porc de mémoire et du fait qu'il ne s'adaptait pas très bien, mais ces suggestions ont été mises au lit par Gregg Pollack. ici .

Dernièrement cependant, j'ai entendu des gens dire que Ruby lui-même était lent.

  • Pourquoi Ruby est-il considéré comme lent?

Je ne trouve pas que Ruby soit lent, mais encore une fois, je l'utilise simplement pour créer de simples applications CRUD et des blogs d'entreprise. Quels types de projets aurais-je besoin de faire avant de trouver Ruby en train de devenir lent? Ou est-ce que cette lenteur est quelque chose qui affecte tous les langages de programmation?

  • Quelles sont vos options en tant que programmeur Ruby si vous voulez faire face à cette «lenteur»?

  • Quelle version de Ruby conviendrait le mieux à une application comme Stack Overflow où la vitesse est critique et le trafic intense?

Les questions sont subjectives et je me rends compte que la configuration architecturale (EC2 vs serveurs autonomes, etc.) fait une grande différence mais j'aimerais entendre ce que les gens pensent de la lenteur de Ruby.

Enfin, je ne trouve pas beaucoup de nouvelles sur Ruby 2.0 - je suppose que nous sommes à quelques années de cela alors?

stephenmurdoch
la source
1
duplication possible de Qu'est
Nakilon le
youtube.com/… Ruby2.1
Nithin
à part d'excellentes réponses, aucune d'entre elles ne répond vraiment POURQUOI. de meilleures informations sont dans la question connexe mentionnée par Nakilon
Andre Figueiredo

Réponses:

184

Pourquoi Ruby est-il considéré comme lent?

Parce que si vous exécutez des benchmarks typiques entre Ruby et d'autres langages, Ruby perd.

Je ne trouve pas que Ruby soit lent, mais encore une fois, je l'utilise simplement pour créer de simples applications CRUD et des blogs d'entreprise. Quels types de projets aurais-je besoin de faire avant de trouver Ruby en train de devenir lent? Ou est-ce que cette lenteur est quelque chose qui affecte tous les langages de programmation?

Ruby ne vous servirait probablement pas bien pour écrire une application de traitement du signal numérique en temps réel ou tout autre système de contrôle en temps réel. Ruby (avec les machines virtuelles d'aujourd'hui) s'étoufferait probablement sur un ordinateur aux ressources limitées comme les smartphones.

N'oubliez pas qu'une grande partie du traitement de vos applications Web est en fait effectuée par des logiciels développés en C. par exemple Apache, Thin, Nginx, SQLite, MySQL, PostgreSQL, de nombreuses bibliothèques d'analyse, RMagick, TCP / IP, etc. sont des programmes C utilisés par Ruby . Ruby fournit la colle et la logique métier.

Quelles sont vos options en tant que programmeur Ruby si vous voulez faire face à cette «lenteur»?

Passez à une langue plus rapide. Mais cela a un coût. C'est un coût qui peut en valoir la peine. Mais pour la plupart des applications Web, le choix de la langue n'est pas un facteur pertinent car il n'y a tout simplement pas assez de trafic pour justifier l'utilisation d'un langage plus rapide qui coûte beaucoup plus cher à développer.

Quelle version de Ruby conviendrait le mieux à une application comme Stack Overflow où la vitesse est critique et le trafic intense?

D'autres personnes ont répondu à cela - JRuby, IronRuby, REE rendront la partie Ruby de votre application plus rapide sur des plates-formes qui peuvent se permettre les machines virtuelles. Et comme ce n'est souvent pas Ruby qui cause la lenteur, mais l'architecture de votre système informatique et l'architecture de vos applications, vous pouvez faire des choses comme la réplication de base de données, plusieurs serveurs d'applications, l'équilibrage de charge avec des proxys inverses, la mise en cache HTTP, Memcache, Ajax, la mise en cache côté client, etc. Aucun de ces trucs n'est Ruby.

Enfin, je ne trouve pas beaucoup de nouvelles sur Ruby 2.0 - je suppose que nous sommes à quelques années de cela alors?

La plupart des gens attendent Ruby 1.9.1. J'attends moi-même Rails 3.1 sur Ruby 1.9.1 sur JRuby.

Enfin, rappelez-vous que de nombreux développeurs choisissent Ruby parce que cela rend la programmation plus agréable par rapport à d'autres langages, et parce que Ruby with Rails permet aux développeurs Web qualifiés de développer des applications très rapidement.

Jay Godse
la source
3
après mûre réflexion, j'ai décidé que c'était la meilleure réponse. Merci, j'aime l'analogie avec l'application de traitement du signal. Il est plus facile de voir de quoi les gens parlent maintenant après toutes ces réponses utiles.
stephenmurdoch
1
Oui, vous étiez à quelques années de ruby ​​2, Ruby 2.0.0 Sorti le 24 février 2013
Morgan
3
Mon expérience en utilisant Ruby 2.1 est qu'il est environ 25% plus rapide que la même application exécutée dans Ruby 2.0
Matt Connolly
14
Les langues ne sont ni lentes ni rapides, leurs implémentations, interpréteurs et compilateurs sont
:)
122

Tout d'abord, plus lent par rapport à quoi ? C? Python? Prenons quelques chiffres au jeu des benchmarks du langage informatique :

Pourquoi Ruby est-il considéré comme lent?

Cela dépend de qui vous demandez. On pourrait vous dire que:

  • Ruby est un langage interprété et les interprétés auront tendance à être plus lents que les langages compilés
  • Ruby utilise le garbage collection (bien que C #, qui utilise également le garbage collection, sort deux ordres de grandeur avant Ruby, Python, PHP, etc. dans les benchmarks plus algorithmiques et moins gourmands en allocation de mémoire ci-dessus)
  • Les appels de méthode Ruby sont lents (bien que, en raison du typage canard, ils soient sans doute plus rapides que dans les langages interprétés fortement typés)
  • Ruby (à l'exception de JRuby) ne prend pas en charge le vrai multithreading
  • etc.

Mais, là encore, lent par rapport à quoi? Ruby 1.9 est à peu près aussi rapide que Python et PHP (avec un facteur de performance 3x) par rapport à C (qui peut être jusqu'à 300x plus rapide), donc ce qui précède (à l'exception des considérations de threading, si votre application dépend fortement de cet aspect ) sont largement académiques.

Quelles sont vos options en tant que programmeur Ruby si vous voulez faire face à cette «lenteur»?

Écrire pour l'évolutivité et y ajouter plus de matériel (par exemple, de la mémoire)

Quelle version de Ruby conviendrait le mieux à une application comme Stack Overflow où la vitesse est critique et le trafic intense?

Eh bien, REE (combiné avec Passenger ) serait un très bon candidat.

vladr
la source
1
Le garbage collection lui-même n'est pas nécessairement lent, mais le garbage collection du MRI l'est. Si vous avez besoin de Ruby plus rapide, vous pouvez également consulter JRuby ainsi que REE.
Andreas
1
@igouy, True, la mi-2008 a peut-être été extrême. J'ai mis à jour les liens, mais ils deviendront à leur tour obsolètes dans quelques mois. :) Quoi qu'il en soit, le matériel et certains niveaux de patch peuvent avoir été différents, et quelques tests supplémentaires ont été ajoutés, mais la vue d'ensemble des choses n'a pas changé.
vladr
11
>> dans le même ordre de grandeur << C'est dans le même ordre de grandeur si vous vivez jusqu'à 7 ans ou jusqu'à 69 ans. Cette différence est-elle insignifiante?
igouy
10
@igouy, je ne sais pas pour vous, mais je ne suis pas un programme pour mesurer ma durée de vie en termes de vitesse d'exécution. Là où je me soucie de la vitesse d'exécution, par exemple, c'est le temps de rendu de la réponse HTTP. Je sais que je ne remarquerai pas la différence entre le temps de rendu de 7 ms et 69 ms (surtout en cas de latence réseau de 130 ms). Je sais que je remarquerai la différence entre 7 ms et 700 ms, et je remarquerai CERTAINEMENT une différence entre 7 ms et 7 s - mais non, pas entre 7 ms et 69 ms.
vladr
3
@vladr, qu'en est-il des 70 ms ou 700 ms? Pouvez-vous remarquer cette différence?
Paul Draper
60

Voici ce que le créateur de Rails, David Heinemeier Hansson a à dire:

Rails [Ruby] est pour la grande majorité des applications Web Fast Enough. Nous avons des sites qui effectuent des millions de pages vues dynamiques par jour. Si vous vous retrouvez avec la page d'accueil de Yahoo ou d'Amazon, il est peu probable qu'un cadre standard dans N'IMPORTE QUELLE langue vous fasse beaucoup de bien. Vous devrez probablement rouler le vôtre. Mais bien sûr, j'aimerais aussi des cycles CPU gratuits. Il se trouve que je me soucie beaucoup plus des cycles de développement gratuits et je suis prêt à échanger le premier contre le second.

c'est-à-dire que lancer plus de matériel ou de machines au problème est moins cher que d'embaucher plus de développeurs et d'utiliser un langage plus rapide, mais plus difficile à maintenir. Après tout, peu de gens écrivent des applications Web en C.

Ruby 1.9 est une amélioration considérable par rapport à 1.8. Les plus gros problèmes avec Ruby 1.8 sont sa nature interprétée (pas de bytecode, pas de compilation) et que les appels de méthode, l'une des opérations les plus courantes de Ruby, sont particulièrement lents.

Cela n'aide pas que presque tout soit une recherche de méthode dans Ruby - ajouter deux nombres, indexer un tableau. Là où d'autres langages exposent des hacks ( __add__méthode de Python , overload.pm de Perl) Ruby fait de la pure OO dans tous les cas, et cela peut nuire aux performances si le compilateur / interpréteur n'est pas assez intelligent.

Si j'écrivais une application Web populaire en Ruby, je me concentrerais sur la mise en cache. La mise en cache d'une page réduit le temps de traitement de cette page à zéro, quelle que soit la langue que vous utilisez. Pour les applications Web, la surcharge de la base de données et les autres E / S commencent à avoir beaucoup plus d'importance que la vitesse du langage, je me concentrerais donc sur l'optimisation de cela.

rjh
la source
7
"Après tout, peu de gens écrivent des applications Web en C." - Bien sûr que non, mais de nombreux sites Web critiques pour les performances ont été déplacés, par exemple, vers Scala.
Dario
6
Je ne suis pas d'accord avec le fait que «jeter plus de matériel» coûte moins cher. Il est difficile de convaincre les clients qu'ils devraient payer plus d'argent pour l'hébergement tous les X mois, car leur plate-forme a été conçue pour les développeurs.
Kevin
9
@Keven: les coûts de développement seraient certainement réduits? Sinon, quel serait l'intérêt d'utiliser Ruby en premier lieu?
rjh
4
@Kevin Cette déclaration est un peu large. Si vous aviez besoin de mettre en place un nouveau serveur pour chaque augmentation de trafic de 10% environ avec une centaine de visites par jour, le client aurait clairement le droit de se plaindre. Mais de manière réaliste, vous devez généralement avoir beaucoup plus de trafic au départ et l'augmenter d'un ordre de grandeur, avant que l'ancien matériel ne puisse plus faire face. À ce stade, le sujet se déplace dans le domaine «un bon problème à avoir» et presque personne ne se plaindra de la mise à niveau du matériel. De plus, aucun «client» n'exécute un site Web à trafic aussi élevé sans être conscient de ce genre de choses.
deceze
5
@Kevin - inversons la situation. "Il est difficile de convaincre les clients qu'ils devraient attendre 3 mois pour une nouvelle fonctionnalité, car leur plate-forme a été conçue avec les ordinateurs à l'esprit." Si cette nouvelle fonctionnalité augmente considérablement les revenus, elle paiera pour le matériel supplémentaire. Par ailleurs, choisir un langage rapide dès le départ est, pour de nombreuses applications, une optimisation prématurée. Il y a de fortes chances que votre goulot d'étranglement soit ailleurs: lectures de la base de données, latence du réseau, etc.
Nathan Long
34

L'écriture du code est lente. La lecture du code est lente. Trouver et corriger les bogues est lent. L'ajout de fonctionnalités et d'améliorations est lent. Tout ce qui améliore le précédent est une victoire. Les performances d'exécution sont très rarement un problème.

Président James K. Polk
la source
30
@GregS: les performances d'exécution sont toujours un problème si elles ont un impact sur la convivialité. Certes, analyser un fichier xml à la recherche d'une chaîne en une seconde ou trois n'a pas d'importance du point de vue des nombres purs, mais une différence de quelques secondes peut faire une grande différence en termes de convivialité lorsque vous parlez d'une application destinée aux utilisateurs.
Bryan Oakley
5
@Ajax: Non, je parie que c'est ta personnalité gagnante.
Président James K. Polk
15
Jusqu'à présent, mon record est d'économiser 30 000 $ / an à une entreprise en une journée de travail. Leurs ingénieurs ont décidé qu'il était plus lisible qu'un algorithme de cloud computing compte le nombre de tâches effectuées à chaque itération, provoquant n! requêtes sur les emplois avec plus de 20 000 unités de travail. Si vous modifiez cela pour vérifier si 1 élément de travail était laissé, il a été placé dans n requêtes et a réduit la facture de 130 USD / jour à 20 USD / jour. Les codeurs paresseux me font de l'argent. Veuillez encourager davantage de codeurs paresseux.
Ajax
10
C'est drôle que vous commentez tout à l'heure ... Je suis passé à une autre société, où nous venons de retirer quinze développeurs des fonctionnalités et de la performance depuis qu'une grande banque américaine refuse de signer un contrat de plusieurs millions de dollars jusqu'à ce que le système peut gérer leur charge. Ils aiment les fonctionnalités que nous avons, mais pas la vitesse à laquelle ils fonctionnent. Si vous ignorez les performances assez longtemps, peu importe les fonctionnalités dont vous disposez car elles seront anormalement lentes .
Ajax
4
Les performances d'exécution sont toujours un problème, à quel point nous parlons d'un problème. Quelle quantité de code interprété pouvez-vous exécuter sur un téléphone mobile avant que les utilisateurs arrêtent d'acheter votre application, car elle tue les batteries? Combien de temps un utilisateur attendra-t-il que votre page se charge avant de fermer l'annonce, ce qui vous privera de revenus publicitaires? Répondez à ces types de questions et vous vous demandez à quel point les performances d'exécution sont importantes.
Sqeaky
15

La réponse est simple: les gens disent que le rubis est lent parce qu'il est lent basé sur des comparaisons mesurées avec d'autres langues. Gardez à l'esprit, cependant, que «lent» est relatif. Souvent, le rubis et les autres langages «lents» sont assez rapides.

Bryan Oakley
la source
ouais, c'est ce que je pensais, je veux dire, les gens disent que c'est lent, mais c'est toujours sacrément rapide pour mes besoins ...
stephenmurdoch
11
>> c'est encore sacrément rapide pour mes besoins << C'est assez rapide pour tout ce qui n'a pas besoin d'être rapide :-)
igouy
Je suis partiellement biaisé à ce sujet, peut-être que c'est un commentaire obsolète. maintenant nous avons ruby ​​2.3, et de l'expérience de ruby ​​2.2, j'ai trouvé que la pile de rails est lourde. si ceux qui ont besoin d'un cadre plus rapide, essayez pidrano, son basé sur sinatra et ils ont essayé de faire le plus près possible de la commande des rails, mais beaucoup plus léger. mais ils n'ont pas encore atteint la version 1.0, encore plus à venir, mais d'après mon test, il fonctionne bien et rapidement. Je l'ai travaillé avec des pignons actifs record 5 et pidrano, empruntés à des rails. Avec 200 connexions simultanées, j'obtiens une réponse de 1,5 s sans requête de base de données, avec des actifs de sprockets
James Tan
5

Joel on Software - Ruby Performance Revisited l' explique assez bien. Pourrait être obsolète cependant ...

Je recommanderais de vous en tenir à cela car vous êtes habitué à Ruby on Rails,
si jamais vous rencontrez un problème de performances, vous pouvez reconsidérer pour utiliser un langage et un cadre différents.

Dans ce cas, je suggérerais vraiment C # avec ASP.NET MVC 2 , fonctionne très bien pour les applications CRUD.

Tamara Wijsman
la source
Merci pour le lien, j'aime toujours lire le point de vue de Joel. Remarque intéressante qu'il fait à propos du "slogan de l'autocollant de pare-chocs" de DHH ...
stephenmurdoch
Citation: " Cela ne s'applique pas à tout le monde, mais quand les gens disent qu'ils ont des problèmes de performances avec Ruby ou qu'ils ont juste besoin de pouvoir exécuter du code plus rapidement que le moteur de langage Ruby principal ne peut l'exécuter, cela n'aide pas d'avoir Ruby préconise de chanter des hymnes sur les cycles des développeurs par rapport aux cycles CPU. "Bien dit.
Marc 2377
3

Je dirais que Ruby est lent car peu d'efforts ont été consacrés à rendre l'interprète plus rapide. La même chose s'applique à Python. Smalltalk est tout aussi dynamique que Ruby ou Python mais fonctionne mieux de loin, voir http://benchmarksgame.alioth.debian.org . Depuis Smalltalk a été plus ou moins remplacé par Java et C # (c'est-à-dire il y a au moins 10 ans), aucun travail d'optimisation des performances n'a été effectué pour lui et Smalltalk est toujours bien plus rapide que Ruby et Python. Les gens de Xerox Parc et d'OTI / IBM avaient l'argent pour payer ceux qui travaillent à rendre Smalltalk plus rapide. Ce que je ne comprends pas, c'est pourquoi Google ne dépense pas l'argent pour rendre Python plus rapide car il s'agit d'une grande boutique Python. Au lieu de cela, ils dépensent de l'argent pour développer des langages comme Go ...

OlliP
la source
Je pense que c'est parce que Python a déjà sa place et est fortement utilisé de nos jours. Si vous avez besoin de hautes performances, il existe de nombreuses bibliothèques que vous pouvez utiliser ou tisser et d'autres choses que vous pouvez utiliser.
Zelphir Kaltstahl
D'après ce que j'ai lu, certains efforts ont déjà donné de bons résultats dans Ruby 2.5.
Marc 2377
2

Tout d'abord, vous souciez-vous de ce que les autres disent de la langue que vous aimez? Quand il fait le travail qu'il doit faire, tout va bien.

OO n'est pas le moyen le plus rapide d'exécuter du code, mais il aide à créer le code. Le code intelligent est toujours plus rapide que le code stupide et les boucles inutiles. Je suis un DBA et vois beaucoup de ces boucles inutiles, supprimez-les, utilisez un meilleur code et des requêtes et l'application est plus rapide, beaucoup plus rapide. Vous souciez-vous de la dernière microseconde? Vous pouvez avoir des langages optimisés pour la vitesse, d'autres font juste le travail qu'ils ont à faire et peuvent être maintenus par de nombreux programmeurs différents.

C'est juste un choix.

Frank Heikens
la source
2

De toute évidence, parler de vitesse perd Ruby. Même si les tests de référence suggèrent que Ruby n'est pas tellement plus lent que PHP. Mais en retour, vous obtenez un code DRY facile à entretenir, le meilleur de tous les frameworks dans différentes langues.

Pour un petit projet, vous ne ressentirez aucune lenteur (je veux dire jusqu'à <50K utilisateurs) étant donné qu'aucun calcul complexe n'est utilisé dans le code, juste les choses courantes.

Pour un projet plus important, payer les ressources est payant et coûte moins cher que les salaires des développeurs. De plus, l'écriture de code sur RoR s'avère beaucoup plus rapide que tout autre.

En 2014, l'ampleur de la différence de vitesse dont vous parlez est insignifiante pour la plupart des sites Web.

Rápli András
la source
2

La manière de gérer les performances de Ruby dans une application Web est la même que pour tout autre langage de programmation:

ARCHITECTURE

C'est plus facile à faire dans Rails que dans la plupart des autres frameworks Web.

Au niveau de l'application , en mettant en cache tout ce qui est censé être mis en cache et en gérant l'accès à la base de données de manière intelligente (puisque le goulot d'étranglement se situe généralement sur l'accès «DB» pour la plupart des applications WEB).

Grâce aux rails, il est très facile et naturel de résoudre ces problèmes. Il existe plusieurs abstractions pour la mise en cache des données, des pages et des fragments , et il y a aussi de très belles abstractions pour traiter la partie SQL de manière optimisée et réutilisable ( Active Record et AREL ).

C'est la raison pour laquelle tant d'applications écrites dans des langages plus rapides et moins expressifs (comme php) finissent par être plus lentes que les homologues Ruby. Il n'est pas si facile et élégant de s'attaquer à la mise en cache et aux requêtes avec ces langages qu'avec Ruby.

Au niveau de l'infrastructure, il est raisonnable de penser à l'équilibrage de charge et à tout ce que je ne connais pas beaucoup. J'externaliserais ce problème en embauchant une plate-forme en tant que fournisseur de services, comme Heroku ou Engine Yard . En tous cas. Le déploiement de rails avec équilibrage de charge n'est probablement pas très difficile à faire.

Pedro Morte Rolo
la source
1

Ruby est plus lent que C ++ pour un certain nombre de tâches facilement mesurables (par exemple, faire du code qui dépend fortement de la virgule flottante). Ce n'est pas très surprenant, mais une justification suffisante pour que certains disent que «Ruby est lent» sans réserve. Ils ne tiennent pas compte du fait qu'il est beaucoup plus facile et plus sûr d'écrire du code Ruby que C ++.

La meilleure solution consiste à utiliser des modules ciblés écrits dans un autre langage (par exemple, C, C ++, Fortran) dans votre code Ruby. Ceux-ci peuvent faire le gros du travail et vos scripts peuvent se concentrer sur des problèmes de coordination de niveau supérieur.

Boursiers Donal
la source
Les comparaisons sont souvent faites avec Java, C #, Python, peut-être Perl plutôt que C ++.
rjh
5
Bien sûr. Mais je peux vous assurer (en tant que développeur de Tcl) que les gens vous compareront toujours injustement avec d'autres langages. Le correctif consiste à utiliser ces autres langages pour les composants que vous cousez ensemble; tout faire dans une seule langue, c'est un peu comme utiliser un seul outil pour toutes les tâches. Si tout ce que vous avez est un marteau, tout ressemble à un pouce.
Donal Fellows
belle idée d'utiliser des modules en langue étrangère quand ils sont nécessaires
stephenmurdoch
>> pour dire que "Ruby est lent" sans réserve << Il y a quelques années, ils auraient pu continuer à montrer des programmes Ruby qui étaient plus lents que les programmes Tcl :-)
igouy
1
Vous savez ce qu'ils disent des mensonges, des damnés mensonges et des repères. ;-)
Donal Fellows
0

La performance repose presque toujours sur une bonne conception et des interactions de base de données optimisées. Ruby fait ce dont la plupart des sites Web ont besoin assez rapidement, en particulier les versions les plus récentes; et la rapidité du développement et la facilité de maintenance offrent un gain important en termes de coûts et de satisfaction des clients. Je trouve que JAVA a des performances d'exécution lentes pour certaines tâches, et étant donné la difficulté de développement en JAVA, de nombreux développeurs créent des applications lentes quelle que soit la capacité de vitesse théorique démontrée dans les benchmarks (les benchmarks sont généralement conçus pour montrer une capacité spécifique et étroite). Lorsque j'ai besoin d'un traitement intensif qui n'est pas bien adapté aux capacités de ma base de données, je choisis C ou Objective-C ou un autre langage compilé vraiment haute performance pour ces tâches en fonction de la plate-forme. Si j'ai besoin de créer une application Web basée sur des données, J'utilise RoR ou parfois C # ASP.NET en fonction d'autres exigences; car toutes les plateformes ont des forces et des faiblesses. La vitesse d'exécution des tâches de votre application est importante, mais après tout, si les performances d'exécution d'un aspect étroit d'un langage sont tout ce qui compte; alors je pourrais encore utiliser le langage Assembler pour tout.

Richard
la source
-5

Ruby fonctionne bien pour la productivité des développeurs. Ruby par nature force le développement piloté par les tests en raison du manque de types. Ruby fonctionne bien lorsqu'il est utilisé comme wrapper de haut niveau pour les bibliothèques C. Ruby fonctionne également bien pendant les processus de longue durée lorsqu'il est compilé en JIT en code machine via JVM ou Rbx VM. Ruby ne fonctionne pas bien lorsqu'il est nécessaire de traiter des nombres en peu de temps avec du code ruby ​​pur.

Nurettin
la source