Tag di apertura / chiusura e performance?


91

Questa potrebbe essere una domanda sciocca, ma essendo qualcuno relativamente nuovo a PHP, mi chiedo se ci siano problemi relativi alle prestazioni nell'aprire e chiudere frequentemente tag PHP nel codice del modello HTML e, in tal caso, quali potrebbero essere le migliori pratiche in termini di lavorare con i tag PHP?

La mia domanda non riguarda l'importanza / correttezza dei tag di chiusura o quale tipo di codice è più leggibile di un altro, ma piuttosto su come il documento viene analizzato / eseguito e quale impatto potrebbe avere sulle prestazioni.

Per illustrare, considera i seguenti due estremi:

Combinazione di tag PHP e HTML:

<?php echo
   '<tr>
       <td>'.$variable1.'</td>
       <td>'.$variable2.'</td>
       <td>'.$variable3.'</td>
       <td>'.$variable4.'</td>
       <td>'.$variable5.'</td>
   </tr>'
?>
// PHP tag opened once

Separazione di tag PHP e HTML:

<tr>
   <td><?php echo $variable1 ?></td>
   <td><?php echo $variable2 ?></td>
   <td><?php echo $variable3 ?></td>
   <td><?php echo $variable4 ?></td>
   <td><?php echo $variable5 ?></td>
</tr>
// PHP tag opened five times

Sarei interessato ad ascoltare alcune opinioni su questo, anche se è solo per sentire che non fa differenza.

Grazie.


9
Domanda interessante, +1 per quello. Anche se non credo che i 2 esempi che hai fornito siano la coppia ideale per il confronto, ho capito il succo :)
okw

Grazie ... al momento sto lavorando con un enorme tavolo html e la domanda mi sta fissando ... anche se è un po 'teorica.
Tom

Fuori tema: dovresti usare un ciclo e un array / iteratore di dati per popolare la tabella.
Decent Dabbler

@fireeyedboy ... certo, sono d'accordo, ma non è sempre pratico. O richiede acrobazie durante il recupero dei dati dal database, oppure la struttura HTML non si adatta perfettamente a un ciclo.
Tom

4
Penso che la leggibilità sia la cosa più importante qui. Non vedrai alcun aumento / diminuzione importante con qualcosa di così banale come questo.
Chuck Le Butt

Risposte:


88

3 semplici regole per farlo bene:

  • Nessun problema di sintassi può influire sulle prestazioni. La manipolazione dei dati sì.
  • Parla di prestazioni supportate solo dai risultati della profilazione .
  • L'ottimizzazione prematura è la radice di tutti i mali

I problemi di prestazioni sono abbastanza difficili da capire. Si consiglia ai neofiti di non tenerne conto. Perché sono sempre impressionati da cose insignificanti e non riescono a vedere cose davvero importanti. Solo per mancanza di esperienza.

Lo stesso per la tua domanda. Immagina di poter mai fare qualche differenza. Anche uno grande, diciamo, un metodo è 2 volte più veloce. Oh mio, 2 volte! L'ho scelto e ho ottimizzato bene la mia app, ora funzionerà più velocemente del 50%!

Sbagliato . Non al 50%. Non noteresti mai o misurerai mai questo aumento di velocità. Perché hai ottimizzato una parte che richiede solo lo 0,0001% dell'intero runtime dello script.

Per quanto riguarda le grandi tabelle HTML, il browser impiega molto tempo per renderlo. Molto più di quanto hai impiegato per generare.

La profilazione è una parola chiave nel mondo della performance. Si può cestinare qualsiasi domanda relativa alle prestazioni senza dubbi se non contiene la parola "profilazione". Allo stesso tempo, la creazione di profili non è una scienza missilistica. Sto solo misurando il tempo di esecuzione di diverse parti del tuo script. Può essere fatto con alcuni profiler, come xdebug, o anche manualmente, usando microtime(1). E solo dopo aver rilevato la parte più lenta, puoi iniziare con i test.

Impara a profilare prima di porre domande sulle prestazioni. E impara a non fare domande sulle prestazioni se non ci sono ragioni reali per farlo.

L'ottimizzazione prematura è la radice di tutti i mali : D.Knuth .


4
Perché è così brutto se uso la parola "benchmark" invece di "profilo"? C'è qualche differenza nel significato? Apprezzerei conoscere le differenze :)
NikiC

+1 per la citazione di Donald Knuth e +200 per la risposta molto perspicace.
Clement Herreman

@nikic, Quand'è che Col ha detto che era sbagliato usare la parola "benchmark" ?? Sembra che tu gli stia mettendo le parole in bocca o facendo riferimento a qualcosa nel posto sbagliato.
Chuck Le Butt

10
perché è così apprezzato? Non risponde alla domanda in nessuna forma o forma. -1 da me.
bharal

2
@NikiC L'utilizzo abituale a cui ho assistito: il benchmarking significa in qualche modo misurare o classificare le prestazioni complessive di un pezzo di codice per confrontarlo con soluzioni alternative (come quello che ha fatto Amien nella sua risposta a questa domanda, sotto), mentre la profilazione significa scoprire quali parti del codice sono responsabili di qualsiasi problema di prestazioni visibile all'utente che stai cercando di risolvere. La differenza è che la profilazione riguarda la determinazione della causa del problema di prestazioni, mentre il benchmarking riguarda il test di soluzioni.
Mark Amery

40

Ho rifatto i test con 50.000 righe e aggiunto anche il metodo multi eco in 1 tag

for ($j=0;$j<30;$j++) {
    foreach ($results as $key=>$val){
    ?>
       <tr>
           <td><?php echo $results[$key][0]?></td>
           <td><?php echo $results[$key][1]?></td>
           <td><?php echo $results[$key][2]?></td>
           <td><?php echo $results[$key][3]?></td>
           <td><?php echo $results[$key][4]?></td>
           <td><?php echo $results[$key][5]?></td>
           <td><?php echo $results[$key][6]?></td>
           <td><?php echo $results[$key][7]?></td>
           <td><?php echo $results[$key][8]?></td>
           <td><?php echo $results[$key][9]?></td>
           <td><?php echo $results[$key][10]?></td>
           <td><?php echo $results[$key][11]?></td>
           <td><?php echo $results[$key][12]?></td>
           <td><?php echo $results[$key][13]?></td>
           <td><?php echo $results[$key][14]?></td>              
       </tr>
    <?php 
    }
}

duration1: 31.15542483 Secondi

for ($k=0;$k<30;$k++) {
    foreach ($results as $key1=>$val1){
        echo
           '<tr>
               <td>'.$results[$key1][0].'</td>
               <td>'.$results[$key1][1].'</td>
               <td>'.$results[$key1][2].'</td>
               <td>'.$results[$key1][3].'</td>
               <td>'.$results[$key1][4].'</td>
               <td>'.$results[$key1][5].'</td>
               <td>'.$results[$key1][6].'</td>
               <td>'.$results[$key1][7].'</td>
               <td>'.$results[$key1][8].'</td>
               <td>'.$results[$key1][9].'</td>
               <td>'.$results[$key1][10].'</td>
               <td>'.$results[$key1][11].'</td>
               <td>'.$results[$key1][12].'</td>
               <td>'.$results[$key1][13].'</td>
               <td>'.$results[$key1][14].'</td>              
           </tr>';
    }
}

duration2: 30.23169804 Secondi

for ($l=0;$l<30;$l++) {
    foreach ($results as $key2=>$val2){     
           echo'<tr>';
               echo'<td>'.$results[$key2][0].'</td>';
               echo'<td>'.$results[$key2][1].'</td>';
               echo'<td>'.$results[$key2][2].'</td>';
               echo'<td>'.$results[$key2][3].'</td>';
               echo'<td>'.$results[$key2][4].'</td>';
               echo'<td>'.$results[$key2][5].'</td>';
               echo'<td>'.$results[$key2][6].'</td>';
               echo'<td>'.$results[$key2][7].'</td>';
               echo'<td>'.$results[$key2][8].'</td>';
               echo'<td>'.$results[$key2][9].'</td>';
               echo'<td>'.$results[$key2][10].'</td>';
               echo'<td>'.$results[$key2][11].'</td>';
               echo'<td>'.$results[$key2][12].'</td>';
               echo'<td>'.$results[$key2][13].'</td>';
               echo'<td>'.$results[$key2][14].'</td>';              
           echo'</tr>';
    }
}

durata3: 27.54640007 secondi

Non c'è molta differenza tra i 2 metodi originali, ma sembra che sia un po 'più veloce con meno concatenazione @poke

Poiché dubito che avrò bisogno di tutti questi dati in una volta sola, immagino che continuerò a utilizzare molti tag, il rientro del codice sembra più ordinato e il layout della "visualizzazione sorgente" più accurato


1
Un terzo caso di test sarebbe quello di utilizzare più istruzioni echo con un tag php, poiché non sarebbe necessario utilizzare la concatenazione di stringhe.
colpisci il

Ho rifatto i test con 50.000 righe e aggiunto anche il metodo multi eco in 1 tag
Amien

5
La misurazione +1 è importante quando vogliamo ottimizzare. Spesso ci rendiamo conto che questo tipo di ottimizzazione è inutile.
Luc M

18
A quanto pare, i primi due esempi restituiscono molto più spazi bianchi rispetto all'ultimo esempio. Questa potrebbe essere la ragione per la maggiore autonomia.
Mike C

echoAccetta anche più espressioni da emettere. Nessuna variante con quella caratteristica è stata considerata nelle metriche.
hakre

13

Puoi facilmente ignorare la differenza di prestazioni tra questi due. Con le moderne risorse informatiche di oggi, la differenza non ha davvero importanza. Questo tipo di cose da stampare su schermo non sono davvero di cui preoccuparsi. Ci sono un sacco di altre cose che dovresti considerare prima. A parte questo, c'è sempre un dibattito tra le migliori prestazioni e la manutenibilità del tuo codice. Non puoi sempre cercare di ottenere le migliori prestazioni. Invece, dovresti sempre considerare i problemi di prestazioni insieme alla quantità di tempo che devi spendere per migliorarli.


6

Il codice che è facile da tradurre in pseudo-codice è migliore. Ciò è evidenziato dagli esempi sopra. Quale richiede più tempo per dirlo?

"Start php, do this 30 times:, then stop php.  Print this.  Start php, print this, stop php. Print this.  Start php, print this, stop php.Print this.  Start php, print this, stop php. Print this.  Start php, print this, stop php.Print this.  Start php, print this, stop php. Print this.  Start php, print this, stop php.Print this.  Start php, print this, stop php..."

"Start php, do this 30 times: print this, then add this to that, then add this to that, then add this to that, then add this to that, then add this to that, then add this to that..."

"Start php, do this 30 times: print this, print this, print this, print this, print this, print this, print this..."

Personalmente farei:

"Start php, define this, do this 30 times: add this to that.  Print." 

Una spiegazione tecnica su come funziona l'interprete e perché un modo è più veloce di un altro è irrilevante per un principiante. È meglio solo conoscere le regole pratiche:

  1. Più semplice è meglio.
  2. Se non si adatta a una singola pagina, sta facendo troppo (scomporlo).
  3. Se non puoi scrivere a mano lo pseudo-codice su una scheda, è troppo complesso.

Usa più tag se il risultato complessivo è più semplice. Periodo.


5

Il vero problema con questo è l'uso della memoria. La concatenazione di stringhe e l'eco di massa possono aumentare in modo esponenziale l'utilizzo della memoria.

Se invii spam al tag php il tuo codice diventa illeggibile.

La soluzione migliore è utilizzare un motore di modelli ed evitare di mescolare del tutto codice e presentazione.

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.