Membuka / menutup tag & kinerja?

91

Ini mungkin pertanyaan yang konyol, tetapi sebagai seseorang yang relatif baru mengenal PHP, saya bertanya-tanya apakah ada masalah terkait kinerja untuk sering membuka dan menutup tag PHP dalam kode template HTML, dan jika demikian, apa praktik terbaik dalam istilah bekerja dengan tag PHP?

Pertanyaan saya bukan tentang pentingnya / kebenaran tag penutup, atau tentang jenis kode mana yang lebih mudah dibaca daripada yang lain, melainkan tentang bagaimana dokumen diurai / dijalankan dan apa dampaknya terhadap kinerja.

Sebagai ilustrasi, pertimbangkan dua ekstrem berikut:

Mencampur tag PHP dan HTML:

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

Memisahkan tag PHP dan 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

Akan tertarik untuk mendengar beberapa pandangan tentang ini, bahkan jika hanya mendengar itu tidak ada bedanya.

Terima kasih.

Tom
sumber
9
Pertanyaan menarik, +1 untuk itu. Meskipun saya tidak merasa 2 contoh yang Anda berikan adalah pasangan yang ideal untuk perbandingan, saya mendapatkan intinya :)
okw
Terima kasih ... Saya kebetulan bekerja dengan tabel html yang sangat besar saat ini dan pertanyaan semacam itu menatap saya ... bahkan jika itu agak teoretis.
Tom
Off topic-ish: Anda harus menggunakan loop dan array / iterator data untuk mengisi tabel.
Decent Dabbler
@fireeyedboy ... tentu, saya setuju, tapi itu tidak selalu praktis. Entah membutuhkan akrobat saat mengambil data dari db, atau struktur HTML tidak cocok dengan loop dengan rapi.
Tom
4
Saya pikir keterbacaan adalah hal terpenting di sini. Anda tidak akan melihat kenaikan / penurunan besar dengan sesuatu yang sepele seperti ini.
Chuck Le Butt

Jawaban:

88

3 aturan sederhana bagi Anda untuk melakukannya dengan benar:

  • Tidak ada masalah sintaks yang dapat memengaruhi kinerja. Manipulasi data tidak.
  • Berbicara tentang kinerja yang hanya didukung dengan hasil pembuatan profil .
  • Optimalisasi dini adalah akar dari segala kejahatan

Masalah kinerja cukup sulit untuk dipahami. Disarankan untuk pemula untuk tidak memperhitungkannya. Karena mereka selalu terkesan dengan hal-hal sepele dan gagal melihat hal yang sangat penting. Hanya karena kurang pengalaman.

Sama untuk pertanyaan Anda. Bayangkan Anda akan mendapatkan beberapa perbedaan. Bahkan yang besar, katakanlah, satu metode 2 kali lebih cepat. Astaga, 2 kali! Saya memilihnya dan mengoptimalkan aplikasi saya dengan baik, ini akan berjalan 50% lebih cepat sekarang!

Salah . Bukan 50%. Anda tidak akan pernah memperhatikan atau bahkan mengukur peningkatan kecepatan ini. Karena Anda mengoptimalkan bagian yang hanya mengambil 0,0001% dari seluruh runtime skrip.

Sedangkan untuk tabel HTML yang besar, butuh waktu lama bagi browser untuk merendernya. Lebih dari yang Anda hasilkan.

Profiling adalah kata kunci dalam dunia performance. Seseorang dapat membuang semua pertanyaan terkait kinerja tanpa keraguan jika tidak ada kata "profiling" di dalamnya. Pada saat yang sama pembuatan profil bukanlah ilmu roket. Saya hanya mengukur runtime dari berbagai bagian skrip Anda. Dapat dilakukan dengan beberapa profiler, seperti xdebug, atau bahkan secara manual, menggunakan microtime(1). Dan hanya setelah mendeteksi bagian paling lambat, Anda dapat mulai dengan tes.

Belajar membuat profil sebelum mengajukan pertanyaan kinerja. Dan belajarlah untuk tidak menanyakan pertanyaan kinerja jika tidak ada alasan nyata untuk itu.

Optimalisasi dini adalah akar dari segala kejahatan - D.Knuth .

Akal Sehat Anda
sumber
4
Mengapa sangat buruk jika saya menggunakan kata "patokan" daripada "profil"? Apakah ada perbedaan artinya? Akan sangat menghargai mengetahui perbedaannya :)
NikiC
1 untuk mengutip Donald Knuth dan +200 untuk jawaban yang sangat berwawasan.
Clement Herreman
@nikic, Kapan Col mengatakan bahwa menggunakan kata "benchmark" itu buruk ?? Kedengarannya seperti Anda memasukkan kata-kata ke mulutnya, atau merujuk sesuatu di tempat yang salah.
Chuck Le Butt
10
mengapa ini dinilai sangat tinggi? Itu tidak menjawab pertanyaan dalam bentuk atau bentuk apa pun. -1 dari saya.
bharal
2
@NikiC Penggunaan biasa yang telah saya saksikan: pembandingan berarti mengukur atau memberi peringkat kinerja keseluruhan potongan kode untuk membandingkannya dengan solusi alternatif (seperti yang telah dilakukan Amien dalam jawabannya atas pertanyaan ini, di bawah), sedangkan membuat profil berarti mencari tahu apa bagian dari kode Anda bertanggung jawab untuk apa pun masalah kinerja dapat dilihat pengguna Anda mencoba untuk memecahkan. Perbedaannya adalah pembuatan profil adalah tentang menentukan penyebab masalah kinerja Anda, sedangkan pembandingan adalah tentang menguji solusi untuk itu.
Mark Amery
40

Saya telah mengulangi tes dengan 50.000 baris dan menambahkan metode multi echo dalam 1 tag juga

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

Durasi1: 31.15542483 Detik

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

Durasi2: 30.23169804 Detik

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

Durasi3: 27.54640007 Detik

Tidak banyak perbedaan antara 2 metode asli, tetapi sepertinya ini sedikit lebih cepat dengan lebih sedikit penggabungan @poke

Karena saya ragu saya akan membutuhkan banyak data ini dalam sekali jalan, saya kira saya akan terus menggunakan banyak tag, lekukan kode terlihat lebih rapi dan tata letak 'sumber tampilan' lebih akurat

Amien
sumber
1
Kasus uji ketiga adalah menggunakan beberapa pernyataan echo dengan satu tag php, karena Anda tidak perlu menggunakan penggabungan string saat itu.
aduk
Saya telah mengulangi pengujian dengan 50.000 baris dan menambahkan multi echo dalam metode 1 tag juga
Amien
5
+1 Mesuring penting saat kami ingin mengoptimalkan. Kami sering menyadari bahwa pengoptimalan semacam ini tidak berguna.
Luc M
18
Dari kelihatannya, dua contoh pertama menghasilkan lebih banyak spasi daripada contoh terakhir. Itu bisa menjadi alasan runtime yang lebih tinggi.
Mike C
Juga echomenerima beberapa ekspresi untuk menjadi keluaran. Tidak ada varian dengan fitur tersebut yang telah dipertimbangkan dalam metrik.
hakre
13

Anda dapat dengan mudah mengabaikan perbedaan kinerja di antara keduanya. Dengan sumber daya komputasi modern saat ini, perbedaannya tidak terlalu penting. Jenis barang cetak ke layar ini benar-benar tidak perlu dikhawatirkan. Ada banyak hal lain yang harus Anda pertimbangkan sebelumnya. Selain itu, selalu ada perdebatan antara kinerja terbaik dan pemeliharaan kode Anda. Anda tidak dapat selalu berusaha mencapai kinerja terbaik. Sebaliknya, Anda harus selalu mempertimbangkan masalah kinerja bersama dengan jumlah waktu yang Anda butuhkan untuk memperbaikinya.

pars
sumber
6

Kode yang mudah diterjemahkan menjadi pseudo-code lebih baik. Ini dibuktikan dengan contoh di atas. Mana yang lebih lama untuk dikatakan?

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

Secara pribadi saya akan melakukan:

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

Penjelasan teknis tentang bagaimana penerjemah bekerja dan mengapa satu cara lebih cepat dari yang lain tidak relevan untuk seorang pemula. Yang terbaik adalah mengetahui aturan praktisnya:

  1. Lebih sederhana lebih baik.
  2. Jika tidak muat di satu halaman, berarti terlalu banyak (pecahkan).
  3. Jika Anda tidak dapat menulis pseudo-code pada kartu indeks, itu terlalu rumit.

Gunakan lebih banyak tag jika hasil keseluruhan lebih sederhana. Titik.

Jon Egerton
sumber
5

Masalah sebenarnya dengan ini adalah penggunaan memori. Rangkaian string dan gema massal dapat meningkatkan penggunaan memori secara eksponensial.

Jika Anda mengirim spam ke tag php, kode Anda menjadi tidak terbaca.

Solusi terbaik adalah dengan menggunakan mesin template dan menghindari pencampuran kode dan presentasi sama sekali.

Martien de Jong
sumber