猿问

为什么在 Golang 中迭代地图比迭代切片慢这么多?

我在 Golang 中使用地图实现了一个稀疏矩阵,我注意到我的代码在此更改后开始花费更长的时间来完成,在排除其他可能的原因之后,似乎罪魁祸首是地图本身的迭代。Go Playground 链接(由于某种原因不起作用)。


package main


import (

    "fmt"

    "time"

    "math"

)


func main() {

    z := 50000000

    a := make(map[int]int, z)

    b := make([]int, z)


    for i := 0; i < z; i++ {

        a[i] = i

        b[i] = i

    }


    t0 := time.Now()

    for key, value := range a {

        if key != value { // never happens

            fmt.Println("a", key, value)

        }

    }

    d0 := time.Now().Sub(t0)


    t1 := time.Now()

    for key, value := range b {

        if key != value { // never happens

            fmt.Println("b", key, value)

        }

    }

    d1 := time.Now().Sub(t1)


    fmt.Println(

        "a:", d0,

        "b:", d1,

        "diff:", math.Max(float64(d0), float64(d1)) / math.Min(float64(d0), float64(d1)),

    )

}

迭代超过 50M 项会返回以下时间:


alix@local:~/Go/src$ go version

go version go1.3.3 linux/amd64

alix@local:~/Go/src$ go run b.go 

a: 1.195424429s b: 68.588488ms diff: 17.777154632611037

我想知道,为什么与切片相比,迭代地图的速度几乎慢 20 倍?


神不在的星期二
浏览 178回答 2
2回答
随时随地看视频慕课网APP

相关分类

Go
我要回答