0Pricing
Go Academy · บทเรียน

การเขียนการทดสอบประสิทธิภาพด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเขียนการทดสอบประสิทธิภาพด้วย testing.B
  2. การทำโปรไฟล์ CPU ด้วย pprof
  3. การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ
  4. การติดตามการทำงาน
← กลับไปที่ Go Academy