📦
[Go] スライスはキャパシティを設定して,パフォーマンス良くしよう
概要
組み込み関数のmake
を利用して,スライス作成時に必要な分のキャパシティを指定することで,必要以上にメモリを確保せずにパフォーマンスを良くする
課題
DBから複数レコードを取得し,レスポンスで返す処理の実装で,スライスの定義でメモリを必要以上に使用していた
解決手法
前提
Goでは,配列は固定長,スライスは可変長
スライスは,
- 配列を確保しており,それを参照して,メモリの読み書きを行うもの
- 最初に確保したメモリをオーバーした場合は,新しい配列を作成・メモリを割り当て,古い配列の内容をコピーする
キャパシティとは
メモリの容量のこと
確保したメモリは,cap()
で確認できる
s := make([]int, 10)
fmt.Println(cap(s)) // 10
fmt.Println(s) // [0,0,0,0,0,0,0,0,0,0]
解決手法
組み込み関数のmake
を利用して,スライス作成時に必要な分のキャパシティを指定する
// ex: DBからユーザー一覧を取得
.
.
resp := make([]userResponse, len(us)) // ユーザー分,先にメモリを確保する
for _, u := range users {
resp = append(resp, userResponse{
ID: u.ID,
Name: u.Name,
})
}
j, err := json.Marshal(resp)
.
.
こうすることで,必要以上にメモリを確保しないため,パフォーマンスが良くなります.
Discussion