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

Колонки идут в таком порядке:

  1. название теста плюс количество процессоров или ядер;
  2. количество итераций, за которое произведены измерения;
  3. среднее время итерации;
  4. среднее общее количество памяти, выделенное на итерацию;
  5. среднее количество отдельных выделений памяти на итерацию.
→ Ссылка