golang - 성능 조사 slice vs array
출처
테스트 환경: go version go1.7.3 windows/amd64
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}
}
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()
}
}
< 테스트 결과 >
포인트
- 일반적인 처리 때는 배열이 Slice 보다 더 빠르지만 배열은 함수 매개 변수와 함수 반환 값으로 이용된 경우 메모리에 복사되기 때문에 오히려 효율이 떨어진다.
이 글은 2018-05-28에 작성되었습니다.