[Golang] How to benchmark and what is it
ห่างหายไปนานอีกแล้ว เกือบสองอาทิตย์ คิดอยู่ว่าจะเขียนเรื่องอะไรดี มีเรื่องในใจอยู่แล้วเรื่องนึง แต่ยังไม่บอกละกัน เนื่องจากด้วยเรื่องที่อยากจะเขียนนี้ละ เลยต้องมาอธิบายเรื่องการทำ Benchmark ใน Go กันก่อน ว่ามันคืออะไร
What is benchmark?
ถ้าไปเปิดพวกพจนานุกรมมันก็จะอธิบายบอกว่าคือการวัดคุณภาพผลิตภัณฑ์, โปรแกรม หรือ อื่นๆ และการเปรียบเทียบกับมาตรฐานหรือวัดค่าที่ควรจะเท่าเทียมกัน
แปลเป็นภาษาคนก็คือเอาไว้วัดคุณภาพ จบ
จุดประสงค์ของการทำ Benchmark ก็เพื่อที่จะวัดประสิทธิภาพและนำไปเพิ่มประสิทธิภาพให้กับ Code ที่เราสร้างนั้นเอง
แล้วทีนี้ ในภาษา Go เนี่ยเขาทำกันยังไงละ
How to benchmark in Golang
func BenchmarkYourFunction(b *testing.B) {
for n:=0; n < b.N; n++ {
// Insert you function here
}
}
ง่ายๆ เลย จากตัวอย่าง Code ด้านบน เห็นอะไรคุ้นๆไหม การเรียกใช้ package testing นั่นเอง เพราะว่าตัว benchmark ของ Go นั้นมันอยู่ใน package testing ยังไงละ
หลักการทำงานคล้ายกับการทำ test ที่เคยอธิบายไปที่ [Golang] Unit test ส่วนที่คล้ายกันคือตั้งชื่อฟังก์ชั่น สำหรับตัวนี้เราต้องตั้งชื่อ Benchmark นำหน้าตามด้วยชื่อฟังก์ชั่น เช่น BenchmarkYourFunction เป็นต้น และ Parameter ก็เป็น testing.B เพื่อเป็นการระบุว่า จะใช้ Benchmark ใน package testing
ภายใน BenchmarkYourFunction ก็จะประกอบไปด้วย loop for ที่ระบุจำนวน max loop ด้วย b.N ไอเจ้า b.N เนี่ย มันหมายถึงว่า ลูปมันจะเพิ่มไปเรื่อยๆ จนกว่าผลการทำงานจะเสถียร และ ฟังก์ชั่นที่ต้องการทดสอบต้องอยู่ใน loop เท่านั้น
และที่สำคัญชื่อไฟล์ต้องอยู่ใน format <something>_test.go ด้วยนะ
จะเห็นว่าปุ่มให้กดบนชื่อฟังก์ชั่นเหมือนตอนเราทำ unit test เลย เราสามารถกด run benchmark ไปเลยหรือ รันคำสั่งด้านล่าง แบบไหนก็ได้
go test -bench=. หรือ go test -bench=<ชื่อฟังก์ชั่น>
ถ้า กด run benchmark จะได้แบบในรูปที่ 2
ถ้าทำคำสั่ง go test -bench=BenchmarkHandleFormular จะได้ดังรูปที่ 3
เห็นไหมละ ง่ายนิดเดียว เท่านี้เราก็สามารถวัดประสิทธิภาพได้แล้วว่า Code ที่เราเขียนนั้น มีประสิทธิดีขึ้นหรือแย่ลง หากเรากำลัง tuning code อยู่ เพื่อให้มันทำง่ายเร็วขึ้นแล้วไม่รู้ว่ามันเร็วขึ้นจริงไหม ใช้ benchmark ทดสอบเลย
Checkout my github -> https://github.com/VisarutJDev/GolangBasicAPI/tree/master/doge-apis