דילוג לתוכן המרכזי
מודול 9 · שיעור 3 מתוך 543/50 בקורס~12 min
שיעורי מודול (3/5)

מדדים ופרופילים

בנוסף לבדיקות פונקציונליות, ל-go test יש גם בנצ'מרקים מובנים (BenchmarkXxx) ותומך בפרופילי CPU וזיכרון (pprof). הכל ללא תלות חיצונית.

צורה של אמת מידה

Go
func BenchmarkSum(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = Sum(2, 3)
    }
}

מאפיינים:

  • חתימה מדויקת: func BenchmarkXxx(b *testing.B).
  • הלולאה חייבת להפעיל b.N איטרציות: המסגרת מתאימה את b.N אוטומטית, מתחילה ב-1 וגדלה עד שהמדידה מתייצבת (כ-1 שנייה כברירת מחדל).
  • התוצאה היא ns/op (ננו-שניות לכל פעולה) ועם -benchmem, גם B/op וallocs/op.

פקודות אופייניות

Bash
go test -bench=. ./...              # all benchmarks
go test -bench=Sum -benchmem        # only Sum, with memory info
go test -bench=. -benchtime=5s      # each benchmark for 5 seconds
go test -bench=. -cpuprofile=cpu.out # generate a CPU profile

פלט אופייני:

Code
BenchmarkSum-8        1000000000        0.31 ns/op

-8 הוא הערך GOMAXPROCS. 0.31 ns/op הוא הזמן הממוצע לשיחה.

הגדרה יקרה: b.ResetTimer

אם יש לך שלב הכנה ארוך לפני הלולאה, אל תכלול אותו מהמדידה:

Go
func BenchmarkSearch(b *testing.B) {
    data := buildLargeSlice(1_000_000) // expensive
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        _ = Search(data, 42)
    }
}

גרסאות שימושיות:

  • b.StopTimer() / b.StartTimer() - השהה את המדידה סביב שלב לא מעניין (שימושי בתוך הלולאה).
  • b.ReportAllocs() - לכפות דיווח על הקצאה גם ללא -benchmem.

טבלת בנצ'מרק עם b.Run

בדיוק כמו t.Run עבור בדיקות, יש b.Run עבור אמות מידה פרמטריות:

Go
func BenchmarkSplit(b *testing.B) {
    for _, size := range []int{10, 1000, 100000} {
        b.Run(fmt.Sprintf("n=%d", size), func(b *testing.B) {
            s := strings.Repeat("a,", size)
            b.ResetTimer()
            for i := 0; i < b.N; i++ {
                _ = strings.Split(s, ",")
            }
        })
    }
}

פלט שורות כמו BenchmarkSplit/n=10-8, BenchmarkSplit/n=1000-8, ... אידיאלי עבור הרחבת תרשימים.

השוואת שני יישומים עם benchstat

Bash
go test -bench=. -count=10 > old.txt
# apply change
go test -bench=. -count=10 > new.txt
benchstat old.txt new.txt

benchstat (ב-golang.org/x/perf/cmd/benchstat) מחשב את הממוצע, סטיית התקן והמובהקות הסטטיסטית של ההפרש.

תרגילים

פעילות גופנית#go.m9.l3.e1
ניסיונות: 0טוען...

הגדר BenchmarkSum עם הלולאה מעל b.N שקוראת Sum(2, 3).

טוען עורך...

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m9.l3.e2
ניסיונות: 0טוען...

הוסף את b.ResetTimer אחרי ההגדרה היקרה, לפני הלולאה, כך שההגדרה לא תיכלל במדידה.

טוען עורך...

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m9.l3.e3
מוכן

איזה דגל מריץ את כל המדדים בחבילה?

Go
$ go test ???
אפשרויות תשובה