【发布时间】:2015-10-20 19:47:14
【问题描述】:
我在 Golang 中使用地图实现了一个稀疏矩阵,我注意到在排除其他可能的原因之后,我的代码开始需要更长的时间才能完成此更改,似乎罪魁祸首是地图本身的迭代。 Go Playground link(由于某种原因不起作用)。
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 倍?
【问题讨论】:
-
为什么不会在地图上迭代要慢得多?切片只是连续的内存,而哈希图是一种更复杂的数据结构。
-
嗯,显而易见的答案是底层结构是一个数组和一个哈希表。在一种情况下,您正在迭代键并且(在范围抽象中)访问每个键的值。另一方面,你正在走过一段连续的记忆。
标签: performance dictionary go slice sparse-matrix