Açma / kapama etiketleri ve performans?


91

Bu aptalca bir soru olabilir, ancak PHP'ye nispeten yeni biri olarak, HTML şablon kodunda PHP etiketlerinin sık sık açılması ve kapatılmasıyla ilgili performansla ilgili herhangi bir sorun olup olmadığını ve öyleyse, terimler açısından en iyi uygulamaların neler olabileceğini merak ediyorum. PHP etiketleriyle çalışmak mı?

Sorum kapanış etiketlerinin önemi / doğruluğu veya hangi tür kodun diğerinden daha okunaklı olduğu ile ilgili değil, daha çok belgenin nasıl ayrıştırıldığı / yürütüldüğü ve performans üzerinde ne gibi etkileri olabileceği ile ilgili.

Örnek vermek için aşağıdaki iki uç noktayı düşünün:

PHP ve HTML etiketlerini karıştırmak:

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

PHP ve HTML etiketlerini ayırmak:

<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

Sadece bunun bir fark yaratmadığını duymak olsa bile, bununla ilgili bazı görüşler duymak ilgimi çeker.

Teşekkürler.


9
İlginç bir soru, bunun için +1. Verdiğiniz 2 örneğin karşılaştırma için ideal çift olduğunu
düşünmüyorum ama

Teşekkürler ... Şu anda devasa bir html tablosu üzerinde çalışıyorum ve soru biraz teorik olsa bile bana bakıyor.
Tom

Konu dışı: Tabloyu doldurmak için bir döngü ve veri dizisi / yineleyicisi kullanmalısınız.
Decent Dabbler

@fireeyedboy ... tabii, katılıyorum, ama bu her zaman pratik değil. Veritabanından veri alırken akrobasi gerektirir veya HTML yapısı düzgün bir şekilde bir döngüye sığmaz.
Tom

4
Okunabilirliğin burada en önemli şey olduğunu düşünüyorum. Bu kadar önemsiz bir şeyle büyük bir artış / azalma görmeyeceksiniz.
Chuck Le Butt

Yanıtlar:


88

Doğru anlamanız için 3 basit kural:

  • Hiçbir söz dizimi sorunu performansı etkileyemez. Veri manipülasyonu yapar.
  • Yalnızca profilleme sonuçlarıyla desteklenen performanstan bahsedin .
  • Erken optimizasyon tüm kötülüklerin köküdür

Performans sorunlarını anlamak oldukça zor. Yeni başlayanların bunu dikkate almaması tavsiye edilir. Çünkü onlar her zaman önemsiz şeylerden etkilenirler ve gerçekten önemli şeyleri göremezler. Sırf deneyim eksikliği yüzünden.

Sorunuz için aynı. Bir fark elde edeceğinizi hayal edin. Diyelim ki büyük olan bile bir yöntem 2 kat daha hızlıdır. Aman tanrım, 2 kez! Ben onu seçtim ve uygulamamı iyi optimize ettim, şimdi% 50 daha hızlı çalışacak!

Yanlış . % 50 değil. Bu hız artışını asla fark edemezsiniz hatta ölçemezsiniz. Çünkü tüm komut dosyası çalışma süresinin yalnızca% 0,0001'ini kaplayan bir parçayı optimize ettiniz.

Büyük HTML tablolarına gelince, tarayıcının onu oluşturması uzun zaman alır. Üretmek için aldığınızdan çok daha fazlasını.

Profil oluşturma, performans dünyasında önemli bir kelimedir. Hiç şüphe duymadan performansla ilgili herhangi bir soruyu çöpe atabilirsiniz, eğer içinde "profilleme" kelimesi yoksa. Aynı zamanda profil çıkarma bir roket bilimi değildir. Ben sadece senaryonuzun farklı bölümlerinin çalışma süresini ölçüyorum. Xdebug gibi bazı profil oluşturucularla veya hatta manuel olarak microtime(1). Ve ancak en yavaş kısmı tespit ettikten sonra, testlere başlayabilirsiniz.

Performans soruları sormadan önce profil yapmayı öğrenin. Ve bunun için gerçek bir neden yoksa performans sorusu sormamayı öğrenin.

Erken optimizasyon, tüm kötülüklerin köküdür - D. Knuth .


4
"Profil" yerine "kıyaslama" kelimesini kullanmam neden bu kadar kötü? Anlamda herhangi bir fark var mı? Farklılıkları bilmek
isterim

Donald Knuth'tan alıntı yapmak için +1 ve çok anlayışlı bir cevap için +200.
Clement Herreman

@nikic, Col "benchmark" kelimesini kullanmanın kötü olduğunu ne zaman söyledi? Kulağa kelimeleri ağzına koyuyormuşsun ya da yanlış yerde bir şeyden bahsediyormuşsun gibi geliyor.
Chuck Le Butt

10
bu neden bu kadar yüksek puan aldı? Soruya herhangi bir şekilde veya biçimde cevap vermiyor. -1 benden.
bharal

2
@NikiC zamanki kullanım Ben ettik tanık: kıyaslama nasılsa ölçme vasıtası veya sıralama genel oysa (Amien aşağıda, bu soruya onun cevabını yaptıklarının gibi) alternatif çözümlere karşılaştırmak amacıyla kod parçasının performansını profilleme araçlarının Çözmeye çalıştığınız kullanıcı tarafından görülebilen performans sorunundan kodunuzun hangi kısımlarının sorumlu olduğunu bulma Aradaki fark, profil oluşturmanın performans sorununun nedenini belirlemekle ilgili olması, kıyaslamanın ise çözümlerin test edilmesiyle ilgili olmasıdır.
Mark Amery

41

50.000 satırlık testleri yeniden yaptım ve çoklu yankıyı 1 etiket yönteminde de ekledim

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 Saniye

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 Saniye

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

duration3: 27.54640007 Saniye

Orijinal 2 yöntemleri arasında pek bir fark yok, ancak daha az birleştirme @poke ile biraz daha hızlı gibi görünüyor

Tek seferde bu kadar veriye ihtiyacım olacağından şüphelendiğim için sanırım birçok etiket kullanmaya devam edeceğim, kod girintisi daha düzgün görünüyor ve 'kaynağı görüntüle' düzeni daha doğru görünüyor


1
Üçüncü bir test durumu, o zaman dize birleştirme kullanmanız gerekmeyeceğinden, bir php etiketiyle birden çok yankı ifadesi kullanmak olacaktır.
dürtmek

50.000 satırlık testleri yeniden yaptım ve çoklu yankıyı 1 etiket yönteminde de ekledim
Amien

5
+1 Mesuring, optimize etmek istediğimizde önemlidir. Genellikle bu tür bir optimizasyonun yararsız olduğunun farkındayız.
Luc M

18
Görünüşe göre, ilk iki örnek, son örnekten çok daha fazla boşluk çıkardı. Daha yüksek çalışma süresinin nedeni bu olabilir.
Mike C

Ayrıca echobirden çok ifadenin çıktı alınmasını kabul eder. Metriklerde bu özelliğe sahip hiçbir varyant dikkate alınmamıştır.
hakre

12

Bu ikisi arasındaki performans farkını kolayca görmezden gelebilirsiniz. Günümüzün modern bilgi işlem kaynaklarıyla, fark gerçekten önemli değil. Bu tür ekrana baskı işleri gerçekten endişelenmenize gerek yok. Daha önce düşünmeniz gereken tonlarca başka şey var. Bunun dışında, kodunuzun en iyi performansı ve sürdürülebilirliği arasında her zaman bir tartışma vardır. Her zaman en iyi performansı elde etmeye çalışamazsınız. Bunun yerine, her zaman performans endişelerini ve bunları iyileştirmek için harcamanız gereken zamanı dikkate almalısınız.


6

Sahte koda çevrilmesi kolay olan kod daha iyidir. Bu, yukarıdaki örneklerle kanıtlanmıştır. Hangisini söylemek daha uzun sürer?

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

Şahsen yapardım:

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

Tercümanın nasıl çalıştığı ve neden bir yolun diğerinden daha hızlı olduğu hakkında teknik bir açıklama yeni başlayanlar için önemsizdir. Temel kuralları bilmek en iyisidir:

  1. Daha basit, daha iyidir.
  2. Tek bir sayfaya sığmazsa, çok fazla yapıyor demektir (parçalayın).
  3. Sözde kodu bir dizin kartına elle yazamazsanız, bu çok karmaşıktır.

Genel sonuç daha basitse daha fazla etiket kullanın. Dönem.


5

Bununla ilgili asıl sorun hafıza kullanımıdır. Dize birleştirme ve toplu yankılama bellek kullanımını üssel olarak artırabilir.

Eğer php etiketini spam yaparsanız, kodunuz okunamaz hale gelir.

En iyi çözüm, bir şablon motoru kullanmak ve kodu ve sunumu karıştırmaktan kaçınmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.