Perché la gente dice che Ruby è lento? [chiuso]


184

Mi piace Ruby on Rails e lo uso per tutti i miei progetti di sviluppo web. Qualche anno fa si parlava molto del fatto che Rails fosse un porco di memoria e di come non si ridimensionasse molto bene, ma questi suggerimenti sono stati messi a punto da Gregg Pollack qui .

Ultimamente, però, ho sentito persone dire che lo stesso Ruby è lento.

  • Perché Ruby è considerato lento?

Non trovo che Ruby sia lento ma, di nuovo, lo sto solo usando per creare semplici app CRUD e blog aziendali. Che tipo di progetti dovrei fare prima di scoprire che Ruby sta diventando lento? O questa lentezza è solo qualcosa che influenza tutti i linguaggi di programmazione?

  • Quali sono le tue opzioni come programmatore di Ruby se vuoi affrontare questa "lentezza"?

  • Quale versione di Ruby si adatterebbe meglio ad un'applicazione come Stack Overflow in cui la velocità è critica e il traffico è intenso?

Le domande sono soggettive e mi rendo conto che l'installazione architettonica (server EC2 vs server autonomi ecc.) Fa una grande differenza, ma mi piacerebbe sapere cosa pensa la gente del fatto che Ruby sia lento.

Infine, non riesco a trovare molte notizie su Ruby 2.0 - suppongo che ci vorranno ancora alcuni anni?


1
possibile duplicato di Cosa rende lento Ruby?
Nakilon,


a parte grandi risposte, nessuno di loro risponde davvero PERCHÉ. approfondimenti migliori sono nella domanda correlata menzionata da Nakilon
Andre Figueiredo,

Risposte:


184

Perché Ruby è considerato lento?

Perché se si eseguono benchmark tipici tra Ruby e altre lingue, Ruby perde.

Non trovo che Ruby sia lento ma, di nuovo, lo sto solo usando per creare semplici app CRUD e blog aziendali. Che tipo di progetti dovrei fare prima di scoprire che Ruby sta diventando lento? O questa lentezza è solo qualcosa che influenza tutti i linguaggi di programmazione?

Ruby probabilmente non ti servirebbe bene a scrivere un'applicazione di elaborazione del segnale digitale in tempo reale o qualsiasi tipo di sistema di controllo in tempo reale. Ruby (con le VM di oggi) probabilmente soffocerebbe su un computer con risorse limitate come gli smartphone.

Ricorda che gran parte dell'elaborazione sulle tue applicazioni web viene effettivamente eseguita da software sviluppato in C. es. Apache, Thin, Nginx, SQLite, MySQL, PostgreSQL, molte librerie di analisi, RMagick, TCP / IP, ecc. Sono programmi C utilizzati da Ruby . Ruby fornisce la colla e la logica aziendale.

Quali sono le tue opzioni come programmatore di Ruby se vuoi affrontare questa "lentezza"?

Passa a una lingua più veloce. Ma questo comporta un costo. È un costo che può valerne la pena. Ma per la maggior parte delle applicazioni web, la scelta della lingua non è un fattore rilevante perché non c'è abbastanza traffico che giustifica l'uso di una lingua più veloce che costa molto di più per lo sviluppo.

Quale versione di Ruby si adatterebbe meglio ad un'applicazione come Stack Overflow in cui la velocità è critica e il traffico è intenso?

Altre persone hanno risposto a questo: JRuby, IronRuby, REE renderanno la parte Ruby della tua applicazione più veloce su piattaforme che possono permettersi le VM. E poiché spesso non è Ruby a causare lentezza, ma l'architettura del sistema del computer e l'architettura delle applicazioni, puoi fare cose come la replica di database, più server di applicazioni, bilanciamento del carico con proxy inversi, cache HTTP, memcache, Ajax, cache sul lato client, ecc. Nessuna di queste cose è Ruby.

Infine, non riesco a trovare molte notizie su Ruby 2.0 - suppongo che ci vorranno ancora alcuni anni?

Molte persone stanno aspettando Ruby 1.9.1. Io stesso aspetto Rails 3.1 su Ruby 1.9.1 su JRuby.

Infine, tieni presente che molti sviluppatori scelgono Ruby perché rende la programmazione un'esperienza più gioiosa rispetto ad altre lingue e perché Ruby con Rails consente agli sviluppatori web esperti di sviluppare applicazioni molto rapidamente.


3
dopo molte considerazioni, ho deciso che questa è la risposta migliore. Grazie, mi piace l'analogia sull'app di elaborazione del segnale. È più facile vedere di cosa parlano le persone dopo tutte queste risposte utili.
stephenmurdoch,

1
Sì, eri a un paio di anni da ruby ​​2, Ruby 2.0.0 rilasciato il 24 febbraio 2013
Morgan

3
La mia esperienza nell'uso di Ruby 2.1 è che è circa il 25% più veloce della stessa app in esecuzione in Ruby 2.0
Matt Connolly,

14
Le lingue non sono lente o veloci, le loro implementazioni, interpreti e compilatori sono
:)

122

Prima di tutto, più lento rispetto a cosa ? C? Pitone? Prendiamo alcuni numeri nel gioco dei benchmark dei linguaggi informatici :

Perché Ruby è considerato lento?

Dipende a chi lo chiedi. Si potrebbe dire che:

  • Ruby è un linguaggio interpretato e le lingue interpretate tenderanno ad essere più lente di quelle compilate
  • Ruby usa la garbage collection (sebbene C #, che usa anche la garbage collection, esce due ordini di grandezza davanti a Ruby, Python, PHP ecc. Nei benchmark più algoritmici, meno intensi per l'allocazione della memoria sopra)
  • Le chiamate al metodo Ruby sono lente (anche se, a causa della tipizzazione duck, sono probabilmente più veloci che nei linguaggi interpretati fortemente tipizzati)
  • Ruby (ad eccezione di JRuby) non supporta il vero multithreading
  • eccetera.

Ma, di nuovo, lento rispetto a cosa? Ruby 1.9 è più veloce di Python e PHP (con un fattore di prestazione 3x) rispetto a C (che può essere fino a 300x più veloce), quindi quanto sopra (ad eccezione delle considerazioni sul threading, se la tua applicazione dipendesse fortemente da questo aspetto ) sono in gran parte accademici.

Quali sono le tue opzioni come programmatore di Ruby se vuoi affrontare questa "lentezza"?

Scrivi per la scalabilità e lancia più hardware (ad es. Memoria)

Quale versione di Ruby si adatterebbe meglio ad un'applicazione come Stack Overflow in cui la velocità è critica e il traffico è intenso?

Bene, REE (combinato con Passenger ) sarebbe un ottimo candidato.


1
La raccolta dei rifiuti in sé non è necessariamente lenta, ma lo è la raccolta dei rifiuti della risonanza magnetica. Se hai bisogno di Ruby più veloce, puoi anche guardare JRuby e REE.
Andreas,

1
@igouy, True, la metà del 2008 potrebbe essere stata estrema. Ho aggiornato i collegamenti, ma a loro volta diventeranno obsoleti in pochi mesi. :) In entrambi i casi, l'hardware e alcuni livelli di patch potrebbero essere stati diversi e sono stati aggiunti alcuni test aggiuntivi, ma il quadro generale delle cose non è cambiato.
vladr,

11
>> nello stesso ordine di grandezza << È nello stesso ordine di grandezza se vivi a 7 o vivi a 69. Questa differenza è insignificante?
igouy,

10
@igouy, non ti conosco, ma non sono un programma per misurare la mia durata in termini di velocità di esecuzione. Dove mi interessa la velocità di esecuzione, ad esempio, è il tempo di rendering della risposta HTTP. So che non noterò la differenza tra il tempo di rendering di 7ms e 69ms (specialmente quando si guida su una latenza di rete di 130ms). So che noterò la differenza tra 7ms e 700ms e certamente noterò una differenza tra 7ms e 7s - ma no, non tra 7ms e 69ms.
Vladr,

3
@vladr, che dire dei 70ms o 700ms? Riesci a notare quella differenza?
Paul Draper,

60

Ecco cosa ha da dire il creatore di Rails, David Heinemeier Hansson :

Rails [Ruby] è per la stragrande maggioranza delle applicazioni web Fast Enough. Abbiamo siti che effettuano milioni di visualizzazioni di pagina dinamiche al giorno. Se finisci per essere con la prima pagina di Yahoo o Amazon, è improbabile che un framework off-the-shelve in QUALSIASI lingua ti farà molto bene. Probabilmente dovrai farlo da solo. Ma certo, vorrei anche cicli di CPU gratuiti. Mi interessa solo molto di più sui cicli di sviluppo gratuiti e sono disposto a scambiare il primo con il secondo.

cioè lanciare più hardware o macchine al problema è più economico che assumere più sviluppatori e usare un linguaggio più veloce, ma più difficile da mantenere. Dopotutto, poche persone scrivono applicazioni web in C.

Ruby 1.9 è un grande miglioramento rispetto a 1.8. I maggiori problemi con Ruby 1.8 sono la sua natura interpretata (nessun bytecode, nessuna compilation) e che le chiamate di metodo, una delle operazioni più comuni in Ruby, sono particolarmente lente.

Non aiuta che praticamente tutto sia una ricerca del metodo in Ruby: aggiungere due numeri, indicizzare un array. Laddove altre lingue espongono hack ( __add__metodo di Python , overload di Perl. Pm) Ruby fa OO puro in tutti i casi, e questo può danneggiare le prestazioni se il compilatore / interprete non è abbastanza intelligente.

Se stavo scrivendo una popolare applicazione Web in Ruby, il mio focus sarebbe sulla cache. La memorizzazione nella cache di una pagina riduce a zero il tempo di elaborazione per quella pagina, qualunque sia la lingua in uso. Per le applicazioni Web, l'overhead del database e altri I / O iniziano ad avere molta più importanza della velocità della lingua, quindi mi concentrerei sull'ottimizzazione.


7
"Dopotutto, poche persone scrivono applicazioni web in C." - Certo che no, ma molti siti Web critici per le prestazioni si sono spostati, ad esempio, in Scala.
Dario,

6
Non sono d'accordo sul fatto che "lanciare più hardware" è più economico. È difficile convincere i clienti che dovrebbero pagare più soldi per l'hosting ogni X mesi perché la loro piattaforma è stata progettata pensando agli sviluppatori.
Kevin,

9
@Keven: sicuramente i costi di sviluppo sarebbero ridotti? Altrimenti quale sarebbe lo scopo di utilizzare Ruby in primo luogo?
rjh,

4
@Kevin Questa affermazione è un po 'ampia. Se avessi bisogno di configurare un nuovo server per ogni aumento del traffico del 10% circa con circa 100 visite al giorno, il cliente avrebbe chiaramente il diritto di lamentarsi. Realisticamente, però, di solito è necessario disporre di molto più traffico per iniziare e aumentarlo di un ordine di grandezza, prima che il vecchio hardware non possa più farcela. A quel punto l'argomento passa al territorio "un buon problema da avere" e quasi nessuno si lamenterebbe dell'aggiornamento dell'hardware. Inoltre, nessun "cliente" gestisce un sito Web ad alto traffico senza essere a conoscenza di questo tipo di cose.
Inganno

5
@Kevin - rovesciamolo. "È difficile convincere i clienti che dovrebbero aspettare 3 mesi per una nuova funzionalità perché la loro piattaforma è stata progettata pensando ai computer". Se quella nuova funzionalità aumentasse drasticamente le entrate, pagherà per l'hardware aggiuntivo. Inoltre, scegliere una lingua veloce fin dall'inizio è, per molte applicazioni, un'ottimizzazione prematura. È probabile che il tuo collo di bottiglia sia altrove: letture del database, latenza della rete, ecc.
Nathan Long,

34

La scrittura del codice è lenta. La lettura del codice è lenta. Trovare e correggere i bug è lento. L'aggiunta di funzionalità e miglioramenti è lenta. Tutto ciò che migliora sul precedente è una vittoria. Molto raramente le prestazioni di esecuzione sono un problema.


30
@GregS: le prestazioni di esecuzione sono sempre un problema se incidono sull'usabilità. È vero, la scansione di un file XML per una stringa in uno o tre secondi non ha importanza dal punto di vista dei numeri puri, ma una differenza di un paio di secondi può fare una grande differenza nell'usabilità quando si parla di un'applicazione rivolta all'utente.
Bryan Oakley,

5
@Ajax: No, scommetto che è la tua personalità vincente.
presidente James K. Polk

15
Finora il mio record è quello di salvare un'azienda $ 30.000 / anno in un giorno di lavoro. I loro ingegneri hanno deciso che era più leggibile che un algoritmo di cloud computing conteggiasse il numero di attività eseguite su ogni iterazione, causando n! interrogazioni su lavori con oltre 20.000 unità di lavoro. Modificandolo per verificare se un oggetto di lavoro fosse rimasto, lo ha lasciato cadere su n query e tagliato il conto da $ 130 al giorno a $ 20 al giorno. I programmatori pigri mi fanno soldi. Si prega di incoraggiare programmatori più pigri.
Ajax,

10
È divertente commentare proprio ora ... Sono passato a un'altra società, dove abbiamo appena dovuto estrarre quindici sviluppatori dalle funzionalità e dalle prestazioni poiché una grande banca americana rifiuta di firmare un contratto da molti milioni di dollari fino a quando il sistema può gestire il loro carico. A loro piacciono le caratteristiche che abbiamo, ma non la velocità con cui si esibiscono. Se ignori le prestazioni abbastanza a lungo, non importa quali funzionalità hai perché saranno insolitamente lente .
Ajax

4
Le prestazioni di esecuzione sono sempre un problema, di quanto stiamo parlando. Quanto codice interpretato puoi eseguire su un telefono cellulare prima che gli utenti smettano di acquistare la tua app perché si scarica le batterie? Per quanto tempo un utente attende il caricamento della tua pagina prima di chiudere l'annuncio privandoti delle entrate pubblicitarie? Rispondi a questi tipi di domande e tu quanto conta l'esecuzione delle prestazioni.
Sqeaky

15

La risposta è semplice: la gente dice che il rubino è lento perché è lento sulla base di confronti misurati con altre lingue. Tieni presente, tuttavia, che "lento" è relativo. Spesso, il rubino e altre lingue "lente" sono abbastanza veloci.


sì, è quello che stavo pensando, voglio dire, la gente dice che è lento, ma è ancora dannatamente veloce per le mie esigenze ...
Stephenmurdoch,

11
>> è ancora dannatamente veloce per le mie esigenze << È abbastanza veloce per tutto ciò che non ha bisogno di essere veloce :-)
igouy

Sono parzialmente incline su questo, forse perché questo è un commento obsoleto. ora abbiamo ruby ​​2.3 e dall'esperienza di ruby ​​2.2 ho scoperto che lo stack delle rotaie è pesante. se uno ha bisogno di un framework più veloce, prova pidrano, è basato su sinatra e hanno provato a fare il più vicino possibile al comando delle rotaie, ma molto più leggero. ma non hanno ancora raggiunto la versione 1.0, ancora di più a venire, ma dal mio test, funziona bene e veloce. Ho lavorato con il disco attivo 5 e pignoni pidrano, presi in prestito dalle rotaie. Con 200 connessioni simultanee, sto ottenendo una risposta di 1,5 secondi senza query db, con risorse dai pignoni
James Tan

5

Joel on Software - Ruby Performance Revisited lo spiega abbastanza bene. Potrebbe essere obsoleto però ...

Consiglierei di attenersi a ciò come sei abituato a Ruby on Rails,
se mai dovessi incontrare un problema di prestazioni potresti riconsiderare l'uso di una lingua e un framework diversi.

In tal caso, suggerirei davvero C # con ASP.NET MVC 2 , funziona molto bene con le app CRUD.


Grazie per il link, mi piace sempre leggere le parole di Joel sulle cose. Interessante osservazione che egli fa sullo "slogan dell'adesivo per paraurti" di DHH ...
stephenmurdoch,

Citazione: " Questo non si applica a tutti, ma quando le persone affermano di avere problemi di prestazioni con Ruby o che devono solo essere in grado di eseguire il codice più velocemente di quanto il motore del linguaggio Ruby di base possa eseguirlo, non aiuta Ruby sostiene di cantare inni sui cicli degli sviluppatori rispetto ai cicli della CPU. "Ben detto.
Marc.2377,

3

Direi che Ruby è lento perché non sono stati fatti molti sforzi per rendere più veloce l'interprete. Lo stesso vale per Python. Smalltalk è dinamico come Ruby o Python ma offre prestazioni migliori in termini di grandezza, vedi http://benchmarksgame.alioth.debian.org . Poiché Smalltalk è stato più o meno sostituito da Java e C # (almeno 10 anni fa) non è stato fatto più alcun lavoro di ottimizzazione delle prestazioni e Smalltalk è ancora molto più veloce di Ruby e Python. Le persone di Xerox Parc e OTI / IBM avevano i soldi per pagare le persone che lavorano per rendere Smalltalk più veloce. Quello che non capisco è perché Google non spende i soldi per rendere Python più veloce in quanto sono un grande negozio Python. Invece spendono soldi per lo sviluppo di lingue come Go ...


Penso che sia perché Python ha già il suo posto ed è ampiamente utilizzato al giorno d'oggi. Se hai bisogno di prestazioni elevate ci sono molte librerie che puoi usare o tessere e altre cose che puoi usare.
Zelphir Kaltstahl,

Da quanto ho letto, alcuni sforzi hanno già prodotto buoni risultati in Ruby 2.5.
Marc.2377,

2

Prima di tutto, ti interessa cosa dicono gli altri della lingua che ti piace? Quando fa il lavoro che deve fare, stai bene.

OO non è il modo più veloce per eseguire il codice, ma aiuta a creare il codice. Lo smart code è sempre più veloce del codice stupido e dei loop inutili. Sono un DBA e vedo molti di questi loop inutili, li trascino, uso codice e query migliori e l'applicazione è sempre più veloce. Ti interessa l'ultimo microsecondo? Potresti avere lingue ottimizzate per la velocità, altre semplicemente fanno il lavoro che devono fare e possono essere gestite da molti programmatori diversi.

È solo una scelta.


2

Ovviamente, parlando di velocità che Ruby perde. Anche se i test di benchmark suggeriscono che Ruby non è molto più lento di PHP. Ma in cambio stai ottenendo un codice DRY di facile manutenzione, il migliore tra tutti i framework in varie lingue.

Per un piccolo progetto, non avvertirai alcuna lentezza (intendo fino a quando <50.000 utenti) dato che nel codice non vengono utilizzati calcoli complessi, ma solo roba tradizionale.

Per un progetto più grande, pagare per le risorse paga ed è più economico dei salari degli sviluppatori. Inoltre, scrivere codice su RoR risulta essere molto più veloce di qualsiasi altro.

Nel 2014 questa grandezza della differenza di velocità di cui stai parlando è insignificante per la maggior parte dei siti web.


2

Il modo di gestire le prestazioni di Ruby nell'applicazione Web è lo stesso di qualsiasi altro linguaggio di programmazione:

ARCHITETTURA

Questo è più facile da fare in Rails che nella maggior parte degli altri Web Frame.

A livello di applicazione , memorizzando nella cache tutto ciò che si suppone debba essere memorizzato nella cache e gestendo l'accesso al DB in modo intelligente (poiché il collo di bottiglia si trova generalmente sull'accesso "DB" per la maggior parte delle app WEB).

Rails rende molto facile e naturale risolvere questi problemi. Esistono diverse astrazioni per la memorizzazione nella cache di dati, pagine e frammenti e ci sono anche astrazioni molto belle per gestire la parte SQL in modo ottimizzato e riutilizzabile ( Active Record e AREL ).

Questo è il motivo per cui così tante applicazioni scritte in linguaggi più rapidi e non così espressivi (come php) finiscono per essere più lente delle controparti Ruby. Non è così semplice ed elegante affrontare la memorizzazione nella cache e l'interrogazione con queste lingue di quanto non lo sia con Ruby.

A livello di infrastruttura è ragionevole pensare al bilanciamento del carico e a tutte quelle cose che non mi capitano di conoscere molto. Avrei esternalizzato quel problema assumendo una piattaforma come fornitore di servizi, come Heroku o Engine Yard . Comunque. La distribuzione di binari con bilanciamento del carico non è probabilmente molto difficile.


1

Ruby è più lento del C ++ in una serie di attività facilmente misurabili (ad esempio, fare codice che dipende fortemente dal virgola mobile). Questo non è molto sorprendente, ma una giustificazione sufficiente per alcune persone per dire che "Ruby è lento" senza qualifiche. Non contano il fatto che sia molto più semplice e sicuro scrivere il codice Ruby rispetto al C ++.

La soluzione migliore è utilizzare moduli mirati scritti in un'altra lingua (ad esempio, C, C ++, Fortran) nel tuo codice Ruby. Quelli possono fare il duro lavoro e i tuoi script possono concentrarsi su problemi di coordinamento di livello superiore.


I confronti sono spesso fatti con Java, C #, Python, forse Perl piuttosto che C ++.
rjh,

5
Ovviamente. Ma posso assicurarti (come sviluppatore di Tcl) che le persone ti confronteranno sempre ingiustamente con altre lingue. La correzione consiste nell'utilizzare quelle altre lingue per i componenti che vengono uniti; fare tutto in una lingua è un po 'come usare un solo strumento per tutte le attività. Se tutto ciò che hai è un martello, tutto sembra un pollice.
Donal Fellows il

bella idea sull'uso dei moduli in lingua straniera quando sono necessari
stephenmurdoch,

>> per dire che "Ruby è lento" senza qualifiche << Un paio di anni fa avrebbero potuto continuare a mostrare programmi Ruby più lenti dei programmi Tcl :-)
igouy

1
Sai cosa dicono di Lies, Damned Lies e Benchmarks. ;-)
Donal Fellows il

0

Le prestazioni riguardano quasi sempre una buona progettazione e interazioni ottimizzate con il database. Ruby fa ciò di cui la maggior parte dei siti Web ha bisogno abbastanza velocemente, specialmente le versioni più recenti; e la velocità di sviluppo e la facilità di manutenzione offrono un grande vantaggio in termini di costi e di soddisfazione dei clienti. Trovo che JAVA abbia prestazioni di esecuzione lente per alcune attività e, data la difficoltà di sviluppo in JAVA, molti sviluppatori creano applicazioni lente indipendentemente dalla capacità di velocità teorica, come dimostrato nei benchmark (i benchmark sono generalmente concepiti per mostrare una capacità specifica e ristretta). Quando ho bisogno di un'elaborazione intensiva non adatta alle capacità del mio database, scelgo C o Objective-C o qualche altro linguaggio compilato ad alte prestazioni per quelle attività a seconda della piattaforma. Se devo creare un'applicazione Web basata su database, Uso RoR o talvolta C # ASP.NET a seconda di altri requisiti; perché tutte le piattaforme hanno punti di forza e di debolezza. La velocità di esecuzione delle cose che la tua applicazione fa è importante, ma dopo tutto, ciò che conta è l'esecuzione di un aspetto ristretto di una lingua; allora potrei ancora usare il linguaggio Assembler per tutto.



-5

Ruby si comporta bene per la produttività degli sviluppatori. Il rubino per natura forza lo sviluppo guidato dai test a causa della mancanza di tipi. Ruby funziona bene se usato come wrapper di alto livello per librerie C. Ruby si comporta bene anche durante i processi a esecuzione prolungata quando viene compilato JIT nel codice macchina tramite JVM o Rbx VM. Il rubino non funziona bene quando è necessario sbriciolare i numeri in breve tempo con un codice rubino puro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.