เห็นในกลุ่มภาษา Go Thailand ที่ Facebook นั้นมีการใช้งาน Benchmark
สำหรับวัดประสิทธิภาพการทำงานของ code ที่เขียนด้วยภาษา Go
จึงทำการสรุปวิธีการใช้งานไว้นิดหน่อย
ซึ่งมันง่ายมาก ๆ เพราะว่า เป็น package ที่มีมาในภาษา Go อยู่แล้ว
มาเริ่มกัน

อย่างแรกเลย Benchmark จะอยู่ใน package testing นั่นเอง

ช่วยวัดประสิทธิภาพการทำงาน code ที่เขียนด้วยภาษา Go
ทั้งความเร็ว
ทั้งการใช้งาน resource ต่าง ๆ
การใช้งานเป็นดังนี้

เราจะเขียนไว้ในไฟล์ test นั่นเอง
ชื่อ function สำหรับการทดสอบ Benchmark นั้น
จะขึ้นต้นด้วยคำว่า Benchmark ตามด้วยตัวอักษรใหญ่ของชื่อ testcase
ตัวอย่างเช่น

คำอธิบาย
เขียนเหมือนกับชุดการทดสอบปกติเลย
แต่มีข้อแตกต่างนิดหน่อยดังนี้

  • ชื่อขึ้นต้นด้วยคำว่า Benchmark
  • parameter ของ function จะเป็น testing.B
  • ทำการ run หลาย ๆ ครั้ง โดยที่ค่า b.N จะเพิ่มขึ้นเรื่อย ๆ จนกว่าผลการทำงานจะมีค่าที่เสถียร
  • function ที่ต้องทำการทดสอบต้องอยู่ใน loop ลักษณะนี้เท่านั้น

การ run ก็ไม่ยากเลย ดังนี้
ซึ่งต้องส่ง flag -bench เข้ามาในการทดสอบ สำหรับ run ทุก test case
นั่นหมายความสามารถสามารถใส่ชื่อ test case ที่ต้องการ run ได้อีกนะ

$go test -bench=.

หรือใส่ flag -run สำหรับชุดการทดสอบที่ต้องการเท่านั้น เช่น

$go test -run=XXXXXXX -bench=.

ยกตัวอย่างจากโจทย์ของกลุ่มภาษา Go ดังนี้

เลยนำมาทำ benchmark ตามที่พี่อูทำไว้บ้าง
ได้ผลการทำงานดังนี้

คำอธิบายจากผลการทดสอบ
พบว่าแต่ละ test case ที่วัดผลมีเวลาการทำงานที่ต่างกัน
คือ 1,297 และ 168 nanosecond ยิ่งตัวเลขต่ำยิ่งเร็ว
ส่วนเลข 1,000,000 และ 10,000,000 จำนวนสูงสุดที่ run ใน 1 วินาที (ค่า duration ซึ่งเปลี่ยนได้ผ่าน flag -benchtime)

ถ้าอยากรู้ว่าแต่ละ function ใช้ memory ไปเท่าไร ?

ทำได้ดังนี้ เพิ่ม flag -benchmem เข้าไป ดังนี้

จะเห็นว่า BenchmarkChonlasith
ในแต่ละรอบนั้นใช้ memory เฉลี่ยไป 208 byte
มีการ allocate หรือจองไป 8
เป็นค่าที่มีประโยชน์สำหรับการปรับปรุง code ต่อไป
เพื่อให้ลดการใช้งาน memory ลง ดังชุด code ที่ 2 นั่นเอง

โดยที่ source code เอาไว้ที่ Github::Benchmark with Go

อย่า optimize code เยอะจนอ่านกันไม่รู้เรื่องนะ
Make it work
Make it right
Make it fast

แล้วยังสามารถนำไปวิเคราะห์การใช้งาน CPU/RAM หรือทำพวก profiling ได้อีกนะ

ขอให้สนุกกับการเขียน code