PHP: รู้ทันทีว่า function ไหนทำงานช้า แบบ “จับวาง”

Chainarong Tangsurakit
rootuser.cc
Published in
1 min readApr 18, 2015

ต่อจาก blog บอกวิธี Debug ด้วย xDebug

อีกหนึ่งความสามารถ ก็คือการทำ “Profiling”
หรือการตรวจสอบระยะเวลาการทำงานของ Application ในแต่ละส่วน

ซึ่ง xDebug ก็แถมความสามารถนี้มาด้วย ผลลัพธ์ของการเปิดฟังก์ชั่นนี้ จะได้ file cachegrind.out

แล้วเอาไปเปิดด้วยโปรแกรมต่างๆ เช่น QCacheGrind (OSX) หรือ KCacheGrind (Windows, Linux) ก็จะได้ผลลัพธ์ตามรูปประกอบ

จากรูปประกอบ ส่วนที่วงด้วยสีแดง คือส่วนที่ทำงานช้า ถ้าอยากรู้ว่ามันอยู่ตรงไหน ก็เปิด Tab ไปดู Sourcecode ตามรูปประกอบ ไล่ดูบรรทัดที่ทำงานช้า ก็จะเจอบรรทัดที่ 325–326 ที่เป็นตัวการ

การแปรผล ก็ให้ดูใน field “Self” และ “Called” ตัวอย่างการแปรผล เช่น

มีการเรียกฟังก์ชั่น getimagesize ทั้งหมด 24 ครั้ง และกินเวลา 36.44% ของเวลาทั้งหมด

ก็สามารถไปไล่ code จริงว่า สามารถ optimize อะไรได้บ้างไหม จัดลำดับการทำงานใหม่ เพื่อลดความซ้ำซ้อน เป็นต้น

วิธีการติดตั้ง

1. Enable Profiling โดยแก้ใน php.ini ต่อท้าย xdebug เมื่อกี้ ตามนี้

xdebug.profiler_enable = 1
xdebug.profiler_output_name = xdebug.out.%t
xdebug.profiler_output_dir = /tmp

2. เมื่อ run เว็บแต่ละครั้ง ก็จะมี file xdebug.out.* เกิดใหม่ที่ directory ที่เรากำหนด
(ถ้าไม่อยากให้มันทำงานทุกครั้ง ให้ใช้ค่า xdebug.profiler_enable_trigger = 1 แทน profiler_enable แล้วใช้ chrome xdebug extension enable profiling แทน

3. Install QCacheGrind ขั้นตอนนี้ยากสุด มั่วๆ มาจนได้วิธีทำนองว่า
3.1 Install QT Binary ก่อน http://qt.nokia.com/downloads/qt-for-open-source-cpp-development-on-mac-os-x/
3.2 brew install qcachegrind แล้วไปเอา .app ใน brew directory มาย้ายลงใน Applications แล้วก็เปิด App ได้เลย

ถ้า install ตามนี้ไม่ได้ ลองอ่านใน http://www.tekkie.ro/computer-setup/how-to-install-kcachegrind-qcachegrind-on-mac-osx/หรือ http://nickology.com/2014/04/16/view-xdebug-cachegrind-files-on-mac-os/ ดู

จบบริบูรณ์

--

--