Go:for 与 range 的性能比较
func generateWithCap(n int) []int {
rand.Seed(time.Now().UnixNano())
nums := make([]int, 0, n)
for i := 0; i < n; i++ {
nums = append(nums, rand.Int())
}
return nums
}
func BenchmarkForIntSlice(b *testing.B) {
nums := generateWithCap(1024 * 1024)
for i := 0; i < b.N; i++ {
len := len(nums)
var tmp int
for k := 0; k < len; k++ {
tmp = nums[k]
}
_ = tmp
}
}
func BenchmarkRangeIntSlice(b *testing.B) {
nums := generateWithCap(1024 * 1024)
for i := 0; i < b.N; i++ {
var tmp int
for _, num := range nums {
tmp = num
}
_ = tmp
}
}
#####
# go test -bench=IntSlice$ -benchmem .
goarch: amd64
pkg: hello
cpu: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
BenchmarkForIntSlice-12 2349 510717 ns/op 3571 B/op 0 allocs/op
BenchmarkRangeIntSlice-12 4588 256757 ns/op 1828 B/op 0 allocs/op
PASS
- 明显可以看出,
for
比 range
更高效
- 原因是
range
每次迭代都会对迭代值进行一次拷贝(value)
- 当迭代值占内存越大,对性能消耗则越大,特别是对
[]struct{}
进行迭代时!因此通常使用 []*struct{}
进行迭代而不是 []struct{}