Cara mengukur efisiensi skrip PHP

131

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_matchvs strposatau domdocumentvs preg_matchatau 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?

eric
sumber
Baca artikel ini: rakesh.sankar-b.com/2011/01/12/echo-print-which-is-fast-php - Saya harap ini membantu.
Rakesh Sankar
4
0,015 detik. Kecepatan berkedip rata-rata mata adalah 0,3 detik. Apakah Anda benar-benar perlu meningkatkan kecepatan itu, bolehkah saya bertanya mengapa?
Ben
4
@ Ben itu adalah contoh, saya punya halaman yang dimuat dalam 0,8 detik dengan lebih dari 50k pengunjung per jam saya harus memastikan halaman memuat dengan cepat
eric
8
@MarcB Amazon ternyata diuji dan menemukan bahwa keterlambatan 100 ms menyebabkan 1% penurunan penjualan. Itu bisa miliaran untuk situs besar seperti Amazon. highscalability.com/…
ceejayoz
1
@ceejayoz Ya, jika Anda amazon maka itu adalah masalah besar, tetapi jika Anda tidak waspada hanya mengejar waktu pemuatan halaman gila demi hal itu. Amazon melakukan pekerjaan rumah mereka dan karena itu dapat dengan mudah membenarkan menghabiskan jumlah jam kerja X untuk mengklaim kembali penurunan penjualan Y. Pelajaran di sini adalah mengerjakan pekerjaan rumah Anda sendiri!
James Butler

Jawaban:

123

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?

  • Apakah kecepatan halaman yang dirender di browser menjadi prioritas nomor satu?
  • Apakah mendapatkan setiap permintaan ke server terlempar keluar secepat mungkin dengan konsumsi CPU terkecil?

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 .

James Butler
sumber
6
Jika ini benar-benar menjawab pertanyaan Anda, saya merasa pertanyaan Anda salah ditulis (atau mungkin saya salah membacanya). Berdasarkan pertanyaan Anda, sepertinya Anda ingin mengisolasi berbagai metode melakukan hal yang sama dalam PHP dan mengidentifikasi mana yang tercepat. Namun, berdasarkan jawaban yang Anda terima dan berikan hadiah, tampaknya Anda lebih tertarik melakukan pengujian beban seluruh tumpukan web - yang merupakan sesuatu yang sangat berbeda.
Alec Gorge
Xdebug tidak mendukung skrip yang disandikan Ioncube. Bagaimana Anda mengatur skrip itu?
BigSack
@BigSack Anda agak sendirian di sana, saya belum pernah mencoba membuat profil apa pun yang dikaburkan seperti itu. Saya akan mencoba XHProf terlebih dahulu karena itu relatif mudah untuk dijalankan. Anda mungkin menemukan bahwa IonCube sepenuhnya berinteraksi dengan profiler yang bukan pengguna.
James Butler
1
Pernyataan Nginx vs Apache agak bias. Kebanyakan pengabaian AllowOveridemenyebabkan Apache menelusuri seluruh direktori untuk file .htaccess pada setiap permintaan. Ini saja membuat Apache keluar dari caranya sendiri.
B00MER
74

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:

Kitab Zeus
sumber
30

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.inireferensi saya :

[XDebug]
zend_extension = h:\xampp\php\ext\php_xdebug-2.1.1-5.3-vc6.dll
xdebug.remote_enable=true
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=h:\xampp\cachegrind
xdebug.profiler_output_name=callgrind.%t_%R.out

Dan di sini adalah tangkapan layar .outfile di WinCacheGrind :

masukkan deskripsi gambar di sini

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.

Alec Gorge
sumber
8
tampaknya sangat rumit, saya tidak mengerti apa
eric
Bagian mana yang tidak kamu mengerti? Pengaturan atau menganalisis data?
Alec Gorge
1
baik pengaturan tidak, itu tidak akan pernah berfungsi di server saya tetapi data, semua kotak kecil saya tidak bisa membaca
eric
13
karena saya tidak menggunakan windows
eric
2
+1 untuk XDebug + KCacheGrind. Ini sangat membantu dan secara mengejutkan mudah dipasang dan digunakan. Saya telah menggunakannya selama beberapa waktu, bonus tambahan yang Anda dapatkan - yang Anda menjadi terbiasa dengannya, Anda dapat menggunakan KCacheGrind dengan Valgrind (+ memgrind / callgrind) untuk membuat profil lebih banyak bahasa lain (dan tidak hanya waktu CPU).
XzKto
16

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:

    $appgati->Step('1');

    // Do some code ...

    $appgati->Step('2');

    $report = $appgati->Report('1', '2');
    print_r($report);

Contoh susunan keluaran:

Array
(
    [Clock time in seconds] => 1.9502429962158
    [Time taken in User Mode in seconds] => 0.632039
    [Time taken in System Mode in seconds] => 0.024001
    [Total time taken in Kernel in seconds] => 0.65604
    [Memory limit in MB] => 128
    [Memory usage in MB] => 18.237907409668
    [Peak memory usage in MB] => 19.579357147217
    [Average server load in last minute] => 0.47
    [Maximum resident shared size in KB] => 44900
    [Integral shared memory size] => 0
    [Integral unshared data size] => 0
    [Integral unshared stack size] => 
    [Number of page reclaims] => 12102
    [Number of page faults] => 6
    [Number of block input operations] => 192
    [Number of block output operations] => 
    [Number of messages sent] => 0
    [Number of messages received] => 0
    [Number of signals received] => 0
    [Number of voluntary context switches] => 606
    [Number of involuntary context switches] => 99
)
fotuzlab
sumber
2
Desain antarmuka yang indah (seperti yang saya lihat Anda adalah penulisnya), kawan! (Dan terima kasih telah menggunakan "ProperCase";) nama metode (seperti SetMemory()) bukan mixedCase()omong kosong jelek tapi masih ada di mana-mana , yang praktis tidak ada gunanya di PHP. Anda mungkin terlalu tua. ;))
Sz.
1
Benar-benar ketinggalan jaman tetapi dengan beberapa menit saya mengubahnya menjadi sesuatu yang bagus dan berguna (bahkan di windows). Saya akan mencoba melihat apakah saya dapat membuat permintaan penarikan.
Tomas Gonzalez
7

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:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Untuk berhenti:

$xhprof_data = xhprof_disable();

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!

Sampai
sumber
3

Masukkan dalam satu forlingkaran 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.

Alasdair
sumber
1

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.

kambing
sumber
0

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.

TerryE
sumber
0

Sebaiknya perhatikan kode PHP Anda dan periksa silang dengan tautan ini , untuk memastikan bahwa pengkodean Anda sendiri tidak berpotensi mengganggu kinerja aplikasi.

Ritesh Aryal
sumber