тут скучно
У меня не произошла: /1-20 147698568 8.169 ns/op 0 B/op 0 allocs/op /8-20 19205803 63.31 ns/op 0 B/op 0 allocs/op /9-20 6231040 189.9 ns/op 160 B/op 1 allocs/op /13-20 2716396 421.8 ns/op 500 B/op 2 allocs/op /14-20 2653107 431.8 ns/op 500 B/op 2 allocs/op
Какая версия и данные?
map[int]struct{}) go version go1.21.0 linux/amd64
package main import ( "strconv" "testing" ) func BenchmarkName(b *testing.B) { nList := []int{1, 8, 9, 13, 14, 50} for _, n := range nList { b.Run(strconv.Itoa(n), func(b *testing.B) { for j := 0; j < b.N; j++ { m := make(map[int]struct{}) for k := 0; k < n; k++ { m[k] = struct{}{} } } }) } }
phil@wtvlab:~/test14$ go test -test.bench . -test.benchmem his_test.go goos: linux goarch: amd64 cpu: AMD Ryzen 7 5800H with Radeon Graphics /1-16 100000000 10.52 ns/op 0 B/op 0 allocs/op /8-16 13891986 87.02 ns/op 0 B/op 0 allocs/op /9-16 4624732 257.7 ns/op 160 B/op 1 allocs/op /13-16 3367443 362.8 ns/op 196 B/op 2 allocs/op /14-16 1786410 671.4 ns/op 517 B/op 3 allocs/op /50-16 528997 2292 ns/op 1394 B/op 10 allocs/op PASS ok command-line-arguments 8.523s phil@wtvlab:~/test14$ go version go version go1.20.6 linux/amd64 phil@wtvlab:~/test14$ uname -a Linux wtvlab 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
@all А погоняйте вот это пожалуйста с go test -test.bench . -test.benchmem his_test.go и потом go version и uname -a (винду просто укажите)
xbt573@cheembox ~/c/g/playground> go test -test.bench . -test.benchmem his_test.go goos: linux goarch: amd64 cpu: Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz BenchmarkName/1-20 69441450 17.74 ns/op 0 B/op 0 allocs/op BenchmarkName/8-20 7175889 165.7 ns/op 0 B/op 0 allocs/op BenchmarkName/9-20 1460438 959.2 ns/op 160 B/op 1 allocs/op BenchmarkName/13-20 600056 2113 ns/op 500 B/op 2 allocs/op BenchmarkName/14-20 556844 2146 ns/op 500 B/op 2 allocs/op BenchmarkName/50-20 136639 7764 ns/op 2743 B/op 9 allocs/op PASS ok command-line-arguments 10.486s xbt573@cheembox ~/c/g/playground> go version go version go1.21.0 linux/amd64 xbt573@cheembox ~/c/g/playground> uname -a Linux cheembox 6.4.10-gentoo-dist #1 SMP PREEMPT_DYNAMIC Mon Aug 14 21:19:48 MSK 2023 x86_64 Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz GenuineIntel GNU/Linux xbt573@cheembox ~/c/g/playground>
spider@calculate /tmp/tmp.bCgA0z2fvx $ go test -test.bench . -test.benchmem his_test.go goos: linux goarch: amd64 cpu: 11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz BenchmarkName/1-8 120934110 10.02 ns/op 0 B/op 0 allocs/op BenchmarkName/8-8 13424506 93.07 ns/op 0 B/op 0 allocs/op BenchmarkName/9-8 4502892 261.9 ns/op 160 B/op 1 allocs/op BenchmarkName/13-8 3315483 372.9 ns/op 196 B/op 2 allocs/op BenchmarkName/14-8 1986396 640.4 ns/op 517 B/op 3 allocs/op BenchmarkName/50-8 561596 2157 ns/op 1394 B/op 10 allocs/op PASS ok command-line-arguments 10.652s spider@calculate /tmp/tmp.bCgA0z2fvx $ go version go version go1.19.4 linux/amd64 spider@calculate /tmp/tmp.bCgA0z2fvx $ uname -a Linux calculate 5.15.82-calculate #1 SMP PREEMPT Tue Dec 13 09:40:40 UTC 2022 x86_64 11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz GenuineIntel GNU/Linux
так и не нашел разгадку? подсказать? :)))
Хотя идея со стеком интересная. Вон, в ядре 6+ не повторяется
go test -test.bench . -test.benchmem qqq_test.go goos: linux goarch: amd64 cpu: AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx BenchmarkName/1-8 66432248 15.89 ns/op 0 B/op 0 allocs/op BenchmarkName/8-8 7442712 156.1 ns/op 0 B/op 0 allocs/op BenchmarkName/9-8 2221542 528.4 ns/op 160 B/op 1 allocs/op BenchmarkName/13-8 1648663 757.2 ns/op 196 B/op 2 allocs/op BenchmarkName/14-8 884330 1352 ns/op 517 B/op 3 allocs/op BenchmarkName/50-8 292698 4072 ns/op 1395 B/op 10 allocs/op PASS ok command-line-arguments 8.563s uname -a Linux HUAWEI-NB 6.2.0-26-generic #26-Ubuntu SMP PREEMPT_DYNAMIC Mon Jul 10 23:39:54 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux повторяется :)
первая аллокация на 9 - и это 160 байт - больше чем порог :) поищи про 128 байт - точно что-то было :)
Первая алокация 9 потому что это правило 8. До 8 элементов ьакет не аллоцируется. А 128это ты путаешь с размером ключа или значения. Если они больше, то в бакет кладется указатель, а для значения делаетмя аллокация
Правда, я кросавчег?
https://cs.opensource.google/go/go/+/refs/tags/go1.21.0:src/runtime/map_fast64.go;l=93
Мне нужна пояснительная бригада
Кто-нибудь нашёл?
https://github.com/golang/go/blob/ff00fdfdbeeb72ca8981a04290765452d6a31b26/src/runtime/map.go#L69
У моего вопроса есть целая история тут в чате
Есть ссылка на первую главу?)
Дав вот от того, на что ответил вниз почитать
И вниз по треду даже бенчи делали
Собственно смотрим ниже
Обсуждают сегодня