2020年4月28日火曜日

開発環境

入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 4(コレクション)、LESSON 18(もっと大きなスライス)の練習問題の解答を求めてみる。

コード

package main

import "fmt"

func main() {
 zeros := []int{}
 c := cap(zeros)
 for i := 0; i < 10000; i++ {
  zeros = append(zeros, 0)
  t := cap(zeros)
  if c != t {
   fmt.Println(c, t, float64(t)/float64(c))
   c = t
  }
 }
}

入出力結果(Zsh、PowerShell、Terminal)

% go build capacity.go
% ./capacity          
0 1 +Inf
1 2 2
2 4 2
4 8 2
8 16 2
16 32 2
32 64 2
64 128 2
128 256 2
256 512 2
512 1024 2
1024 1280 1.25
1280 1696 1.325
1696 2304 1.3584905660377358
2304 3072 1.3333333333333333
3072 4096 1.3333333333333333
4096 5120 1.25
5120 7168 1.4
7168 9216 1.2857142857142858
9216 12288 1.3333333333333333
% ./capacity
0 1 +Inf
1 2 2
2 4 2
4 8 2
8 16 2
16 32 2
32 64 2
64 128 2
128 256 2
256 512 2
512 1024 2
1024 1280 1.25
1280 1696 1.325
1696 2304 1.3584905660377358
2304 3072 1.3333333333333333
3072 4096 1.3333333333333333
4096 5120 1.25
5120 7168 1.4
7168 9216 1.2857142857142858
9216 12288 1.3333333333333333
% 

基底配列が容量不足になったとき、append関数は常に容量を2倍にするわけではない。

0 コメント:

コメントを投稿