Upgrade to Pro — share decks privately, control downloads, hide ads and more …

いまいちどスライスの 挙動を見直してみる

いまいちどスライスの 挙動を見直してみる

DMM.go#8で登壇した際の発表資料です

connpass
- https://dmm.connpass.com/event/322113/

matumoto

July 23, 2024
Tweet

More Decks by matumoto

Other Decks in Technology

Transcript

  1. 配列を参照している 10 3 1 4 1 5 x := []int{3,1,4,1,5}

    y := x[1:3] ptr len:5 cap:5 ptr len:2 cap:4 [5]int []int []int
  2. ポインタの値をコピー • y := x はポインタの値がコピーされる 11 3 1 4

    1 5 x := []int{3,1,4,1,5} y := x ptr len:5 cap:5 ptr len:5 cap:5 [5]int []int []int
  3. 容量 (capacity) はどう増えるか • 元が256より小さい場合: 2倍ずつ増える • 元が256以上の場合: 1.25倍+192ずつ増える •

    192足すのは256付近でもスムーズに増やすため 13 例. capacityを256→350 にしたい +192なし:2回 • 256 * 1.25 = 320 • 320 * 1.25 = 400 +192あり:1回 • 256 * 1.25 + 192 = 512 詳細:https://github.com/golang/go/blob/master/src/runtime/slice.go#L289
  4. 「1.要素の変更」の使いどころ 18 • 副作用のある関数で使う • パフォーマンス的に都合が良い場合 • sort, swap •

    ※ただし、一般的なWebアプリケーション開発ではDB処理などの方が重くなりが ちなので、変数のコピーコストなどは無視することが多いです
  5. 2.余分なメモリ参照 • スライスが参照している限り、配列を保持し続ける 20 0 0 0 0 0 x

    := make([]int, 0, 1000) x = x[:3:3] ptr len:3 cap:3 [1000]int []int … 1000要素分メモリが確保されたまま