Golang benchmark. Объяснение результатов
package main
import (
"sync"
"testing"
)
type Sentences []string
func NewSent() *Sentences {
sents := make(Sentences,0)
return &sents
}
func (s *Sentences) Reset() {
*s = make(Sentences,0)
}
var pool = sync.Pool{
New: func() interface{} { return NewSent() },
}
//go:noinline
func inc(s *Sentences) {
*s = append(*s, "test")
}
func BenchmarkWithoutPool(b *testing.B) {
var s *Sentences
for i := 0; i < b.N; i++ {
for j := 0; j < 100; j++ {
s = NewSent()
b.StopTimer(); inc(s); b.StartTimer()
}
}
}
func BenchmarkWithPool(b *testing.B) {
var s *Sentences
for i := 0; i < b.N; i++ {
for j := 0; j < 100; j++ {
s = pool.Get().(*Sentences)
b.StopTimer(); inc(s); b.StartTimer()
s.Reset()
pool.Put(s)
}
}
}
Запуск теста: go test -bench=. -benchmem bench2_test.go
Вывод:
goos: windows
goarch: amd64
BenchmarkWithoutPool-4 15850 76093 ns/op 3200 B/op 100 allocs/op
BenchmarkWithPool-4 49177 26457 ns/op 0 B/op 0 allocs/op
PASS
ok command-line-arguments 387.358s
Непонятна, в первую очередь, первая колонка. Если это память, то почему во втором случае она больше? Значит ли это, что использовать sync.Pool для простых структур типа слайса строк невыгодно?
Ответы (1 шт):
Автор решения: Ainar-G
→ Ссылка
Колонки идут в таком порядке:
- название теста плюс количество процессоров или ядер;
- количество итераций, за которое произведены измерения;
- среднее время итерации;
- среднее общее количество памяти, выделенное на итерацию;
- среднее количество отдельных выделений памяти на итерацию.