Benchmark va race detector
Benchmark kodning ma’lum qismini takroran bajarib, uning vaqt va xotira sarfini o‘lchaydi. Race detector esa bir nechta goroutine umumiy xotiraga xavfli tarzda murojaat qilganini bajarilish vaqtida aniqlashga yordam beradi.
Benchmark yozish
Benchmark _test.go faylida BenchmarkXxx(b *testing.B) ko‘rinishida yoziladi:
package text
import (
"strings"
"testing"
)
var result string
func BenchmarkJoin(b *testing.B) {
parts := []string{"go", "lang", "uz"}
b.ReportAllocs()
for i := 0; i < b.N; i++ {
result = strings.Join(parts, "-")
}
}
b.N qiymatini benchmark vositasi o‘lchov yetarlicha barqaror bo‘lguncha oshiradi. Natijani package-level o‘zgaruvchiga yozish kompilyator hisoblashni keraksiz deb olib tashlashining oldini olishga yordam beradi.
Natijada quyidagi ustunlar uchrashi mumkin:
ns/op— bitta amal uchun o‘rtacha nanosekund;B/op— bitta amalga ajratilgan baytlar;allocs/op— bitta amalga to‘g‘ri kelgan xotira ajratishlar.
b.ReportAllocs() yoki -benchmem xotira ko‘rsatkichlarini chiqaradi. Bir martalik setup o‘lchovga kirmasligi kerak bo‘lsa, uni sikldan oldin bajaring va kerakli joyda b.ResetTimer() ishlating.
Natijani to‘g‘ri talqin qilish
Benchmark faqat tekshirilgan kod, ma’lumot, kompyuter va muhitdagi natijani ko‘rsatadi. U real server tezligini yoki foydalanuvchi tajribasini o‘z-o‘zidan isbotlamaydi.
Mikrobenchmarkda quyidagi xatolar ko‘p uchraydi:
- kompilyator natijasi ishlatilmagan hisoblashni olib tashlaydi;
- setup va I/O o‘lchanayotgan kichik amaldan ko‘proq vaqt oladi;
- juda sodda test real ma’lumot taqsimotini ifodalamaydi;
- fon jarayonlari va CPU rejimi natijani o‘zgartiradi.
Taqqoslash uchun benchmarkni bir necha marta bajaring va bir xil muhitdan foydalaning. Avval o‘lchang, keyin amaliy ahamiyatga ega tor joyni optimallashtiring.
Data raceni aniqlash
Data race kamida ikki goroutine bir xil xotira manziliga sinxronizatsiyasiz murojaat qilganda va ulardan kamida bittasi yozganda yuz beradi. Testlarni race detector bilan ishga tushirish:
Oddiy dasturni ham tekshirish mumkin:
Race detector dasturni instrumentatsiya qilgani uchun bajarilish sekinlashadi va ko‘proq xotira sarflaydi. Uni production performance o‘lchovi sifatida ishlatmang.
Warning
Race detector faqat tekshiruv vaqtida bajarilgan kod yo‘llarini kuzatadi. Ogohlantirish chiqmagani barcha mumkin bo‘lgan bajarilishlarda data race yo‘qligini isbotlamaydi. Muhim concurrent yo‘llarni testlar bilan bajaring.
Race hisobotida qarama-qarshi murojaatlar va ularni yaratgan goroutinelar stack trace’i ko‘rsatiladi. Faqat ogohlantirishni yashirmang; umumiy holat egaligini aniqlang va sync.Mutex, channel yoki boshqa mos sinxronizatsiya bilan mantiqni tuzating.
Xulosa
Benchmark vaqt va xotira sarfini o‘lchaydi, lekin real tizim tezligini yakka o‘zi isbotlamaydi. go test -bench=. -benchmem natijasini bir xil muhitda taqqoslang. go test -race ./... esa bajarilgan concurrent yo‘llardagi data racelarni topishga yordam beradi.