Tags & Performance öffnen / schließen?


91

Dies mag eine dumme Frage sein, aber als jemand, der relativ neu in PHP ist, frage ich mich, ob es leistungsbedingte Probleme beim häufigen Öffnen und Schließen von PHP-Tags im HTML-Vorlagencode gibt und wenn ja, welche Best Practices dies möglicherweise sind mit PHP-Tags zu arbeiten?

Meine Frage bezieht sich nicht auf die Wichtigkeit / Richtigkeit des Schließens von Tags oder darauf, welcher Codetyp besser lesbar ist als ein anderer, sondern vielmehr darauf, wie das Dokument analysiert / ausgeführt wird und welche Auswirkungen es auf die Leistung haben könnte.

Betrachten Sie zur Veranschaulichung die folgenden zwei Extreme:

Mischen von PHP- und HTML-Tags:

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

Trennen von PHP- und HTML-Tags:

<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

Würde mich interessieren, einige Ansichten dazu zu hören, auch wenn es nur zu hören ist, dass es keinen Unterschied macht.

Vielen Dank.


9
Interessante Frage, +1 dafür. Obwohl ich nicht der Meinung bin, dass die 2 Beispiele, die Sie gegeben haben, das ideale Paar zum Vergleich sind, verstehe ich das Wesentliche :)
okw

Danke ... Ich arbeite gerade mit einer riesigen HTML-Tabelle und die Frage starrt mich an ... auch wenn es etwas theoretisch ist.
Tom

Off topic-ish: Sie sollten eine Schleife und ein Array / Iterator von Daten verwenden, um die Tabelle zu füllen.
Anständiger Dabbler

@fireeyedboy ... sicher, ich stimme zu, aber das ist nicht immer praktisch. Entweder erfordert Akrobatik beim Abrufen der Daten aus der Datenbank, oder die HTML-Struktur passt nicht sauber in eine Schleife.
Tom

4
Ich denke, Lesbarkeit ist hier das Wichtigste. Mit so etwas Trivialem werden Sie keine größere Zunahme / Abnahme sehen.
Chuck Le Butt

Antworten:


88

3 einfache Regeln, damit Sie es richtig machen:

  • Kein Syntaxproblem kann die Leistung beeinträchtigen. Datenmanipulation tut.
  • Sprechen Sie von Leistung, die nur durch Ergebnisse der Profilerstellung unterstützt wird .
  • Vorzeitige Optimierung ist die Wurzel allen Übels

Leistungsprobleme sind ziemlich schwer zu verstehen. Es wird den Neulingen empfohlen, dies nicht zu berücksichtigen. Weil sie immer von Kleinigkeiten beeindruckt sind und keine wirklich wichtigen Dinge sehen. Nur weil es an Erfahrung mangelt.

Gleiches gilt für Ihre Frage. Stellen Sie sich vor, Sie werden jemals einen Unterschied bekommen. Selbst eine große Methode ist beispielsweise zweimal schneller. Oh mein Gott, 2 mal! Ich habe es ausgewählt und meine App gut optimiert, sie läuft jetzt 50% schneller!

Falsch . Nicht 50%. Sie würden diese Geschwindigkeitssteigerung nie bemerken oder sogar messen. Weil Sie einen Teil optimiert haben, der nur 0,0001% der gesamten Skriptlaufzeit beansprucht.

Bei den großen HTML-Tabellen dauert es lange, bis der Browser sie rendert. Viel mehr als Sie benötigt haben, um zu generieren.

Profiling ist ein Schlüsselwort in der Performance-Welt. Man kann jede leistungsbezogene Frage ohne Zweifel in den Papierkorb werfen, wenn sie kein Wort "Profiling" enthält. Gleichzeitig ist die Profilerstellung keine Raketenwissenschaft. Ich messe nur die Laufzeit verschiedener Teile Ihres Skripts. Kann mit einem Profiler wie xdebug oder sogar manuell mit verwendet werden microtime(1). Und erst nachdem Sie den langsamsten Teil erkannt haben, können Sie mit Tests beginnen.

Lernen Sie das Profilieren, bevor Sie Leistungsfragen stellen. Und lernen Sie, keine Leistungsfragen zu stellen, wenn es keine wirklichen Gründe dafür gibt.

Vorzeitige Optimierung ist die Wurzel allen Übels - D.Knuth .


4
Warum ist es so schlimm, wenn ich das Wort "Benchmark" anstelle von "Profil" verwende? Gibt es einen Unterschied in der Bedeutung? Würde
mich freuen

+1 für das Zitieren von Donald Knuth und +200 für eine sehr aufschlussreiche Antwort.
Clement Herreman

@nikic, wann hat Col gesagt, dass es schlecht ist, das Wort "Benchmark" zu verwenden? Klingt so, als würden Sie ihm Worte in den Mund stecken oder etwas an der falschen Stelle referenzieren.
Chuck Le Butt

10
Warum ist das so hoch bewertet? Es beantwortet die Frage in keiner Form. -1 von mir.
Bharal

2
@NikiC Die übliche Verwendung, die ich gesehen habe: Benchmarking bedeutet, die Gesamtleistung eines Codeteils irgendwie zu messen oder zu bewerten, um ihn mit alternativen Lösungen zu vergleichen (wie es Amien in seiner Antwort auf diese Frage unten getan hat), während Profiling bedeutet Finden Sie heraus, welche Teile Ihres Codes für das vom Benutzer sichtbare Leistungsproblem verantwortlich sind, das Sie lösen möchten. Der Unterschied besteht darin, dass es bei der Profilerstellung darum geht, die Ursache Ihres Leistungsproblems zu ermitteln, während beim Benchmarking Lösungen dafür getestet werden.
Mark Amery

40

Ich habe die Tests mit 50.000 Zeilen wiederholt und das Multi-Echo auch in der 1-Tag-Methode hinzugefügt

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 
    }
}

Dauer1: 31.15542483 Sekunden

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>';
    }
}

Dauer2: 30.23169804 Sekunden

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>';
    }
}

Dauer3: 27.54640007 Sekunden

Kein großer Unterschied zwischen den ursprünglichen 2 Methoden, aber es sieht so aus, als ob es mit weniger Verkettung @poke ziemlich viel schneller ist

Da ich bezweifle, dass ich so viele Daten auf einmal benötige, werde ich wahrscheinlich weiterhin viele Tags verwenden, die Codeeinrückung sieht ordentlicher aus und das Layout der Quellquelle genauer


1
Ein dritter Testfall wäre die Verwendung mehrerer Echoanweisungen mit einem PHP-Tag, da Sie dann keine Zeichenfolgenverkettung verwenden müssten.
stupsen

Ich habe die Tests mit 50.000 Zeilen
wiederholt

5
+1 Messen ist wichtig, wenn wir optimieren möchten. Wir erkennen oft, dass diese Art der Optimierung nutzlos ist.
Luc M

18
So wie es aussieht, geben die ersten beiden Beispiele weitaus mehr Leerzeichen aus als das letzte Beispiel. Das könnte der Grund für die höhere Laufzeit sein.
Mike C

Auch echoakzeptiert mehrere Ausdrücke ausgegeben werden. In den Metriken wurde keine Variante mit dieser Funktion berücksichtigt.
hakre

13

Sie können den Leistungsunterschied zwischen diesen beiden leicht ignorieren. Bei den modernen Computerressourcen von heute spielt der Unterschied keine Rolle. Diese Art von Print-to-Screen-Material ist wirklich kein Grund zur Sorge. Es gibt Unmengen anderer Dinge, über die Sie vorher nachdenken sollten. Abgesehen davon gibt es immer eine Debatte zwischen der besten Leistung und der Wartbarkeit Ihres Codes. Sie können nicht immer versuchen, die beste Leistung zu erzielen. Stattdessen sollten Sie immer Leistungsprobleme zusammen mit der Zeit berücksichtigen, die Sie für deren Verbesserung benötigen.


6

Code, der leicht in Pseudocode zu übersetzen ist, ist besser. Dies wird durch die obigen Beispiele belegt. Was dauert länger zu sagen?

"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..."

Persönlich würde ich tun:

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

Eine technische Erklärung darüber, wie der Dolmetscher funktioniert und warum ein Weg schneller als der andere ist, ist für einen Neuling irrelevant. Es ist am besten, nur die Faustregeln zu kennen:

  1. Einfacher ist besser.
  2. Wenn es nicht auf eine einzelne Seite passt, macht es zu viel (brechen Sie es auf).
  3. Wenn Sie den Pseudocode nicht von Hand auf eine Karteikarte schreiben können, ist er zu komplex.

Verwenden Sie mehr Tags, wenn das Gesamtergebnis einfacher ist. Zeitraum.


5

Das eigentliche Problem dabei ist die Speichernutzung. String-Verkettung und Massenecho können die Speichernutzung exponentiell erhöhen.

Wenn Sie das PHP-Tag als Spam versenden, wird Ihr Code unlesbar.

Die beste Lösung besteht darin, eine Template-Engine zu verwenden und das Mischen von Code und Präsentation insgesamt zu vermeiden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.