В следующем коде показаны два теста. Первая создает структуру по значению в каждой итерации, а вторая использует указатель на структуру.Показатель GoLang Pointer
Почему последние в 20 раз медленнее? Я знаю о проблемах с GC с GoLang, но не должен избегать анализа этих ситуаций?
Я использую go1.4beta1, но 1.3.3 дал мне [тот же самый] другой результаты.
Любая идея?
package main
import "testing"
type Adder struct {
vals []int
}
func (a *Adder) add() int {
return a.vals[0] + a.vals[1]
}
func BenchmarkWithoutPointer(b *testing.B) {
accum := 0
for i := 0; i < b.N; i++ {
adder := Adder{[]int{accum, i}}
accum = adder.add()
}
_ = accum
}
func BenchmarkWithPointer(b *testing.B) {
accum := 0
for i := 0; i < b.N; i++ {
adder := &Adder{[]int{accum, i}}
accum = adder.add()
}
_ = accum
}
Тест go1.4.1:
$ go test -bench=.
testing: warning: no tests to run
PASS
BenchmarkWithoutPointer 1000000000 2.92 ns/op
BenchmarkWithPointer 30000000 57.8 ns/op
ok github.com/XXXXXXXXXX/bench/perf 5.010s
Тест go1.3.3:
testing: warning: no tests to run
PASS
BenchmarkWithoutPointer 500000000 7.89 ns/op
BenchmarkWithPointer 50000000 37.5 ns/op
ok
РЕДАКТИРОВАТЬ:
Вывод:
Как сказал Айнар-G, то [] int уходит в кучу в secon d. Прочитав немного больше о 1.4beta1, кажется, что новые возможности для записи возникают при доступе к куче, вызванном новыми планами GC. Но сырое исполнение, похоже, увеличилось. С нетерпением ждем 1.5 =).
Что машинный код генерируется для двух? – delnan
https://gist.github.com/chrisprobst/4c0231c24e1fc4a215cd – Kr0e