2009-12-24 15 views
5

Quali sono alcune delle operazioni più costose in PHP? So che cose come l'uso eccessivo dell'operatore @ possono essere costose. Cos'altro vorresti considerare?Operazioni più costose in PHP?

+5

perché stai cercando di cogliere questi piccoli problemi di perfomance? se il tuo programma è lento, non è a causa di @ –

+4

Il "paypal $ 10 a Paul Tomblin" è piuttosto costoso. Ma ne vale la pena. –

+0

@valya Sto cercando di capire le diverse cose che dovrebbero essere evitate quando si tratta di prestazioni. Io uso solo l'operatore @ come esempio. –

risposta

18
  • serialize() è lento, come eval(), create_function() e generazione di processi aggiuntivi tramite system() e funzioni correlate.
  • Attenzione a tutto ciò che APC non può memorizzare nella cache - conditional includes, eval() codice ed ecc.
  • Apertura connessioni database. Archivia sempre le connessioni e riutilizzale.
  • Oggetto clonazione
  • Espressioni regolari. Utilizza sempre le normali operazioni sulle stringhe su un'espressione regolare se non hai bisogno della funzionalità di una espressione regolare, ad es. utilizzare str_replace() su preg_replace() ove possibile.
  • Logging e scritture su disco può essere lento - eliminare inutili di registrazione e di file operazioni

Alcuni micro-ottimizzazioni che sono le buone pratiche, ma non farà molta differenza per la vostra fondo le prestazioni della linea:

  • L'utilizzo dell'eco è più veloce della stampa
  • La concatenazione delle variabili è più veloce rispetto all'utilizzo in linea di una stringa con doppia quotatura.
  • L'utilizzo di echo con un elenco di argomenti è più rapido della concatenazione degli argomenti. Esempio: echo 'How are you ',$name,' I am fine ',$var1 è più veloce di echo 'How are you '.$name.' I am fine '.$var1
  • Sviluppare con avvisi e avvisi attivati. Assicurandosi che non vengano attivati, PHP si risparmia di dover eseguire il controllo degli errori su di essi.
+2

Esattamente il tipo di risposta che sto cercando. Grazie @ zombat !! –

+0

Secondo la mia esperienza, la clonazione di un oggetto è più economica rispetto all'istanziazione di un nuovo oggetto. –

2

Tutto ciò che sta accadendo attraverso una connessione di rete, ad esempio chiamando un webservice, ad esempio: in genere ci vorrà più tempo rispetto a fare un'operazione localmente.

(anche se non costa molto di CPU, ti costerà tempo)

0

foreach() dichiarazioni, in particolare con la nidificazione, sono spesso costosi; anche se questo è tanto il mio ingenuo - e talvolta mal pianificato - approccio alla programmazione come colpa di php.

Anche se penso sia vero, anche, di JS e di altre lingue, quindi quasi sicuramente è colpa mia. =/

+0

Non è necessariamente il foreach stesso che è lento, ma piuttosto la logica all'interno del foreach.Si consiglia di eseguire il loop dei dati una sola volta e una sola volta, quando possibile, e di eseguire il minimo di elaborazione all'interno di un ciclo foreach il più possibile, dal momento che quel ciclo verrà eseguito 1-infinito volte, a seconda delle dimensioni del set che si stanno andando oltre. –

4
"Hello $name" 

sintassi è più lento di

'Hello ' . $name 

anche __get() __set() __call(), ecc sono lenti

e, se ci tieni così tanto, è possibile utilizzare ottimizzato structures da SPL

+1

+1, non ho mai saputo che "Hello $ name" era più lento di "Hello". $ name' =) –

+0

L'interpolazione della stringa PHP non è quella che chiamerei "una delle operazioni più costose in PHP". È molto veloce Sì, hai ragione: l'esempio di interpolazione sopra è più lento del 20% o del 25% rispetto all'esempio di concatenazione, ma ciò non implica che l'interpolazione sia un fattore di trascinamento maggiore. –

+0

né "@" né altro. smettere di temere le caratteristiche, temere il tuo codice errato –

1

I 'dì query SQL all'interno di loop. Come ad esempio questo:

foreach ($db->query('SELECT * FROM categories') as $cat) 
{ 
    foreach ($db->query('SELECT * FROM items WHERE cat_id = ' . $cat['cat_id']) as $item) 
    { 
    } 
} 

Il che, per la cronaca, potrebbe essere accorciata in qualcosa di simile a questo:

$sql = 'SELECT c.*, i.* 
      FROM categoriess c 
    LEFT JOIN items i USING (cat_id) 
     ORDER BY c.cat_order'; 

foreach ($db->query($sql) as $row) 
{ 
} 
+4

Non è un collo di bottiglia del PHP –

+0

Penso che il secondo esempio sarebbe leggermente/più/costoso dal momento che esiste un'istruzione di assegnazione. –

+1

Oh sì? Quindi, cos'è? La domanda è "qual è la roba più costosa in PHP" e la risposta è "tutto ciò che viene inserito in un ciclo che non appartiene a questo". Ma hai ragione, è molto più importante prendersi cura di quelle fastidiose virgolette singole! –

5

Invece di cercare di capire le potenziali aree che sono lenti, utilizzare uno strumento di profiling. Installare xDebug era probabilmente una delle cose più semplici e migliori che ho fatto per migliorare il codice che scrivo. Installa con WinCacheGrind (o la versione corretta per il tuo sistema operativo) per i migliori risultati.

+0

concordato. Sto solo pensando a cose che uno potrebbe desiderare di impegnarsi a memoria muscolare per evitare automaticamente. A mio parere, la profilazione è la migliore per mostrare i colli di bottiglia di cui non eri a conoscenza. –

+0

Sì, ottimo punto. Se utilizzi un framework, tenderai a scoprire che la maggior parte del tempo viene speso in quel framework - e spesso - non in un posto che sarai davvero in grado di ottimizzare. Qualcosa come APC può fare miracoli (o qualsiasi cache di opcode). Inoltre, WinCacheGrind è piuttosto vecchio, controlla kCacheGrind per Ubuntu (ho eseguito una VM solo per questo strumento). –

0

Dalla mia esperienza l'operazione più costosa in termini reali è la dichiarazione echo. Prova a unire tutte le stringhe insieme prima di inviarle al browser, seguito in particolare dalle chiamate al database!

Il codice può talvolta ottenere un aumento delle prestazioni x10 semplicemente rifattorizzando gli algoritmi e le strutture dati. Ottieni un programma e prova a metà della sua lunghezza, puoi dimezzarlo di nuovo?

+0

Quindi vuoi dire assegnare tutto ciò che stai per echo a una variabile e quindi echo quella variabile quando sei pronto? –

+0

Pensate a come questo Darrell: echo "text1" echo "text2" echo "text3" è lento rispetto echo "testo1 + testo2 + text3" E 'anche vero in linguaggi come Java e C# in cui si emettono un sacco di istruzioni sulla console. – Woot4Moo

1

curl_exec() è molto lento rispetto alle operazioni tipiche. Inoltre, la maggior parte delle operazioni str_ * sono più veloci delle operazioni regex.

1
  • json_encode è più veloce di serializzare
  • Concatenate in loop è più veloce di implodere

La gente pensa che @ è costoso forse solo perché questo detto è abbastanza diffusa sul web.

citando: http://www.php.net/manual/en/language.operators.errorcontrol.php#102543

Se vi state chiedendo che cosa l'impatto sulle prestazioni di utilizzare il @ operatore, considerare questo esempio. In questo caso, il secondo script (utilizzando l'operatore @ ) richiede 1.75x per l'esecuzione ... quasi il doppio del tempo del primo script.

Così mentre si, c'è un sovraccarico, per iterazione, vediamo che l'operatore @ ha aggiunto solo .005 ms per chiamata. Non c'è motivo sufficiente, imho, per evitare di usare l'operatore @.

reali 0m7.617s 0m6.788s utente SYS 0m0.792s

vs

reali degli utenti 0m13.333s 0m12.437s sys 0m0.836s

Si può quasi incapace di "abusare" di un operatore e spesso vale la pena se sta facendo un'operazione che si desidera.

0

uniqid() è stupido costoso. Non utilizzare per generare molti identificativi univoci.

Problemi correlati