Penggunaan fungsi NANOSLEEP pada PHP
Saya menyadari yang kedua menghindari overhead panggilan fungsi ( update , sebenarnya merupakan konstruksi bahasa), tetapi akan menarik untuk mengetahui apakah yang satu lebih baik dari yang lain. Saya telah menggunakan Apakah ada yang disukai, dan apa alasannya? Itu disebutkan di halaman setel manual pada 2009 :
(Sejak 2013,
halaman manual Perhatikan bahwa hingga php5.3, jika Anda memiliki dua objek dalam referensi melingkar , seperti dalam hubungan orangtua-anak, panggilan tidak disetel () pada objek induk tidak akan membebaskan memori yang digunakan untuk referensi induk pada anak. obyek. (Memori juga tidak akan dibebaskan ketika objek induk dikumpulkan sampah.) ( bug 33595 ) Pertanyaan " perbedaan antara tidak disetel dan = null " merinci beberapa perbedaan:
Selain masalah kinerja, penggunaan
Dengan melakukan unset () pada variabel, Anda pada dasarnya telah menandai variabel untuk 'pengumpulan sampah' (PHP tidak benar-benar memilikinya, tetapi sebagai contohnya) sehingga memori tidak segera tersedia. Variabel tidak lagi menampung data, tetapi tumpukan tetap pada ukuran yang lebih besar. Melakukan metode nol menjatuhkan data dan mengecilkan memori tumpukan segera. Ini berasal dari pengalaman pribadi dan juga yang lainnya. Lihat komentar dari fungsi unset () di sini . Saya pribadi menggunakan unset () di antara iterasi dalam satu lingkaran sehingga saya tidak harus memiliki penundaan stack yang ukurannya menjadi yo-yo. Data hilang, tetapi jejak tetap ada. Pada iterasi berikutnya, memori sudah diambil oleh php dan dengan demikian, lebih cepat untuk menginisialisasi variabel berikutnya.
Per itu sepertinya "= null" lebih cepat. Hasil PHP 5.4:
Hasil PHP 5.3:
Hasil PHP 5.2:
Hasil PHP 5.1:
Hal-hal mulai terlihat berbeda dengan PHP 5.0 dan 4.4. 5.0:
4.4:
Ingat microtime (true) tidak berfungsi di PHP 4.4 jadi saya harus menggunakan contoh microtime_float yang diberikan di php.net/microtime/Example # 1. Itu membuat perbedaan dengan elemen array. Pertimbangkan contoh ini
Di sini, 'tes' kuncinya masih ada. Namun, dalam contoh ini
kunci tidak ada lagi. Ia bekerja dengan cara berbeda untuk variabel yang disalin dengan referensi:
Mengenai objek, terutama dalam skenario lazy-load, orang harus mempertimbangkan pengumpul sampah berjalan dalam siklus CPU siaga, jadi anggap Anda akan mendapat masalah ketika banyak objek memuat penalti kecil waktu akan menyelesaikan pembebasan memori. Gunakan time_nanosleep untuk mengaktifkan GC untuk mengumpulkan memori . Mengatur variabel ke nol diinginkan. Diuji pada server produksi, awalnya pekerjaan yang dikonsumsi 50MB dan kemudian dihentikan . Setelah nanosleep digunakan 14MB adalah konsumsi memori yang konstan. Orang seharusnya mengatakan ini tergantung pada perilaku GC yang dapat berubah dari versi PHP ke versi . Tetapi itu berfungsi pada PHP 5.3 baik-baik saja. misalnya. contoh ini (kode diambil dari VirtueMart2 google feed)
Saya masih ragu tentang ini, tetapi saya sudah mencobanya di skrip saya dan saya menggunakan xdebug untuk mengetahui bagaimana itu akan mempengaruhi penggunaan memori aplikasi saya . Skrip ini diatur pada fungsi saya seperti ini:
Dan saya menambahkan unset tepat sebelum kode Tetapi ada sesuatu yang unik pada perbandingan ini ketika saya tidak menggunakan unset () atau NULL, xdebug memberi saya 160144 sebagai penggunaan memori Jadi, saya pikir memberikan baris untuk menggunakan unset () atau NULL akan menambahkan proses ke aplikasi Anda dan akan lebih baik untuk tetap Asal dengan kode Anda dan mengurangi variabel yang Anda gunakan seefektif mungkin. Perbaiki saya jika saya salah, terima kasih Saya membuat tes kinerja baru untuk
Tetapi saya hanya dapat mengujinya di server PHP 5.5.9, berikut hasilnya: - butuh 4,4571571350098 detik - mengambil 4,4425978660583 detik Saya lebih suka Kode dan ini juga menangani tentang mencegah kebocoran memori. silakan lihat tautan ini http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2 saya telah menggunakan unset untuk waktu yang lama sekarang. praktik yang lebih baik seperti ini dalam kode untuk secara instan menghapus semua variabel yang telah digunakan sebagai array.
dan silakan lihat topik terkait untuk tidak disetel Seberapa pentingkah untuk menghapus variabel di PHP? [bug] PHP 7 sudah bekerja pada masalah manajemen memori seperti itu dan penggunaannya dikurangi hingga minimal.
PHP 7.1 Outpu: mengambil 0,16778993606567 detik mengambil 0,16630101203918 detik Sebagai catatan, dan tidak termasuk waktu yang diperlukan:
Ia kembali
Kesimpulannya, memori bebas nol dan tidak disetel seperti yang diharapkan (tidak hanya pada akhir eksekusi). Juga, menetapkan ulang suatu variabel memegang nilai dua kali pada beberapa titik (520216 versus 438352) |