จากงาน Golang meetup ครั้งที่ 1 ของกลุ่ม Golang Thailand
มีการพูดถึงเรื่องการทำ profiling ทั้ง CPU และ Memory
ทำการวิเคราะห์และหา code ที่ใช้ทรัพยากรมากเกินไป
เพื่อทำการปรับปรุงประสิทธิภาพการทำงานของ code ให้ดีขึ้น
ดังนั้นลองมาฝึกกันหน่อยสิ
เริ่มด้วย code ที่เขียนเอาไว้ แน่นอนว่าต้องมีชุดการทดสอบด้วย
เป็น code ของระบบ web application ว่าด้วยการบวกเลข !!
มันจะง่ายไปไหม ? แต่ไม่เป็นไร !!
โดยใน code นั้นมีการทำงานดังนี้
- รับจากจาก query string มีสองตัวคือ operand1 และ operand2
- ทำการแปลงข้อมูลจาก String เป็น Int
- ทำการบวกเลข
- ผลลัพธ์แสดงออกมาด้วย template
code เริ่มต้นเป็นดังนี้
มีชุดการทดสอบดังนี้
ก่อนจะทำอะไรต่อไปต้องทดสอบให้ผ่านก่อน !!
$go test
จากนั้นมาเริ่มทำ CPU profiling กันเลย
ด้วยคำสั่ง
$go test -run none -bench . -benchtime 3s -benchmem -cpuprofile cpu.out
ได้ผลการทำงานดังนี้
ทำการวิเคราะห์ CPU profile ด้วย pprof
$go tool pprof profiling.test cpu.out
จากนั้นจะเข้าสู่ interactive mode (สำหรับมือใหม่จะงงมาก ๆ ว่าต้องพิมพ์อะไรต่อไป)
สามารถอ่านเพิ่มเติมได้ที่ Golang :: Blog :: Profiling go program
Entering interactive mode (type "help" for commands) (pprof)
ต้องการดูว่ามี function ไหนบ้างใช้งาน CPU เยอะ ๆ ด้วย top20
ต้องการดู function ที่ใช้งานเยอะ ๆ แบบชัด ๆ
function handleAdd() ใช้ CPU เยอะเลยนะ
ไปดูใน function นี้กันหน่อยสิ
ยังไม่พอ มาดูในรูปแบบกราฟกันหน่อย
ด้วยการใส่คำสั่ง web list handleAdd
แสดงผลดังนี้
มาถึงต้องนี้ทำให้เราเห็นว่า
บรรทัดที่ 24 เข้าใช้งาน CPU ถึง 4.92 วินาที !!
น่าจะเป็นจัดที่น่าสนใจ เพื่อทำงาน optimize code ต่อไปนะ
สิ่งที่ใช้เวลาการทำงานเยอะ ๆ คือ
การเปิดไฟล์ template ขึ้นทำงานนั่นเอง
นั่นคือ function template.parseFile() !!
จาก code จะเห็นว่าทำการ parseFile() ทุก request
ซึ่งเป็นวิธีการที่แย่มาก ๆ
ดังนั้นมาทำการแก้ไข code ดีกว่า
ด้วยการ parseFile() ครั้งเดียวพอ
จากนั้นทำการทดสอบใหม่อีกรอบ
สังเกตุไหมว่า performance ดีขึ้นเยอะมาก ๆ
ลองดูกราฟสิ
อีกสักนิดลองทำการเปรียบเทียบผลการทดสอบด้วย benchcmp นิดหน่อย
มาถึงตรงนี้เราทำเพียง CPU profiling นะ
ยังเหลือ Memory profiling อีกนะ แต่เอาไว้ก่อนดีกว่า !!
โดย code ที่ใช้งานอยู่ที่ Github :: Web Add Number
ขอให้สนุกกับการ coding ครับ
Reference Websites
https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go
https://medium.com/@hackintoshrao/analyzing-benchmarks-with-ease-using-benchcmp-and-benchviz-golang-add607fc46d6