บทความนี้ตอนแรกจะชื่อว่า “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 ซะงั้น