GoDasturchi
Advanced Benchmarking

Advanced Benchmarking

Ilg'or benchmarking

Benchmark yozishda ba'zi nozik jihatlarni bilish, natijani noto'g'ri o'lchashning oldini oladi.

example.go
package main

import (
	"strings"
	"testing"
)

func BuildString(n int) string {
	var b strings.Builder
	for i := 0; i < n; i++ {
		b.WriteString("x")
	}
	return b.String()
}

func BenchmarkBuildString(b *testing.B) {
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		BuildString(1000)
	}
}

func BenchmarkBuildStringSizes(b *testing.B) {
	sizes := []int{10, 100, 1000}
	for _, size := range sizes {
		b.Run(strings.Repeat("x", 1), func(b *testing.B) {
			for i := 0; i < b.N; i++ {
				BuildString(size)
			}
		})
	}
}

b.ResetTimer() — agar benchmark boshida sikldan tashqarida sekin "tayyorgarlik" kodi bo'lsa (masalan katta test ma'lumotini yaratish), soatni shu tayyorgarlikdan keyin qaytadan nolga tashlaydi — aks holda tayyorgarlik vaqti ham "benchmark natijasi"ga noto'g'ri qo'shilib ketadi. b.Run esa xuddi t.Run kabi, benchmark'ni turli parametrlar (masalan turli hajmlar) bilan alohida-alohida o'lchash imkonini beradi — masalan "kichik kirish tezmi yoki katta kirish tezmi?" degan savolga javob berish uchun.

Yana bir muhim maslahat: b.ReportAllocs() chaqirilsa, benchmark har bir chaqiruvda nechta xotira ajratish (allocation) bo'lganini ham hisoblab beradi — bu ko'pincha vaqtning o'zidan ham muhimroq, chunki ortiqcha xotira ajratish garbage collectorga ortiqcha yuk beradi.

Key Takeaway

Key Takeaway:

b.ResetTimer() tayyorgarlik vaqtini o'lchovdan chiqaradi, b.Run esa turli holatlarni alohida taqqoslash imkonini beradi — ikkalasi ham to'g'ri, ishonchli benchmark natijasi olish uchun muhim.

NEXT UP

Code Coverage

Advanced Benchmarking

Ilg'or benchmarking

Benchmark yozishda ba'zi nozik jihatlarni bilish, natijani noto'g'ri o'lchashning oldini oladi.

example.go
package main

import (
	"strings"
	"testing"
)

func BuildString(n int) string {
	var b strings.Builder
	for i := 0; i < n; i++ {
		b.WriteString("x")
	}
	return b.String()
}

func BenchmarkBuildString(b *testing.B) {
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		BuildString(1000)
	}
}

func BenchmarkBuildStringSizes(b *testing.B) {
	sizes := []int{10, 100, 1000}
	for _, size := range sizes {
		b.Run(strings.Repeat("x", 1), func(b *testing.B) {
			for i := 0; i < b.N; i++ {
				BuildString(size)
			}
		})
	}
}

b.ResetTimer() — agar benchmark boshida sikldan tashqarida sekin "tayyorgarlik" kodi bo'lsa (masalan katta test ma'lumotini yaratish), soatni shu tayyorgarlikdan keyin qaytadan nolga tashlaydi — aks holda tayyorgarlik vaqti ham "benchmark natijasi"ga noto'g'ri qo'shilib ketadi. b.Run esa xuddi t.Run kabi, benchmark'ni turli parametrlar (masalan turli hajmlar) bilan alohida-alohida o'lchash imkonini beradi — masalan "kichik kirish tezmi yoki katta kirish tezmi?" degan savolga javob berish uchun.

Yana bir muhim maslahat: b.ReportAllocs() chaqirilsa, benchmark har bir chaqiruvda nechta xotira ajratish (allocation) bo'lganini ham hisoblab beradi — bu ko'pincha vaqtning o'zidan ham muhimroq, chunki ortiqcha xotira ajratish garbage collectorga ortiqcha yuk beradi.

Key Takeaway

Key Takeaway:

b.ResetTimer() tayyorgarlik vaqtini o'lchovdan chiqaradi, b.Run esa turli holatlarni alohida taqqoslash imkonini beradi — ikkalasi ham to'g'ri, ishonchli benchmark natijasi olish uchun muhim.

NEXT UP

Code Coverage