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.
Jawaban:
3 aturan sederhana bagi Anda untuk melakukannya dengan benar:
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 .
sumber
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
sumber
echo
menerima beberapa ekspresi untuk menjadi keluaran. Tidak ada varian dengan fitur tersebut yang telah dipertimbangkan dalam metrik.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.
sumber
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:
Gunakan lebih banyak tag jika hasil keseluruhan lebih sederhana. Titik.
sumber
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.
sumber