📦

[Go] スライスはキャパシティを設定して,パフォーマンス良くしよう

2023/02/04に公開

概要

組み込み関数の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