[Golang] How to benchmark and what is it

Visarut Junsone
Lazy-Dev
Published in
2 min readApr 17, 2019

ห่างหายไปนานอีกแล้ว เกือบสองอาทิตย์ คิดอยู่ว่าจะเขียนเรื่องอะไรดี มีเรื่องในใจอยู่แล้วเรื่องนึง แต่ยังไม่บอกละกัน เนื่องจากด้วยเรื่องที่อยากจะเขียนนี้ละ เลยต้องมาอธิบายเรื่องการทำ 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 ด้วยนะ

รูปที่ 1 แสดง Coding benchmark

จะเห็นว่าปุ่มให้กดบนชื่อฟังก์ชั่นเหมือนตอนเราทำ unit test เลย เราสามารถกด run benchmark ไปเลยหรือ รันคำสั่งด้านล่าง แบบไหนก็ได้

go test -bench=. หรือ go test -bench=<ชื่อฟังก์ชั่น>

ถ้า กด run benchmark จะได้แบบในรูปที่ 2

รูปที่ 2 แสดงการกด run benchmark

ถ้าทำคำสั่ง go test -bench=BenchmarkHandleFormular จะได้ดังรูปที่ 3

รูปที่ 3 แสดงการทำคำสั่ง go test -bench=BenchmarkHandleFormular

เห็นไหมละ ง่ายนิดเดียว เท่านี้เราก็สามารถวัดประสิทธิภาพได้แล้วว่า Code ที่เราเขียนนั้น มีประสิทธิดีขึ้นหรือแย่ลง หากเรากำลัง tuning code อยู่ เพื่อให้มันทำง่ายเร็วขึ้นแล้วไม่รู้ว่ามันเร็วขึ้นจริงไหม ใช้ benchmark ทดสอบเลย

Checkout my github -> https://github.com/VisarutJDev/GolangBasicAPI/tree/master/doge-apis

--

--

Visarut Junsone
Lazy-Dev

I’m Full-Stack Developer. ReactJS Golang C# Javascript C++ PHP and learning a lot more. Not lazy as it name. “Lazy-Dev”