Qiita Conference 2025

Qiita史上最多!豪華12名のゲストが登壇

特別講演ゲスト(敬称略)

ymrl、成瀬允宣、鹿野壮、伊藤淳一、uhyo、徳丸浩、ミノ駆動、みのるん、桜庭洋之、tenntenn、けんちょん、こにふぁー

4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

golangパフォーマンス2: slice vs array

Last updated at Posted at 2016-10-30

テスト環境: go version go1.7.3 windows/amd64

ファイル構造:
rootファイル/02arraySlice.go
rootファイル/02arraySlice_test.go (効率テスト用)

02arraySlice.go

package go1_6

const capacity = 1024

//配列操作arrayはsliceにより早い
func array() [capacity]int {//配列処理テスト関数
	var d [capacity]int

	for i := 0; i < len(d); i++ {
		d[i] = 1
	}

	return d
}

func slice() []int {//slice処理テスト関数
	d := make([]int, capacity)

	for i := 0; i < len(d); i++ {
		d[i] = 1
	}

	return d
}

//パラメータとして渡す場合はsliceほうが早い (arrayはメモリ中にコピーされる)
func inArray(array [capacity]int) {//配列として関数パラメータ効率テスト

}

func inArray2(array *[capacity]int) {//配列ポインタとして関数パラメータ効率テスト

}

func inSlice(slice []int) {//sliceとして関数パラメータ効率テスト

}

//reArrayにより早い
func reSlice() []byte {//return slice場合効率テスト
	return []byte{1, 2, 3, 4}
}

func reArray() [4]byte {//return array場合効率テスト
	return [4]byte{1, 2, 3, 4}
}

02arraySlice_test.go

package go1_6

import (
	"testing"
)

func BenchmarkArray(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = array()
	}
}

func BenchmarkSlice(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = slice()
	}

}

func BenchmarkInArray(b *testing.B) {
	arr := array()
	for i := 0; i < b.N; i++ {
		inArray(arr)
	}
}

func BenchmarkInArray2(b *testing.B) {
	b.StopTimer()
	arr := array()
	b.StartTimer()

	parr := &arr
	for i := 0; i < b.N; i++ {
		inArray2(parr)
	}
}

func BenchmarkInSlice(b *testing.B) {
	b.StopTimer()
	sli := slice()
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		inSlice(sli)
	}

}

func BenchmarkReArray(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = reArray()
	}
}

func BenchmarkReSlice(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = reSlice()
	}
}

テスト結果:
image

ポイント:
通常処理場合は配列がSliceにより早いですが、
配列は関数パラメータと関数戻し値として利用された場合は
メモリ中にコピーされるため逆に効率が落ちます。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Conference 2025 will be held!: 4/23(wed) - 4/25(Fri)

Qiita Conference is the largest tech conference in Qiita!

Keynote Speaker

ymrl、Masanobu Naruse, Takeshi Kano, Junichi Ito, uhyo, Hiroshi Tokumaru, MinoDriven, Minorun, Hiroyuki Sakuraba, tenntenn, drken, konifar

View event details
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?