GoのSliceのCapacity Allocationを効率よくやるために

GoのSliceを使う時にどのタイミングでCapacityが際割り当てされるかを調べます。

package main

import (
	"fmtが"
)

func main() {
	const max int = 1000000
	var lc int
	slc := make([]int, 0, 0)
	for i := 0; i < max; i++ {
		slc = append(slc, i)
		if lc < cap(slc) {
			fmt.Println(len(slc), "->", cap(slc))
		}
		lc = cap(slc)
	}
}

上のコードの実行結果がこちらです。

1 -> 2
3 -> 4
5 -> 8
9 -> 16
17 -> 32
33 -> 64
65 -> 128
129 -> 256
257 -> 512
513 -> 1024
1025 -> 1344
1345 -> 1696
1697 -> 2368
2369 -> 3072
3073 -> 4096
4097 -> 5120
5121 -> 6816
6817 -> 10240
10241 -> 14336
14337 -> 18432
18433 -> 24576
24577 -> 30720
30721 -> 38912
38913 -> 49152
49153 -> 61440
61441 -> 77824
77825 -> 98304
98305 -> 122880
122881 -> 153600
153601 -> 192512
192513 -> 241664
241665 -> 303104
303105 -> 378880
378881 -> 475136
475137 -> 593920
593921 -> 743424
743425 -> 929792
929793 -> 1163264

1000までは倍のcapをallocateしてるけど、1000を越えるとぼちぼちって感じに変わってるのがわかります。


golang

2019-07-28 15:20 +0900