Stavo implementando una matrice sparsa utilizzando una mappa in Golang e ho notato che il mio codice ha iniziato a richiedere molto più tempo per completare dopo questo cambiamento, dopo aver eliminato altre possibili cause, sembra che il colpevole sia l'iterazione sulla mappa stessa. Go Playground link (non funziona per qualche motivo).Perché iterare su una mappa è molto più lento di iterare su una porzione di Golang?
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)),
)
}
iterazione di oggetti 50M restituisce i seguenti orari:
[email protected]:~/Go/src$ go version
go version go1.3.3 linux/amd64
[email protected]:~/Go/src$ go run b.go
a: 1.195424429s b: 68.588488ms diff: 17.777154632611037
mi chiedo, perché è l'iterazione di una mappa quasi 20 volte più lento rispetto ad una fetta?
Perché * it * iterating su una mappa è notevolmente più lento? Una slice è solo una memoria contigua, mentre una hashmap è una struttura di dati molto più complessa. – JimB
La risposta ovvia è che le strutture sottostanti sono una matrice e una tabella hash. Nel primo caso state iterando le chiavi e anche (nell'astrazione dell'intervallo) accedendo al valore di ognuna. Nell'altro stai camminando su un blocco continuo di memoria. – evanmcdonnal
Discussione correlata: https://code.google.com/p/go/issues/detail?id=3885 –