Golang foreach 区别

wen*_*liu 2 go

func Benchmark_foreach1(b *testing.B) {
        var test map[int]int
        test = make(map[int]int)
            for i := 0; i < 100000; i++ {
                        test[i] = 1
            }
            for i := 0; i < b.N; i++ {
                    for i, _ := range test {
                            if test[i] != 1 {
                                    panic("ds")
                            }
                    }
            }
}

func Benchmark_foreach2(b *testing.B) {
            var test map[int]int
            test = make(map[int]int)
            for i := 0; i < 100000; i++ {
                    test[i] = 1
            }
            for i := 0; i < b.N; i++ {
                    for _, v := range test {
                            if v != 1 {
                                    panic("heh")
                            }
                    }
            }
}
Run Code Online (Sandbox Code Playgroud)

运行结果如下

goos: linux
goarch: amd64
Benchmark_foreach1-2         500           3172323 ns/op
Benchmark_foreach2-2        1000           1707214 ns/op
Run Code Online (Sandbox Code Playgroud)

为什么 foreach-2 慢?

Eug*_*sky 5

我认为Benchmark_foreach2-2大约快 2 倍 - 每个操作需要 1707214 纳秒,第一个需要 3172323 纳秒。所以第二个要3172323 / 1707214 = 1.85快几倍。

原因:第二个不需要再次从内存中获取值,它已经使用了v变量中的值。