2009-09-10 10 views
25

Questo è qualcosa che mi sono sempre chiesto: perché PHP è più lento di Java o C#, se tutti e tre questi linguaggi vengono compilati in bytecode e poi eseguiti da lì? So che normalmente PHP ricompila ogni file con ogni richiesta, ma anche quando si porta l'APC (una cache bytecode) nell'immagine, le prestazioni non sono affatto vicine a quelle di Java o C# (sebbene l'APC lo migliori notevolmente).Cosa rende PHP più lento di Java o C#?

Modifica: Non sto nemmeno parlando di queste lingue sul livello web. Sto parlando del confronto di questi quando si tratta di numeri che scricchiolano. Nemmeno incluso il tempo di avvio o qualcosa del genere.

Inoltre, non sto prendendo una sorta di decisione basata sulle risposte qui. PHP è il mio linguaggio di scelta; Ero semplicemente curioso del suo design.

+1

Questo si sta avvicinando al territorio delle fiamme. Meglio contrassegnarlo come soggettivo – mcjabberz

+1

dovrebbe essere wiki della comunità – SilentGhost

+6

Questa è una grande domanda, e sicuramente non soggettiva o polemica. Merita più credito IMO. –

risposta

38

Una ragione è la mancanza di un compilatore JIT in PHP, come altri hanno menzionato.

Un'altra grande ragione è la digitazione dinamica di PHP. Un linguaggio tipizzato dinamicamente sarà sempre più lento di un linguaggio tipizzato staticamente, poiché i tipi di variabili vengono controllati in fase di esecuzione anziché in fase di compilazione. Di conseguenza, i linguaggi tipizzati in modo statico come C# e Java saranno notevolmente più veloci in fase di esecuzione, anche se in genere devono essere compilati in anticipo. Un compilatore JIT rende questo meno un problema per le lingue digitate dinamicamente, ma ahimè, PHP non ha un built-in (anche se vedi Facebook HHVM per un esempio di JIT di terze parti per PHP).

+0

+1 per menzionare la digitazione dinamica. Buon punto! – mcjabberz

+0

Sono sorpreso che questo non sia stato menzionato prima! IMO questo è un problema di prestazioni più grande rispetto al non avere un compilatore JIT, anche se penso che dipenda da molti fattori. –

+0

La digitazione dinamica rende sicuramente più interessante la compilazione JIT e le ottimizzazioni generali del runtime! – mcjabberz

2

Un'ipotesi può essere che JAVA dipenda da un qualche tipo di server "applicativo", mentre PHP non lo fa - il che significa che un nuovo ambiente deve essere creato ogni volta che viene chiamata una pagina PHP.

(Questo era particolarmente vero quando il PHP è stato/è utilizzato come CGI, e non come un modulo di Apache o tramite FastCGI)


Un'altra idea potrebbe essere che il C# e compilatori Java può fare un po 'pesante ottimizzazioni in fase di compilazione - dall'altra parte, quando gli script PHP sono compilati (almeno, se non si "imbrogliano" con una cache opcode) ogni volta che viene chiamata una pagina, la fase di compilazione deve essere molto veloce ; il che significa che non è possibile dedicare molto tempo all'ottimizzazione.


Ancora: Ogni versione di PHP generalmente ha un miglioramento delle prestazioni; ad esempio, puoi passare dal 15% al ​​25% della CPU, passando da PHP 5.2 a 5.3.

Per esempio, dare un'occhiata a quei punti di riferimento:


Una cosa importante, anche, è che PHP è abbastanza facile da scalare: basta aggiungere un paio di server web, e voilà!

Il problema spesso si incontrano quando si passa da 1 a più server è con sessioni - conservare quelle in DB o memcached (molto facile), e problema risolto!


Come sidenote: non mi consiglia la scelta di una tecnologia perché c'è un paio di differenza percentuale della velocità su alcuni benchmark: ci sono fattori ben più importanti, come il modo in cui la tua squadra sa ogni tecnologia - o, anche gli algoritmi che userete!

9

Immagino che tu sia un po 'un po' nel confronto tra mele e arance - presumendo che tu stia utilizzando tutti questi linguaggi per creare applicazioni web, c'è molto di più rispetto alla sola lingua.(E molto spesso è il database a rallentare ;-)

Non suggerirei mai di scegliere una di queste lingue sull'altra sulla base di un argomento velocità .

+9

+1 La velocità è la maggior parte del tempo su quanto sia ben scritto il codice, non sulle differenze relative della velocità misurate in benchmark sciocchi. I buoni sviluppatori possono far volare una di queste piattaforme. – ChristopheD

+3

Non sto scegliendo una lingua. PHP è il mio linguaggio preferito (almeno per il web). Ero semplicemente curioso. – ryeguy

+0

Non sono proprio i linguaggi a fare la differenza di velocità, ma il modo in cui viene eseguito il codice (compilato). Come altri hanno menzionato, le macchine virtuali Java e .NET sono state ottimizzate abbastanza bene, è/potrebbe/essere che il modo in cui viene eseguito php è meno ottimizzato. Se questo è un limite teorico/linguistico o solo una questione di lavoro da fare per i ragazzi di php, probabilmente è in discussione. (Vedendo il recente aumento delle prestazioni di javascript penso che sia abbastanza possibile accelerare l'esecuzione di php) –

4

La più grande ragione è che i CLR HotSpot JVM e C# di Java utilizzano entrambi la compilazione Just-In-Time (JIT). La compilazione JIT compila i bytecode fino al codice nativo che viene eseguito direttamente sul processore.

Inoltre, penso che il bytecode e il CIL Java siano di livello inferiore rispetto al bytecode interno di PHP, il che potrebbe rendere più e più efficaci le ottimizzazioni JIT.

-1

Dipende da cosa si vuole fare. In alcuni casi, PHP è decisamente più veloce. PHP è (abbastanza) bravo nella manipolazione di file e altre cose di base (anche roba XML). In questi casi, Java o C# potrebbero essere più lenti (anche se non ho fatto un benchmark).

Inoltre, l'output PHP (HTML o qualsiasi altra cosa) deve essere scaricato nel browser, che consuma anche del tempo.

Inoltre, la velocità di Java/C# dipende molto dalla macchina su cui gira (che potrebbe essere multipla). Java/C# potrebbe essere lento sul tuo computer, mentre PHP gira su un server da cui è disponibile ed è sempre veloce quanto il server (ad eccezione dei tempi di download, ecc.).

Non penso che siano comparabili in modo generale. Penso che sia necessario svolgere un compito, che si potrebbe realizzare con questi tre linguaggi di programmazione, e quindi confrontarlo. Questo è fondamentalmente sempre ciò che dovresti fare quando scegli un linguaggio di programmazione; trova quello che si adatta al compito. Non modellare l'attività finché non si adatta al linguaggio di programmazione.

+1

Il tuo confronto non ha molto senso. L'OP chiedeva informazioni sulle prestazioni semplici e crude dei numeri e sul perché un metodo in PHP sarebbe più lento dello stesso metodo in Java/C#. –

+0

Beh, non aveva molto senso perché i confronti sono difficili da fare. Un altro, probabilmente insoddisfacente, confronto è chiedere "Perché le pere sono maglioni e poi le mele?". Sono entrambi frutti (come PHP/Java sono entrambi linguaggi di programmazione) ma non c'è una risposta reale alla domanda semplicemente perché differiscono molto. – Jake

+0

Non sono d'accordo. Puoi chiaramente spiegare perché le pere sono più dolci delle mele (se conosci bene i tuoi frutti). Le lingue possono avere usi diversi, ma ciò non dovrebbe impedirti di essere in grado di confrontarle fianco a fianco. –

5

Sia Java che C# hanno JIT compilers, che accettano il bytecode e lo compilano in vero codice macchina. L'atto di compilarlo può richiedere del tempo, quindi C# e Java possono soffrire di tempi di avvio più lenti, ma una volta che il codice è compilato JIT, le sue prestazioni si trovano nello stesso campo di ogni linguaggio "veramente compilato" come C++.

+0

+1 La tua risposta è fondamentalmente uguale alla mia. Non vedo perché avrebbe dovuto essere down-votato – mcjabberz

0

Non c'è modo in cui una lingua interpretata può essere più veloce di una lingua compilata o persino di un linguaggio JIT in condizioni banali.

A meno che il programma di test non sia la stampa di "Hello Worlds" se si è preoccupati della velocità, attenersi a C# o Java.

+0

Al giorno d'oggi non esistono linguaggi interpretati o compilati! – dVaffection

Problemi correlati