เปรียบเทียบ Performance PHP Framework ด้วย XHProf

บทความนี้ตอนแรกจะชื่อว่า “Fat-Free Framework ในมุมมองคนใช้ Laravel มืออาชีพ” แต่ตอนนี้พอผมเขียนเสร็จกลายเป็นบทความ “เปรียบเทียบ Performance PHP Framework ด้วย XHProf” ดังนั้น โปรดทำใจก่อนอ่านครับ

—————————————

ก่อนอื่นขอออกตัวเองแบบล้อฟรีเลยว่าเป็นสาวก Laravel ใช้มาตั้งแต่เวอร์ชั่น 3 (กับระบบ bundle ที่ปวดตับ) จนมาถึงตอนนี้กับ 5.2 เอาเป็นว่าคือรู้ไส้รู้พุงมันดีล่ะ

พอดีช่วงนี้เริ่มจะทำเว็บใหม่ เลยมองหาอะไรที่มันเบาๆ เบาจริงๆ เพราะส่วน server ไม่หนัก ที่ต้องเขียนเยอะดันเป็น js ซะอย่างงั้น ว่าแล้วผมจะพาตัวเองออกทะเลซะอย่างงั้น

กลับเข้าเรื่องคือผมจะมาอธิบายถึงมุมมองของคนใช้ Laravel ที่มีต่อ F3 หรือ Fat-Free Framework กันเลย

ก่อนอื่นก่อนเราจะเริ่มใช้ แน่นอนผมก็คิดว่า benchmark มันซะก่อนเลย ซึ่งสเปคที่ใช้ทดสอบ ก็ง่ายๆ คือ Ubuntu ใน Virtualbox ติด Apache2 + PHP แบบ Modules แล้ววัดเวลาด้วย XHProf ซึ่งใครไม่เคยใช้แนะนำให้อ่านบทความ วิธีติดตั้ง XHProf ติดแล้วลองเล่นกันดู

นอกนั้นตามสเต๊ป ติดตั้งสด จิ้ม refresh สองทีเพื่อความนิ่งแล้วดูเวลา

ผลที่ได้คือ

Laravel v5.2.7 — 132,107 microsecs
F3 v3.5.1 — 70,438 microsecs

มาถึงตอนนี้ผมอึ้งครับ “แค่เนี่ย??” คือมันไม่ใช่อย่างที่หวังครับ มันดูน้อยไป ผมเลยคิดว่า F3 มันต้องมีอะไรที่กินเวลาเยอะเกินไป ซึ่งในรายงาน xhprof ผมเลยกดเรียง Excl. Wall Time ซึ่งพบว่าที่กินเวลามากสุดคือฟังค์ชั่นเกี่ยวกับการ auto escape variable ดังนั้นผมเลยปิดมันซะ เพราะตามปกติเราต้องป้องกันตรงนี้เอา อาจจะสร้างฟังค์ชั่น _e มาใช้เองเลย

$f3->set('ESCAPE', false);

หลังจากผมใส่คำสั่งนี้ไป และแก้เพิ่มคือปิด View ตัว content เพราะข้างในมีคำสั่งเช็ค PHP Extension ซึ่งมันไม่ควรใช้งานอยู่แล้ว (หน้า demo ของ F3) แล้วตรวจจับเวลาอีกที

F3 (Disabled auto escape view token) — 14,801 microsecs

นี้สิที่ใช่!!! ตอนนี้เบื้องต้นเลยสรุปได้ว่ามันแรงดีนะ แต่นอกจากนั้น เดี๋ยวต้องทดสอบกับ Framework อีกสักสองตัว เอาให้ตัวเองหายสงสัยกันไปเลย คือ Slim CI3 และ Lumen ว่าแล้วก็ติดตั้งแล้วทดสอบแปปหนึ่ง….

Slim v3.0.0 — 95,409 microsecs
Codeigniter v3.0.3 — 90,255 microsecs
Lumen v5.2.1 — 37,715 microsecs

จากผลอันนี้ก็เล่นเอาผมอึ้งเหมือนกัน ผมเคยอ่านรายงานที่ได้จาก xhprof สรุปได้ดังนี้

Slim ช้าเพราะคำสั่ง file_exists ที่เรียกจาก composer มีการเรียก 59 ครั้ง คือไฟล์จะเยอะไปไหนครับ แค่เริ่มเองนะ (ใช้เวลาเป็นสัดส่วนจากทั้งหมด 54.4%)

Codeigniter ที่ไม่น้อยหน้าก็เพราะ file_exists เหมือนกัน เรียกไป 51 ครั้ง แต่ CI เรียกเอง เพราะไม่ได้ใช้ composer (ใช้เวลาเป็นสัดส่วนจากทั้งหมด 44.1%)

ส่วน Lumen ที่น้อย เพราะ file_exists จาก composer เรียก 16 ครั้ง เลยทำให้กินไม่เยอะ (ใช้เวลาเป็นสัดส่วนจากทั้งหมด 59.6%)

จากข้างบน จะเห็นว่าผมบ่นเรื่อง file_exists ใน composer แทนซะอย่างงั้น เพราะเรื่องนี้ผมเคยพิมพ์และบอกกับคนรู้จักหลายครั้งมากว่ามันกินระบบ ต่อให้เรามี opcode cache แต่คำสั่ง file_exists ก็ยังเรียก HDD ให้เกิด IO อยู่ดี (ลืมบอกแต่แรกว่าคอมผมเป็น SSD)

ตอนนี้เลยเอาแค่ Lumen ล่ะกัน ผมจัดการโม composer autoload นิดหน่อยโดยการเอา file_exists ออกให้หมด ผลที่ได้

Lumen (composer autoload modified) — 12,714 microsecs

บอกเลย … ณ จุดๆ นี้ ที่หัวบทความผมพูดถึง F3 เพราะคิดว่าจะใช้มัน เบาแน่ๆ แต่ตอนนี้คือ F3 ไม่มี composer ใช้ require ง่อยๆ ส่วน Lumen ก็จากที่ไล่มา ตอนนี้กลับไวที่สุด… ซะงั้น!!?

เอาเป็นว่าตอนนี้จะยังไม่มีภาคสองของบทความนี้ครับ ขอบคุณ XHProf ที่ทำผมออกทะเล สงสัยเดี๋ยวย้อนกลับไปแก้หัวบทความดีกว่าครับ กลายเป็นการเปรียบเทียบ PHP Framework ซะงั้น

Leave a Reply