for 与 range 的性能比较

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
  • 明显可以看出, forrange 更高效
  • 原因是 range 每次迭代都会对迭代值进行一次拷贝(value)
  • 当迭代值占内存越大,对性能消耗则越大,特别是对 []struct{} 进行迭代时!因此通常使用 []*struct{} 进行迭代而不是 []struct{}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容