Saya ingin tahu apa cara terbaik untuk membandingkan skrip PHP saya. Tidak masalah jika pekerjaan cron, atau halaman web atau layanan web.
Saya tahu saya bisa menggunakan microtime tetapi apakah itu benar-benar memberi saya waktu nyata skrip PHP?
Saya ingin menguji dan membandingkan berbagai fungsi dalam PHP yang melakukan hal yang sama. Misalnya, preg_match
vs strpos
atau domdocument
vs preg_match
atau preg_replace vs str_replace`
Contoh halaman web:
<?php
// login.php
$start_time = microtime(TRUE);
session_start();
// do all my logic etc...
$end_time = microtime(TRUE);
echo $end_time - $start_time;
Ini akan menampilkan: 0,0146126717 (bervariasi sepanjang waktu - tapi itu yang terakhir saya dapatkan). Ini berarti butuh 0,015 atau lebih untuk menjalankan skrip PHP.
Apakah ada cara yang lebih baik?
Jawaban:
Jika Anda benar-benar ingin membandingkan kode dunia nyata, gunakan alat-alat seperti Xdebug dan XHProf .
Xdebug sangat bagus untuk ketika Anda bekerja di dev / staging, dan XHProf adalah alat yang hebat untuk produksi dan aman untuk menjalankannya di sana (selama Anda membaca instruksi). Hasil dari setiap pemuatan satu halaman tidak akan sama relevannya dengan melihat bagaimana kinerja kode Anda ketika server dipalu untuk melakukan sejuta hal lainnya juga dan sumber daya menjadi langka. Ini menimbulkan pertanyaan lain: apakah Anda bottlenecking pada CPU? RAM? I / O?
Anda juga perlu melihat lebih dari sekadar kode yang Anda jalankan di skrip Anda hingga bagaimana skrip / halaman Anda disajikan. Server web apa yang Anda gunakan? Sebagai contoh, saya dapat membuat nginx + PHP-FPM secara serius melakukan mod_php + Apache, yang pada gilirannya akan dilanggar untuk menyajikan konten statis dengan menggunakan CDN yang baik.
Hal berikutnya yang perlu dipertimbangkan adalah apa yang ingin Anda optimalkan?
Yang pertama dapat dibantu dengan melakukan hal-hal seperti gzipping semua sumber daya yang dikirim ke browser, namun hal itu dapat (dalam beberapa keadaan) mendorong Anda lebih jauh dari pencapaian yang terakhir.
Semoga semua hal di atas dapat membantu menunjukkan bahwa pengujian 'lab' yang diisolasi dengan hati-hati tidak akan mencerminkan variabel dan masalah yang akan Anda temui dalam produksi, dan bahwa Anda harus mengidentifikasi apa tujuan tingkat tinggi Anda dan kemudian apa yang dapat Anda lakukan untuk sampai ke sana, sebelum menuju ke jalur mikro / prematur-optimasi ke neraka .
sumber
AllowOveride
menyebabkan Apache menelusuri seluruh direktori untuk file .htaccess pada setiap permintaan. Ini saja membuat Apache keluar dari caranya sendiri.Untuk mengukur seberapa cepat skrip lengkap Anda berjalan di server, ada banyak alat yang dapat Anda gunakan. Pertama pastikan skrip Anda (preg_match vs strpos misalnya) harus menampilkan hasil yang sama untuk memenuhi syarat pengujian Anda.
Kamu bisa memakai:
sumber
Anda akan ingin melihat Xdebug dan lebih khusus lagi, kemampuan profil Xdebug .
Pada dasarnya, Anda mengaktifkan profiler, dan setiap kali Anda memuat halaman web itu menciptakan sebuah file Cachegrind yang dapat dibaca dengan WinCacheGrind atau KCacheGrind .
Xdebug bisa agak sulit untuk dikonfigurasi jadi di sini adalah bagian yang relevan dari
php.ini
referensi saya :Dan di sini adalah tangkapan layar
.out
file di WinCacheGrind :Itu harus memberikan detail yang cukup tentang seberapa efisien skrip PHP Anda. Anda ingin menargetkan hal-hal yang membutuhkan waktu paling banyak. Misalnya, Anda dapat mengoptimalkan satu fungsi untuk mengambil setengah jumlah waktu, tetapi upaya Anda akan lebih baik mengoptimalkan fungsi yang disebut puluhan jika tidak ratusan kali selama memuat halaman.
Jika Anda penasaran, ini hanya versi lama dari CMS yang saya tulis untuk saya gunakan sendiri.
sumber
Coba https://github.com/fotuzlab/appgati
Hal ini memungkinkan untuk menentukan langkah-langkah dalam kode dan melaporkan waktu, penggunaan memori, beban server dll antara dua langkah.
Sesuatu seperti:
Contoh susunan keluaran:
sumber
SetMemory()
) bukanmixedCase()
omong kosong jelek tapi masih ada di mana-mana , yang praktis tidak ada gunanya di PHP. Anda mungkin terlalu tua. ;))Saya akan melihat ke xhprof . Tidak masalah apakah itu dijalankan pada cli atau melalui sapi lain (seperti fpm atau fcgi atau bahkan modul Apache).
Bagian terbaik tentang xhprof adalah bahkan cukup untuk dijalankan dalam produksi. Sesuatu yang tidak berfungsi dengan baik dengan xdebug (terakhir kali saya memeriksa). xdebug berdampak pada kinerja dan xhprof (saya tidak akan mengatakan tidak ada) mengelola jauh lebih baik.
Kami sering menggunakan xhprof untuk mengumpulkan sampel dengan lalu lintas nyata dan kemudian menganalisis kode dari sana.
Ini bukan benar-benar patokan dalam hal itu memberi Anda waktu dan semua itu, meskipun itu juga. Itu hanya membuatnya sangat mudah untuk menganalisis lalu lintas produksi dan kemudian menelusuri ke tingkat fungsi php dalam kaligrafi yang dikumpulkan.
Setelah ekstensi dikompilasi dan dimuat, Anda mulai membuat profil dalam kode dengan:
Untuk berhenti:
Kemudian simpan data ke file, atau basis data - apa pun yang mengapung beban Anda dan tidak menghentikan runtime biasa. Kami secara tak sinkron mendorong ini ke S3 untuk memusatkan data (untuk dapat melihat semua proses dari semua server kami).
The kode pada github berisi folder xhprof_html yang Anda dump pada server dan dengan konfigurasi minimal, Anda dapat memvisualisasikan data yang dikumpulkan dan mulai pengeboran bawah.
HTH!
sumber
Masukkan dalam satu
for
lingkaran untuk melakukan setiap hal 1.000.000 kali untuk mendapatkan angka yang lebih realistis. Dan hanya memulai timer tepat sebelum kode Anda benar-benar ingin melakukan benchmark, lalu catat waktu akhir tepat setelah (yaitu jangan memulai timer sebelumsession_start()
.Pastikan juga kodenya identik untuk setiap fungsi yang ingin Anda tolok ukur, dengan pengecualian fungsi yang Anda pilih waktunya.
Bagaimana skrip dieksekusi (cronjob, php dari commandline, Apache, dll.) Seharusnya tidak membuat perbedaan karena Anda hanya menghitung perbedaan relatif antara kecepatan fungsi yang berbeda. Jadi rasio ini harus tetap sama.
Jika komputer tempat Anda menjalankan benchmark memiliki banyak hal lain yang terjadi, ini dapat memengaruhi hasil benchmark jika terjadi lonjakan penggunaan CPU atau memori dari aplikasi lain saat benchmark Anda sedang berjalan. Tetapi selama Anda memiliki banyak sumber daya untuk cadangan di komputer maka saya tidak berpikir ini akan menjadi masalah.
sumber
Awal yang baik adalah menggunakan xdebug profiler http://xdebug.org/docs/profiler
Mungkin bukan hal yang paling mudah untuk diatur dan digunakan, tetapi begitu Anda mendapatkannya, volume data yang besar dan kemudahan melihat tidak tergantikan.
sumber
Eric,
Anda bertanya pada diri sendiri pertanyaan yang salah. Jika skrip Anda dieksekusi dalam ~ 15 mSec maka waktunya sebagian besar tidak relevan. Jika Anda menjalankan pada layanan bersama maka aktivasi gambar PHP akan memakan waktu ~ 100 mSec, membaca dalam file skrip ~ 30-50 mSec jika sepenuhnya di-cache di server, mungkin 1 atau lebih detik jika diambil dari pertanian NAS backend. Keterlambatan jaringan saat memuat halaman furnitur dapat menambah banyak detik.
Masalah utama di sini adalah persepsi pengguna tentang waktu buka: berapa lama ia harus menunggu di antara mengklik Tautan dan mendapatkan halaman yang sepenuhnya diterjemahkan. Lihatlah Google Page Speed yang dapat Anda gunakan sebagai Ff atau ekstensi chrome, dan dokumentasi Pagespeed yang membahas secara mendalam cara mendapatkan kinerja halaman yang baik. Ikuti panduan ini dan cobalah untuk mendapatkan skor halaman Anda lebih baik dari 90/100. (Halaman beranda google skor 99/100 seperti halnya blog saya). Ini adalah cara terbaik untuk mendapatkan kinerja yang dirasakan oleh pengguna.
sumber
Sebaiknya perhatikan kode PHP Anda dan periksa silang dengan tautan ini , untuk memastikan bahwa pengkodean Anda sendiri tidak berpotensi mengganggu kinerja aplikasi.
sumber