मैं गोलांग में एक मानचित्र का उपयोग करके एक स्पैर मैट्रिक्स को कार्यान्वित कर रहा था और मैंने देखा कि इस परिवर्तन के बाद मेरे कोड को पूरा करने में काफी समय लग रहा है, अन्य संभावित कारणों को खारिज करने के बाद, ऐसा लगता है कि अपराधी मानचित्र पर ही पुनरावृत्ति है। 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 से अधिक आइटम से ये समय:
[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
मुझे आश्चर्य है कि क्यों एक नक्शे पर पुनरावृत्ति है लगभग 20x के रूप में धीमी गति से जब एक टुकड़ा की तुलना में?
* मानचित्र पर फिर से धीमा होने पर क्यों नहीं चल रहा है? एक टुकड़ा सिर्फ संगत स्मृति है, जबकि एक हैशप एक अधिक जटिल डेटा संरचना है। – JimB
वैसे स्पष्ट जवाब यह है कि अंतर्निहित संरचनाएं एक सरणी और हैश तालिका हैं। एक मामले में आप प्रत्येक के लिए मूल्य तक पहुंचने के लिए चाबियाँ और (रेंज एब्स्ट्रक्शन में) पुनरावृत्त कर रहे हैं। दूसरे में आप स्मृति के निरंतर ब्लॉक पर चल रहे हैं। – evanmcdonnal
संबंधित चर्चा: https://code.google.com/p/go/issues/detail?id=3885 –