Perché Python è più lento di Java ma più veloce di PHP [chiuso]

18

Ho visto molte volte vari benchmark che mostrano come un gruppo di lingue si esibisce su un determinato compito.

Questi benchmark rivelano sempre che Python è più lento di Java e più veloce di PHP e mi chiedo perché sia così.

  • Java, Python e PHP vengono eseguiti all'interno di una macchina virtuale
  • Tutte e tre le lingue convertono i loro programmi nei loro codici byte personalizzati che eseguono in primo piano del sistema operativo, quindi nessuno esegue nativamente
  • Sia Java che Python possono essere "compilati" ( .pyc per Python) ma il modulo __main__ per Python non è compilato

Python e PHP sono tipizzati dinamicamente, e Java staticamente - è questa la ragione per cui Java è più veloce, e in tal caso, spiegaci come influisce sulla velocità.

E, anche se l'argomento dynamic-vs-static è corretto, questo non spiega perché PHP sia più lento di Python - perché entrambi sono linguaggi dinamici.

Puoi vedere alcuni benchmark qui e qui e qui

    
posta treecoder 03.05.2012 - 15:45
fonte

5 risposte

25

Il codice JVM può essere compilato JIT in modo efficiente, utilizzando un compilatore ad hoc banale (e veloce). Ma lo stesso sarebbe eccezionalmente difficile per PHP e Python, a causa della loro natura tipizzata dinamicamente. JVM si traduce in un livello piuttosto basso e in un codice nativo semplice, abbastanza simile a quello che produrrebbe un compilatore C ++, ma per le lingue dinamiche si dovrebbe generare un dispatch dinamico per letteralmente tutte le operazioni di base e per tutte le chiamate di metodo. Questa spedizione dinamica è il collo di bottiglia principale per tutte le lingue di questo tipo.

In alcuni casi è possibile eliminare il dispatch dinamico (così come le chiamate virtuali in Java) usando un compilatore JIT di tracciamento molto più complicato. Questo approccio è ancora agli inizi, non facendo troppa interpretazione astratta, e un simile compilatore rischia di soffocare su eval chiamate (che sono molto tipiche per le lingue dinamiche).

Per quanto riguarda la differenza tra Python e PHP, quest'ultima è di qualità molto inferiore. Potrebbe essere più veloce in teoria, ma non lo farà mai.

    
risposta data 03.05.2012 - 15:55
fonte
21

C'è un problema generale con questa domanda in quanto è troppo assoluto. Non ha molto senso dire "la lingua X è più veloce della lingua Y". Un linguaggio informatico di per sé non è "veloce" o "lento" perché è semplicemente un modo di esprimere un algoritmo. La domanda effettiva dovrebbe essere qualcosa nell'ordine di "perché l'implementazione X1 della lingua X è più veloce dell'implementazione Y1 della lingua Y per questo particolare dominio del problema?"

Alcune differenze di velocità stanno sicuramente andando fuori dal linguaggio in quanto alcune lingue sono più facili da implementare in determinati domini rispetto ad altre. Ma molto di ciò che rende un'implementazione veloce non è la lingua. Ad esempio, non si può veramente dire "Python è più lento di Java" senza considerare se si sta parlando di CPython, IronPython o PyPy. Ciò è particolarmente vero per le lingue che utilizzano una VM poiché la velocità sarà influenzata direttamente dalla qualità della VM.

Per inciso, lavoro con un sistema che per vari motivi non può utilizzare JIT sul nostro dispositivo con una VM JavaScript molto popolare che normalmente la supporta. Ciò significa che il nostro JavaScript funziona molto più lentamente di quanto farebbe su un PC con un processore simile. Quel cambiamento, che non è direttamente correlato al linguaggio stesso, porta JavaScript ad essere "poche volte più lento del C ++" ad essere "ordini di grandezza più lenti del C ++" per le attività che ci interessano.

Considerare anche che le lingue differiscono nelle caratteristiche delle prestazioni in modi che non sono direttamente confrontabili. Troppi parametri di riferimento convertono semplicemente un programma dalla lingua A alla lingua B e non tengono conto del fatto che le lingue differiscono per quanto riguarda le caratteristiche rapide. (Puoi vedere questo in qualsiasi ragionevole confronto comparativo come quelli a cui ti colleghi perché spesso hanno note come "grazie a Tizio per avermi mostrato come implementarlo in linguaggio Foo.)

Ad esempio, prendi questo codice Java:

for(int i=0;i<10;i++) {
    Object o = new Object;
    doSomething(o);
}

Sarebbe tentato di "riscrivere" questo in C ++ e confrontare i tempi di esecuzione:

for(int i=0;i<10;i++) {
    Object *o = new Object;
    doSomething(o);
    delete(o);
}

Il fatto è che qualsiasi programmatore C ++ competente lo vedrà immediatamente in C ++, questo non è il modo più veloce per fare qualcosa. Puoi facilmente velocizzare le cose cambiandole per essere più appropriate al C ++:

for(int i=0;i<10;i++) {
    Object o;
    doSomething(&o);
}

Il punto non è che C ++ può essere veloce, ma piuttosto che scrivere benchmark per confrontare le lingue è davvero, davvero difficile. Per farlo in modo appropriato, devi essere un esperto in entrambe le lingue e scrivere da zero in entrambe le lingue. Anche allora, puoi facilmente imbatterti in aree in cui una lingua eccelle in un particolare compito. Ad esempio, posso scrivere una versione di Towers of Hanoi in C ++ che verrà eseguita più velocemente di Java su qualsiasi compilatore ragionevole. Posso farlo essenzialmente imbrogli, usando i modelli C ++, valutati al momento della compilazione (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

Il punto non è che potrei dire che "C ++ è più veloce di Java" perché il mio programma è tornato istantaneamente mentre la versione di Java funzionava per minuti (e spero che nessuno abbia notato che il mio programma ha impiegato mezz'ora per costruire.) Il punto è che per questo caso molto ristretto, il C ++ è più veloce. Per altri casi stretti potrebbe essere il contrario. Quindi non è "C ++ è più veloce", è "C ++ è più veloce nei casi in cui è possibile valutare l'espressione al momento della compilazione utilizzando i modelli." Meno soddisfacente, ma vero.

Le differenze di velocità nelle lingue riguardano principalmente l'implementazione. Le lingue compilate saranno più veloci delle lingue interpretate. La compilazione in codice nativo sarà più veloce della compilazione in codice byte. Ciò avrà molto più effetto delle domande come se il linguaggio sia tipizzato staticamente o meno. E, naturalmente, le buone implementazioni saranno più veloci di quelle cattive.

E non dimenticare che i bravi programmatori produrranno un codice più veloce rispetto ai programmatori malintenzionati, spesso in una misura che supera di gran lunga le differenze linguistiche.

    
risposta data 05.05.2012 - 00:46
fonte
6

Ha a che fare con la qualità del compilatore, il compilatore di java è stato continuamente ottimizzato per molto più tempo, e l'ottimizzazione è più importante perché tutto il codice è compilato per Java. Non sono sicuro che Python sia il motivo esatto per essere più veloce di PHP, ma lo scommetterei a causa dell'influenza di Google su Python.

    
risposta data 03.05.2012 - 15:54
fonte
4

Perché Java è il più veloce:

Scritta staticamente + JIT compilazione + - flag del server per ricompilare in modo aggressivo il codice in esecuzione.

Perché Python è più veloce di PHP:

Python potrebbe essere un linguaggio dinamico, ma è ancora strongmente digitato. Ciò significa che le strutture codificate sono in grado di ottimizzare il runtime.

Perché PHP fa schifo:

In pratica è javascript sul server (nessun supporto per il multithreading, totalmente dinamico, tipicamente bloc- cato).

In sostanza, più il compilatore conosce il tuo codice, più può ottimizzare. Java è completamente ottimizzabile prima dell'esecuzione e mentre è in esecuzione. Python è ottimizzabile mentre è in esecuzione, e PHP è, beh, terribile. Facebook traspone il loro PHP in C prima che arrivi sul server.
link

    
risposta data 16.11.2012 - 04:25
fonte
1

I parametri di riferimento sono piuttosto distorti a favore di una programmazione matematica pesante.

Non sorprende che Python sia abbastanza bravo in matematica complessa se si considera dove e perché è stato scritto per la prima volta .

PHP, d'altra parte, è stato scritto per servire le pagine web, può fare altre cose, ma le pagine Web sono le migliori e sono alla pari o migliore di Java in questa attività.

    
risposta data 16.11.2012 - 05:01
fonte

Leggi altre domande sui tag