วิธีการวัดประสิทธิภาพของสคริปต์ PHP


131

ฉันต้องการรู้ว่าอะไรคือวิธีที่ดีที่สุดในการเปรียบเทียบสคริปต์ PHP ของฉัน ไม่สำคัญว่างาน cron หรือเว็บเพจหรือบริการบนเว็บ

ฉันรู้ว่าฉันสามารถใช้ microtime ได้ แต่มันทำให้ฉันได้รับสคริปต์ PHP แบบเรียลไทม์หรือไม่

ฉันต้องการทดสอบและเปรียบเทียบฟังก์ชั่นมาตรฐานใน PHP ที่ทำสิ่งเดียวกัน ตัวอย่างเช่นpreg_matchvs strposหรือdomdocumentvs preg_matchหรือ preg_replace vs str_replace`

ตัวอย่างของหน้าเว็บ:

<?php
// login.php

$start_time = microtime(TRUE);

session_start(); 
// do all my logic etc...

$end_time = microtime(TRUE);

echo $end_time - $start_time;

สิ่งนี้จะแสดงผล: 0.0146126717 (เปลี่ยนแปลงตลอดเวลา - แต่นั่นคืออันสุดท้ายที่ฉันได้รับ) ซึ่งหมายความว่าใช้เวลา 0.015 หรือมากกว่านั้นในการรันสคริปต์ PHP

มีวิธีที่ดีกว่า?


อ่านบทความนี้: rakesh.sankar-b.com/2011/01/12/echo-print-which-is-fast-php - ฉันหวังว่ามันจะช่วยได้
Rakesh Sankar

4
0.015 วินาที ความเร็วในการกะพริบเฉลี่ยของตาคือ 0.3 วินาที คุณจริง ๆ ต้องปรับปรุงความเร็วนั้นจริง ๆ ฉันขอถามทำไม
เบ็น

4
@ben เป็นตัวอย่างฉันมีหน้าเว็บที่โหลดใน 0.8 วินาทีโดยมีผู้เข้าชมมากกว่า 50k ชั่วโมงต่อชั่วโมงฉันต้องตรวจสอบให้แน่ใจว่าหน้าเว็บโหลดเร็ว
eric

8
@MarcB Amazon ทดสอบอย่างชัดเจนและพบว่าความล่าช้า 100ms ทำให้ยอดขายลดลง 1% นั่นอาจเป็นพันล้านสำหรับเว็บไซต์ขนาดใหญ่เช่น Amazon highscalability.com/…
ceejayoz

1
@ceejayoz ใช่ถ้าคุณเป็นแอมะซอนนั่นเป็นปัญหาใหญ่ แต่ถ้าคุณไม่ระมัดระวังการไล่เวลาในการโหลดหน้าเว็บที่บ้าคลั่งเพื่อประโยชน์ของมัน อเมซอนทำการบ้านของพวกเขาและสามารถปรับการใช้จ่ายจำนวนชั่วโมงคนเพื่อเรียกคืนยอดขาย Y ในการคืนค่า บทเรียนที่นี่ทำการบ้านของคุณเอง!
James Butler

คำตอบ:


123

ถ้าคุณต้องการจริงมาตรฐานรหัสโลกแห่งความจริงใช้เครื่องมือเช่นXdebugและXHProf

Xdebug นั้นยอดเยี่ยมเมื่อคุณทำงานใน dev / staging และ XHProf เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการผลิตและปลอดภัยที่จะเรียกใช้ที่นั่น (ตราบใดที่คุณอ่านคำแนะนำ) ผลลัพธ์ของการโหลดหน้าเดียวใด ๆ จะไม่เกี่ยวข้องเท่าที่ดูว่าโค้ดของคุณมีประสิทธิภาพอย่างไรในขณะที่เซิร์ฟเวอร์กำลังใช้ค้อนทุบเพื่อทำสิ่งอื่นอีกนับล้านเช่นกันและทรัพยากรก็ขาดแคลน นี่ทำให้เกิดคำถามอื่น: คุณมีปัญหาคอขวดใน CPU หรือไม่? แกะ? I / O?

คุณต้องมองเกินกว่ารหัสที่คุณใช้ในสคริปต์เพื่อแสดงว่าสคริปต์ / หน้าที่ให้บริการของคุณ คุณใช้เว็บเซิร์ฟเวอร์แบบใด ตัวอย่างเช่นฉันสามารถทำให้ nginx + PHP-FPM ออกมาอย่างจริงจังดำเนินการ mod_php + Apache ซึ่งในทางกลับกันจะได้รับการตีกลับสำหรับการให้บริการเนื้อหาคงที่โดยใช้ CDN ที่ดี

สิ่งต่อไปที่ต้องพิจารณาคือสิ่งที่คุณพยายามปรับให้เหมาะสม

  • ความเร็วที่เพจแสดงในเบราว์เซอร์ผู้ใช้มีความสำคัญอันดับหนึ่งหรือไม่?
  • การขอแต่ละครั้งไปยังเซิร์ฟเวอร์ถูกส่งกลับมาเร็วที่สุดเท่าที่จะเป็นไปได้ด้วยการใช้ CPU ที่เล็กที่สุดตามเป้าหมายหรือไม่?

อดีตสามารถได้รับความช่วยเหลือโดยทำสิ่งต่าง ๆ เช่นการ gzipping ทรัพยากรทั้งหมดที่ส่งไปยังเบราว์เซอร์ แต่การทำเช่นนั้นอาจ (ในบางสถานการณ์) ผลักคุณออกห่างจากการบรรลุเป้าหมายในภายหลัง

หวังว่าทั้งหมดข้างต้นสามารถช่วยแสดงให้เห็นว่าการทดสอบ 'ห้องทดลอง' ที่แยกอย่างระมัดระวังจะไม่สะท้อนถึงตัวแปรและปัญหาที่คุณจะพบในการผลิตและคุณต้องระบุว่าเป้าหมายระดับสูงของคุณคืออะไรแล้วคุณจะทำอะไรได้บ้าง ก่อนที่จะมุ่งหน้าไปลงไมโคร / ก่อนวัยอันควรเพิ่มประสิทธิภาพเส้นทางที่จะไปนรก


6
หากสิ่งนี้ตอบคำถามของคุณได้อย่างแท้จริงฉันรู้สึกว่าคำถามของคุณถูกใช้อย่างไม่ถูกต้อง (หรือบางทีฉันแค่อ่านผิด) ตามคำถามของคุณดูเหมือนว่าคุณต้องการแยกวิธีการต่าง ๆ ในการทำสิ่งเดียวกันใน PHP และระบุว่าวิธีใดที่เร็วที่สุด อย่างไรก็ตามจากคำตอบที่คุณตอบรับและให้ความโปรดปรานดูเหมือนว่าคุณสนใจที่จะทำการทดสอบการโหลดของเว็บสแต็กทั้งหมดซึ่งเป็นสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง
Alec Gorge

Xdebug ไม่สนับสนุนสคริปต์ที่เข้ารหัสด้วย Ioncube คุณจะเปรียบเทียบบทเหล่านั้นได้อย่างไร
BigSack

@BigSack คุณเป็นแบบของตัวเองที่นั่นฉันไม่เคยลองทำอะไรที่ทำให้งงงวยเช่นนั้น ฉันจะได้ยิง XHProf ก่อนเพราะมันค่อนข้างง่ายที่จะวิ่ง คุณอาจพบว่า IonCube ขัดจังหวะอย่างสมบูรณ์กับ profiler ที่ไม่ใช่ของผู้ใช้
James Butler

1
คำสั่ง Nginx vs Apache ค่อนข้างเอนเอียงเล็กน้อย การละเลยส่วนใหญ่AllowOverideทำให้ Apache สำรวจไดเรกทอรีทั้งหมดสำหรับไฟล์. htaccess ในทุกคำขอ สิ่งนี้ทำให้ Apache ออกไปจากทางของมันเอง
B00MER

74

เพื่อเปรียบเทียบว่าสคริปต์ของคุณทำงานบนเซิร์ฟเวอร์ได้เร็วแค่ไหนมีเครื่องมือมากมายที่คุณสามารถใช้ได้ ก่อนอื่นให้แน่ใจว่าสคริปต์ของคุณ (ตัวอย่างเช่น preg_match vs strpos) จะต้องแสดงผลลัพธ์เดียวกันเพื่อให้มีคุณสมบัติการทดสอบของคุณ

คุณสามารถใช้ได้:


30

คุณจะต้องดูที่Xdebugและเฉพาะเจาะจงมากขึ้นความสามารถในการทำโปรไฟล์ของ Xdebugความสามารถในโปรไฟล์

โดยทั่วไปคุณเปิดใช้งาน profiler และทุกครั้งที่คุณโหลดเว็บเพจมันจะสร้างไฟล์ cachegrind ที่สามารถอ่านได้ด้วยWinCacheGrindหรือKCacheGrind KCacheGrind

Xdebug อาจเป็นเรื่องยุ่งยากเล็กน้อยในการกำหนดค่าดังนั้นนี่คือส่วนที่เกี่ยวข้องในphp.iniการอ้างอิงของฉัน:

[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

และนี่คือภาพหน้าจอของ.outไฟล์ในWinCacheGrind :

ป้อนคำอธิบายรูปภาพที่นี่

ที่ควรให้รายละเอียดมากมายเกี่ยวกับประสิทธิภาพของสคริปต์ PHP ของคุณ คุณต้องการกำหนดเป้าหมายสิ่งต่าง ๆ ที่ใช้เวลามากที่สุด ตัวอย่างเช่นคุณสามารถปรับฟังก์ชั่นหนึ่งฟังก์ชั่นเพื่อใช้เวลาครึ่งหนึ่ง แต่ความพยายามของคุณจะได้รับการปรับปรุงการใช้งานฟังก์ชั่นที่ดีกว่าที่เรียกว่าหลายสิบถ้าไม่ใช่หลายร้อยครั้งในระหว่างการโหลดหน้าเว็บ

หากคุณอยากรู้อยากเห็นนี่เป็นเพียง CMS เวอร์ชันเก่าที่ฉันเขียนเพื่อการใช้งานของฉันเอง


8
ดูเหมือนจะซับซ้อนมากฉันไม่เข้าใจสิ่งใด
eric

ส่วนไหนที่คุณไม่เข้าใจ การตั้งค่าหรือวิเคราะห์ข้อมูล
Alec Gorge

1
ไม่มีการตั้งค่าที่จะไม่ทำงานบนเซิร์ฟเวอร์ของฉัน แต่ข้อมูลมันเป็นกล่องเล็ก ๆ ทั้งหมดที่ฉันไม่สามารถอ่านได้
eric

13
เพราะฉันไม่ได้ใช้ windows
eric

2
+1 สำหรับ XDebug + KCacheGrind มันเป็นประโยชน์อย่างมากและง่ายต่อการติดตั้งและใช้งาน ฉันเคยใช้มันมาซักพักแล้วโบนัสเพิ่มที่คุณได้รับ - คุณกลายเป็น familliar กับมันคุณสามารถใช้ KCacheGrind with Valgrind (+ memgrind / callgrind) เพื่อสร้างโปรไฟล์ภาษาอื่น ๆ อีกมากมาย (ไม่ใช่เฉพาะเวลา CPU)
XzKto

16

ลอง https://github.com/fotuzlab/appgati

อนุญาตให้กำหนดขั้นตอนในรหัสและเวลารายงานการใช้หน่วยความจำโหลดเซิร์ฟเวอร์ ฯลฯ ระหว่างสองขั้นตอน

สิ่งที่ต้องการ:

    $appgati->Step('1');

    // Do some code ...

    $appgati->Step('2');

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

อาร์เรย์เอาต์พุตตัวอย่าง:

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
)

2
อินเทอร์เฟซการออกแบบที่น่ารัก (ตามที่ฉันเห็นคุณเป็นผู้เขียน), grats! (และขอบคุณสำหรับการใช้ "ProperCase";) ชื่อเมธอด (เช่นSetMemory()) แทนที่จะเป็นmixedCase()อึที่น่าเกลียด แต่ก็ยังคงแพร่หลายซึ่งไม่มีจุดหมายจริงใน PHP คุณอาจแก่เกินไป ;))
Sz.

1
ล้าสมัยอย่างสมบูรณ์ แต่ด้วยสองสามนาทีฉันเปลี่ยนเป็นสิ่งที่ดีและมีประโยชน์ (แม้ในหน้าต่าง) ฉันจะพยายามดูว่าฉันสามารถทำคำขอดึง
Tomas Gonzalez

7

ฉันมองเข้าไปในxhprof ไม่สำคัญว่าจะทำงานบน cli หรือผ่าน sapi อื่น (เช่น fpm หรือ fcgi หรือแม้แต่โมดูล Apache)

ส่วนที่ดีที่สุดเกี่ยวกับ xhprof คือมันยังพอดีเพียงพอที่จะทำงานในการผลิต สิ่งที่ใช้งานไม่ได้กับ xdebug (ครั้งล่าสุดที่ฉันตรวจสอบ) xdebug มีผลกระทบต่อประสิทธิภาพการทำงานและ xhprof (ฉันจะไม่บอกว่าไม่มีเลย) จัดการได้ดีกว่ามาก

เราใช้ xhprof เพื่อรวบรวมตัวอย่างด้วยปริมาณการใช้งานจริงแล้ววิเคราะห์รหัสจากที่นั่น

ไม่ใช่มาตรฐานในแง่ที่ทำให้คุณมีเวลาและทุกอย่างแม้ว่าจะทำเช่นนั้นเช่นกัน มันทำให้ง่ายมากในการวิเคราะห์ปริมาณการใช้งานจริงแล้วเจาะลึกลงไปถึงระดับฟังก์ชัน php ใน callgraph ที่เก็บรวบรวม

เมื่อส่วนขยายได้รับการรวบรวมและโหลดแล้วคุณจะเริ่มทำโปรไฟล์ในรหัสด้วย:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

หากต้องการหยุด:

$xhprof_data = xhprof_disable();

จากนั้นบันทึกข้อมูลลงในไฟล์หรือฐานข้อมูลไม่ว่าคุณจะลอยเรืออะไรก็ตามและจะไม่หยุดทำงานตามปกติ เราทำการซิงโครไนซ์สิ่งนี้กับ S3 เพื่อรวมศูนย์ข้อมูล (เพื่อให้สามารถเห็นการทำงานทั้งหมดจากเซิร์ฟเวอร์ทั้งหมดของเรา)

โค้ดบน GitHubมีโฟลเดอร์ xhprof_html ที่คุณถ่ายโอนข้อมูลบนเซิร์ฟเวอร์และกับการกำหนดค่าน้อยคุณจะสามารถมองเห็นภาพข้อมูลที่เก็บรวบรวมและเริ่มการขุดเจาะลง

HTH!


3

ใส่มันลงในforลูปเพื่อทำแต่ละอย่าง 1,000,000 ครั้งเพื่อให้ได้ตัวเลขที่สมจริงยิ่งขึ้น และเริ่มจับเวลาก่อนรหัสที่คุณต้องการมาตรฐานแล้วบันทึกเวลาสิ้นสุดหลังจากนั้น (เช่นอย่าเริ่มจับเวลาก่อนsession_start()(เช่นไม่เริ่มจับเวลาก่อน

ตรวจสอบให้แน่ใจว่ารหัสนั้นเหมือนกันสำหรับแต่ละฟังก์ชั่นที่คุณต้องการวัดประสิทธิภาพยกเว้นฟังก์ชันที่คุณกำหนดเวลา

วิธีการเรียกใช้งานสคริปต์ (cronjob, php จาก commandline, Apache, ฯลฯ ) ไม่ควรสร้างความแตกต่างเนื่องจากคุณเพียงกำหนดเวลาความแตกต่างสัมพัทธ์ระหว่างความเร็วของฟังก์ชั่นที่แตกต่างกัน ดังนั้นอัตราส่วนนี้ควรคงเดิม

หากคอมพิวเตอร์ที่คุณใช้งานเบนช์มาร์กมีสิ่งอื่น ๆ อีกมากมายเกิดขึ้นสิ่งนี้อาจส่งผลต่อผลลัพธ์ของเบนช์มาร์กหากมีการขัดขวางการใช้งาน CPU หรือหน่วยความจำจากแอปพลิเคชันอื่นในขณะที่ แต่ตราบใดที่คุณมีทรัพยากรจำนวนมากที่ต้องสำรองไว้ในคอมพิวเตอร์แล้วฉันไม่คิดว่ามันจะเป็นปัญหา


1

การเริ่มต้นที่ดีคือการใช้ xdebugs profiler http://xdebug.org/docs/profiler

อาจไม่ใช่สิ่งที่ง่ายที่สุดในการตั้งค่าและใช้งาน แต่เมื่อคุณได้รับข้อมูลจำนวนมากและการดูง่ายไม่สามารถถูกแทนที่ได้


0

เอริค

คุณกำลังถามคำถามผิดกับตัวเอง หากสคริปต์ของคุณทำงานใน ~ 15 mSec ดังนั้นเวลาของสคริปต์จะไม่เกี่ยวข้องกันอย่างมาก หากคุณใช้บริการที่ใช้ร่วมกันการเปิดใช้งานรูปภาพ PHP จะใช้เวลาประมาณ ~ 100 mSec การอ่านในไฟล์สคริปต์ ~ 30-50 mSec หากแคชไว้ในเซิร์ฟเวอร์อย่างสมบูรณ์อาจเป็นเวลา 1 วินาทีหรือมากกว่าถ้าโหลดจากฟาร์ม NAS ด้านหลัง เครือข่ายล่าช้าในการโหลดเฟอร์นิเจอร์หน้าสามารถเพิ่มจำนวนมากวินาที

ปัญหาหลักของที่นี่คือการรับรู้ของผู้ใช้เกี่ยวกับความเร็วในการโหลด: เขาต้องรอนานแค่ไหนระหว่างคลิกที่ลิงค์และได้รับหน้าที่แสดงผลอย่างสมบูรณ์ ดูที่Google Page Speedซึ่งคุณสามารถใช้เป็น Ff หรือส่วนขยายของโครเมี่ยมและเอกสาร Pagespeed ซึ่งกล่าวถึงในเชิงลึกเกี่ยวกับวิธีการรับประสิทธิภาพของหน้าเว็บที่ดี ปฏิบัติตามหลักเกณฑ์เหล่านี้และพยายามให้คะแนนหน้าของคุณดีกว่า 90/100 (หน้าแรกของ google ให้คะแนน 99/100 เช่นเดียวกับบล็อกของฉัน) นี่เป็นวิธีที่ดีที่สุดในการเพิ่มประสิทธิภาพการรับรู้ของผู้ใช้


0

นอกจากนี้ยังเป็นการดีที่จะคอยจับตาดูโค้ด PHP ของคุณและตรวจสอบอย่างละเอียดด้วยลิงก์นี้เพื่อให้แน่ใจว่าการเข้ารหัสของคุณไม่รบกวนประสิทธิภาพการทำงานของแอป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.