web-dev-qa-db-fra.com

Pourquoi les gens disent-ils que Ruby est lent?

J'aime Ruby sur Rails et je l'utilise pour tous mes projets de développement Web. Il y a quelques années, on parlait beaucoup de Rails et de son manque d'efficacité, mais ces suggestions ont été mises au point par Gregg Pollack ici .

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

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

Je ne trouve pas que Ruby soit lent, mais je l'utilise simplement pour créer de simples applications CRUD et des blogs d'entreprise. Quel type de projets devrais-je réaliser avant de constater que Ruby ralentit? Ou est-ce que cette lenteur est juste quelque chose qui affecte tous les langages de programmation?

  • Quelles sont vos options en tant que programmeur Ruby si vous voulez gérer cette "lenteur"?

  • Quelle version de Ruby conviendrait le mieux à une application telle que 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 par rapport aux serveurs autonomes, etc.) fait une grande différence, mais j'aimerais entendre ce que les gens pensent de Ruby être lent.

Enfin, je ne trouve pas beaucoup d’informations sur Ruby 2.0 - Je suppose que nous sommes dans quelques années, alors?

184
stephenmurdoch

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

Parce que si vous exécutez des tests de performance typiques entre Ruby et d’autres langues, Ruby perd.

Je ne trouve pas que Ruby soit lent, mais je l'utilise simplement pour créer de simples applications CRUD et des blogs d'entreprise. Quel type de projets devrais-je réaliser avant de constater que Ruby ralentit? Ou est-ce que cette lenteur est juste quelque chose qui affecte tous les langages de programmation?

Ruby ne vous servirait probablement pas bien pour écrire une application de traitement de signal numérique en temps réel, ou tout type de système de contrôle en temps réel. Ruby (avec les machines virtuelles actuelles) serait probablement étouffé par un ordinateur aux ressources limitées, tel qu'un smartphone.

N'oubliez pas qu'une grande partie du traitement de vos applications Web est en réalité effectuée par un logiciel développé en C. ex. Apache, Thin, Nginx, SQLite, MySQL, PostgreSQL, de nombreuses bibliothèques d'analyse syntaxique, 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 gérer cette "lenteur"?

Basculez vers 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 important car il n’ya tout simplement pas assez de trafic, ce qui justifie l’utilisation d’un langage plus rapide qui coûte beaucoup plus cher à développer.

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

D'autres personnes ont déjà répondu à cette question - JRuby, IronRuby, REE feront en sorte que la partie Ruby de votre application s'exécute plus rapidement sur des plates-formes pouvant s'offrir les VM. Et comme ce n’est souvent pas Ruby _ qui cause la lenteur, mais l’architecture de votre système et 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 proxies inversés, 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 d’informations sur Ruby 2.0 - Je suppose que nous sommes dans quelques années, 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, comparé à d'autres langages, et parce que Ruby avec Rails permet à un web expérimenté les développeurs à développer des applications très rapidement.

184
Jay Godse

Tout d’abord, plus lent par rapport à quoi ? C? Python? Obtenons quelques chiffres au Jeu du test de langage :

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 langages interprétés auront tendance à être plus lents que ceux compilés
  • Ruby utilise la récupération de place (bien que C #, qui utilise également la récupération de place, s'affiche deux ordres de grandeur avant Ruby, Python, PHP etc. dans les points de repère plus algorithmiques et moins gourmands en allocation de mémoire ci-dessus)
  • Les appels à la méthode Ruby sont lents (bien que, du fait de la frappe au moyen de canards, ils soient sans doute plus rapides que dans les langages interprétés fortement typés)
  • Ruby (à l'exception de JRuby) ne supporte pas le vrai multithreading
  • etc.

Mais, encore une fois, lent par rapport à quoi? Ruby 1.9 est à peu près aussi rapide que Python et PHP (dans un facteur de performance 3x) par rapport à C (qui peut être jusqu'à 300x plus rapide), Ce qui précède (à l'exception des considérations de threading, si votre application dépend fortement de cet aspect) est en grande partie théorique.

Quelles sont vos options en tant que programmeur Ruby si vous voulez gérer cette "lenteur"?

Ecrivez pour plus d'évolutivité et lancez plus de matériel (par exemple, de la mémoire)

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

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

121
vladr

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

Rails [Ruby] est destiné à la grande majorité des applications Web Fast Enough. Nous avons des sites faisant des millions de pages vues dynamiques par jour. Si vous vous retrouvez sur la page d'accueil de Yahoo ou d'Amazon, il est peu probable qu'un framework standard dans TOUT langage QUI vous fasse beaucoup de bien. Vous devrez probablement rouler le vôtre. Mais bien sûr, je voudrais aussi des cycles de CPU libres. Je me soucie simplement beaucoup plus des cycles de développement gratuits et suis prêt à échanger le premier contre le dernier.

c'est-à-dire que lancer plus de matériel ou de machines sur le problème revient moins cher que d'embaucher plus de développeurs et d'utiliser un langage plus rapide, mais plus difficile à gérer. 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. Le plus gros problème de Ruby1.8 est sa nature interprétée (pas de code-octet, pas de compilation) et les appels de méthode, l'une des opérations les plus courantes en Ruby, sont particulièrement lents.

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

Si j'écrivais une application Web populaire en Ruby, mon objectif serait 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 utilisée. Pour les applications Web, la surcharge de la base de données et les autres E/S commencent à compter beaucoup plus que la rapidité du langage. Je me concentrerais donc sur l'optimisation.

60
rjh

L'écriture de code est lente. La lecture du code est lente. La recherche et la correction des bogues sont lentes. L'ajout de fonctionnalités et d'améliorations est lent. Tout ce qui améliore la précédente est une victoire. Très rarement, la performance d'exécution pose problème.

34
James K Polk

La réponse est simple: les gens disent que Ruby est lent parce que est lent, basé sur des comparaisons mesurées avec d'autres langues. Gardez à l'esprit, cependant, que "lent" est relatif. Souvent, Ruby et d’autres langues "lentes" suffisent assez rapidement.

15
Bryan Oakley

Joel on Software - Ruby Performance revisitée l'explique assez bien. Pourrait être obsolète si ...

Je vous recommande de vous en tenir à ce que vous êtes habitué à Ruby sur Rails,
Si vous rencontrez un problème de performances, vous pouvez reconsidérer l’utilisation d’un langage et d’un cadre différents.

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

5
Tamara Wijsman

Je dirais que Ruby est lent parce que nous n’avons pas déployé beaucoup d’efforts pour rendre l’interprète plus rapide. La même chose s'applique à Python. Smalltalk est aussi dynamique que Ruby ou Python, mais il est plus performant d’une magnitude supérieure, voir http://benchmarksgame.alioth.debian.org . Depuis que 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é et Smalltalk est toujours beaucoup plus rapide que Ruby et Python. Les personnes de Xerox Parc et de OTI/IBM avaient l’argent nécessaire pour payer les personnes qui s’emploient à rendre Smalltalk plus rapide. Ce que je ne comprends pas, c’est pourquoi Google ne dépense pas l’argent nécessaire pour rendre Python plus rapide car il s’agit d’un grand magasin Python. Au lieu de cela, ils dépensent de l'argent pour le développement de langues comme Go ...

3
OlliP

Évidemment, parler de vitesse Ruby perd. Même si des tests comparatifs suggèrent que Ruby n'est pas tellement plus lent que PHP. Mais en retour, vous obtenez un code facile à gérer DRY, le meilleur de tous les frameworks dans différentes langues.

Pour un petit projet, vous ne ressentirez aucune lenteur (je veux dire moins de <50 000 utilisateurs), étant donné qu'aucun calcul complexe n'est utilisé dans le code, mais uniquement dans les tâches courantes.

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

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

2
Rápli András

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

ARCHITECTURE

Ceci est plus facile à faire dans Rails que dans la plupart des autres cadres 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 (car le goulot d'étranglement se trouve généralement sur l'accès "Base de données" la plupart des applications Web).

Rails rend très facile et naturel la résolution de ces problèmes. Il existe plusieurs abstractions pour la mise en cache de données, pages et fragments , et il existe également de très belles abstractions permettant de traiter la partie SQL de manière optimisée et réutilisable ( Active Record et - AREL ).

C'est la raison pour laquelle de nombreuses applications écrites dans des langages plus rapides et moins expressifs (comme php) finissent par être plus lentes que leurs homologues Ruby. Ce 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 la 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 Herok ou Engine Yard . En tous cas. Le déploiement de Rails avec un équilibrage de charge n'est probablement pas très difficile à faire.

2
Pedro Morte Rolo

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 muet et les boucles inutiles. Je suis administrateur de base de données et vois beaucoup de ces boucles inutiles, les laisse tomber, utilise un meilleur code et des requêtes, et l'application est plus rapide, beaucoup plus rapide. Vous vous souciez de la dernière microseconde? Vous pouvez avoir des langues optimisées pour la vitesse, d’autres font simplement le travail qu’elles doivent faire et peuvent être gérées par de nombreux programmeurs.

C'est juste un choix.

2
Frank Heikens

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 cela suffit pour que certaines personnes disent que "Ruby is Slow" est sans qualification. Ils ne comptent pas le fait qu'il est beaucoup plus facile et plus sûr d'écrire du code Ruby que le 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 haut niveau.

1
Donal Fellows

Les gens disent que Ruby est lent parce qu'ils comparent les programmes Ruby aux programmes écrits dans d'autres langues. Les programmes que vous écrivez n'ont peut-être pas besoin d'être plus rapides. Peut-être que pour les programmes que vous écrivez Ruby _ n'est pas le goulot d'étranglement qui ralentit les choses.

Ruby 2.1 comparé à Javascript V8

Ruby 2.1 comparé à Lua ordinaire

Ruby 2.1 comparé à Python

0
igouy

Les performances reposent presque toujours sur une bonne conception et des interactions optimisées avec les bases de données. Ruby fait très rapidement ce dont la plupart des sites Web ont besoin, en particulier les versions les plus récentes; De plus, la rapidité de développement et la facilité de maintenance génèrent des coûts importants et permettent de satisfaire les clients. Je trouve que Java a des performances d’exécution lentes pour certaines tâches. Etant donné les difficultés de développement en Java, de nombreux développeurs créent des applications lentes, quelle que soit la vitesse théorique telle que 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 ne convient pas aux capacités de ma base de données, je choisis C ou Objective-C ou un autre langage compilé réellement très performant pour ces tâches, en fonction de la plate-forme. Si j'ai besoin de créer une application Web à base de données, j'utilise RoR ou parfois C # ASP.NET en fonction d'autres exigences. parce que toutes les plates-formes ont des forces et des faiblesses. La rapidité d'exécution des tâches effectuées par votre application est importante, mais après tout, si la performance d'exécution d'un aspect restreint d'une langue est tout ce qui compte; alors je pourrais toujours utiliser le langage Assembler pour tout.

0
Richard