การเขียนการทดสอบประสิทธิภาพด้วย testing.B
BenchmarkXxx, ลูป b.N และแฟล็ก -bench
การเขียนการทดสอบประสิทธิภาพด้วย testing.B เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
ลายเซ็นฟังก์ชันการวัดประสิทธิภาพ
การวัดประสิทธิภาพต้องขึ้นต้นด้วย Benchmark และรับค่า *testing.B โดยจะทำงานในไฟล์ _test.go เดียวกับการทดสอบทั่วไป
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(2, 3)
}
}b.N
เฟรมเวิร์กการทดสอบจะปรับค่า b.N โดยอัตโนมัติ ซึ่งเป็นจำนวนรอบของลูป จนกว่าการวัดประสิทธิภาพจะทำงานอย่างน้อย 1 วินาที ทำให้ได้ค่าจำนวนนาโนวินาทีต่อการดำเนินการที่เสถียร
การเรียกใช้การวัดประสิทธิภาพ
การวัดประสิทธิภาพจะไม่ทำงานด้วย go test เพียงอย่างเดียว ให้ใช้ -bench เพื่อเปิดใช้งาน:
go test -bench=. -benchmem ./...
// BenchmarkAdd-8 500000000 2.13 ns/op 0 B/op 0 allocs/opแฟล็ก -benchmem
-benchmem จะเพิ่มสถิติการจัดสรรหน่วยความจำ ได้แก่ ไบต์ต่อการดำเนินการและจำนวนการจัดสรรต่อการดำเนินการ การจัดสรรจำนวนมากมักบ่งชี้ถึงปัญหาด้านประสิทธิภาพ
b.ResetTimer
เรียกใช้ b.ResetTimer() หลังการตั้งค่าที่ใช้เวลานานและไม่ควรถูกนับรวมในการวัดประสิทธิภาพ:
func BenchmarkQuery(b *testing.B) {
db := setupDB() // expensive
b.ResetTimer()
for i := 0; i < b.N; i++ {
db.Query("SELECT 1")
}
}b.StopTimer / b.StartTimer
หยุดชั่วคราวและเริ่มตัวจับเวลาใหม่รอบการตั้งค่าหรือการเก็บกวาดส่วนที่ไม่ควรถูกนับรวมในเวลาการวัดประสิทธิภาพ
for i := 0; i < b.N; i++ {
b.StopTimer()
data := generateInput()
b.StartTimer()
process(data)
}b.SetBytes
เรียกใช้ b.SetBytes(n) เพื่อรายงานอัตราการส่งข้อมูล (ไบต์ต่อวินาที) เพิ่มเติมจากเวลาในการดำเนินการ เหมาะสำหรับการวัดประสิทธิภาพโค้ดการทำให้เป็นอนุกรมหรือโค้ดเครือข่าย
b.SetBytes(int64(len(payload)))
for i := 0; i < b.N; i++ {
encode(payload)
}การเปรียบเทียบการวัดประสิทธิภาพ
ใช้ benchstat เพื่อเปรียบเทียบผลการวัดประสิทธิภาพสองครั้งและดูความแตกต่างที่มีนัยสำคัญทางสถิติ:
go test -bench=. -count=10 > before.txt
# make change
go test -bench=. -count=10 > after.txt
benchstat before.txt after.txtการป้องกันการตัดโค้ดที่ไม่ทำงานออก
กำหนดผลลัพธ์ให้กับตัวแปรระดับแพ็กเกจหรือตัวรับค่า เพื่อป้องกันไม่ให้คอมไพเลอร์ปรับโค้ดที่กำลังวัดประสิทธิภาพออก:
var result int
func BenchmarkFib(b *testing.B) {
for i := 0; i < b.N; i++ {
result = Fib(20)
}
}การวัดประสิทธิภาพย่อย
ใช้ b.Run เพื่อสร้างการวัดประสิทธิภาพย่อยที่มีชื่อ เช่นเดียวกับการทดสอบที่ขับเคลื่อนด้วยตาราง:
for _, size := range []int{10, 100, 1000} {
b.Run(fmt.Sprintf("size=%d", size), func(b *testing.B) {
for i := 0; i < b.N; i++ { sort(make([]int, size)) }
})
}การวัดประสิทธิภาพเทียบกับการสร้างโพรไฟล์
การวัดประสิทธิภาพใช้ระบุปริมาณประสิทธิภาพ ส่วนการสร้างโพรไฟล์ (pprof) แสดงว่าใช้เวลาไปที่ใด ใช้การวัดประสิทธิภาพเพื่อวัดผล และใช้การสร้างโพรไฟล์เพื่อวินิจฉัยว่าควรปรับปรุงส่วนใด
ตรวจสอบความเข้าใจ
เหตุใดเนื้อหาลูปการวัดประสิทธิภาพจึงต้องใช้ผลลัพธ์ เพื่อป้องกันไม่ให้คอมไพเลอร์ปรับโค้ดให้เหมาะสมจนตัดโค้ดนั้นออก
สรุป: การวัดประสิทธิภาพ
ประเด็นสำคัญ:
- ใช้ BenchmarkXxx(b *testing.B) ร่วมกับ for i := 0; i < b.N; i++
- ใช้คำสั่งสำหรับการทดสอบด้วย -bench=. และ -benchmem เพื่อดูสถิติการจัดสรรหน่วยความจำ
- ใช้ b.ResetTimer() หลังการตั้งค่าที่ใช้เวลานาน
- ใช้ benchstat เพื่อเปรียบเทียบผลการทำงาน และกำหนดผลลัพธ์ให้กับตัวแปรเพื่อป้องกันการตัดโค้ดออก
คำถามที่พบบ่อย
บทเรียน “การเขียนการทดสอบประสิทธิภาพด้วย testing.B” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเขียนการทดสอบประสิทธิภาพด้วย testing.B” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเขียนการทดสอบประสิทธิภาพด้วย testing.B”
BenchmarkXxx, ลูป b.N และแฟล็ก -bench คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การเขียนการทดสอบประสิทธิภาพด้วย testing.B” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียนการทดสอบประสิทธิภาพด้วย testing.B
- การทำโปรไฟล์ CPU ด้วย pprof
- การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ
- การติดตามการทำงาน