2015-07-29 3 views
7

मैं गोलांग में एक मानचित्र का उपयोग करके एक स्पैर मैट्रिक्स को कार्यान्वित कर रहा था और मैंने देखा कि इस परिवर्तन के बाद मेरे कोड को पूरा करने में काफी समय लग रहा है, अन्य संभावित कारणों को खारिज करने के बाद, ऐसा लगता है कि अपराधी मानचित्र पर ही पुनरावृत्ति है। 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 के रूप में धीमी गति से जब एक टुकड़ा की तुलना में?

+5

* मानचित्र पर फिर से धीमा होने पर क्यों नहीं चल रहा है? एक टुकड़ा सिर्फ संगत स्मृति है, जबकि एक हैशप एक अधिक जटिल डेटा संरचना है। – JimB

+0

वैसे स्पष्ट जवाब यह है कि अंतर्निहित संरचनाएं एक सरणी और हैश तालिका हैं। एक मामले में आप प्रत्येक के लिए मूल्य तक पहुंचने के लिए चाबियाँ और (रेंज एब्स्ट्रक्शन में) पुनरावृत्त कर रहे हैं। दूसरे में आप स्मृति के निरंतर ब्लॉक पर चल रहे हैं। – evanmcdonnal

+0

संबंधित चर्चा: https://code.google.com/p/go/issues/detail?id=3885 –

उत्तर

11

यह स्मृति में प्रतिनिधित्व के लिए नीचे आता है। विभिन्न डेटा संरचनाओं और एल्गोरिदमिक जटिलता की अवधारणा के प्रतिनिधित्व के साथ आप कितने परिचित हैं? एक सरणी या टुकड़ा पर इटरेट करना सरल है। मान स्मृति में संगत हैं। हालांकि किसी मानचित्र पर पुनरावृत्ति करने के लिए कुंजी स्थान को घुमाने और हैश-टेबल संरचना में लुकअप करना आवश्यक है।

एक विरल सरणी का आवंटन अंतरिक्ष के टन का उपयोग कर के बिना किसी भी मूल्य की चाबी डालने के लिए नक्शे के गतिशील क्षमता, और तथ्य यह है कि लुक-अप एक सरणी के रूप में के रूप में तेजी से नहीं होने के बावजूद कुंजी अंतरिक्ष से अधिक कुशलता से किया जा सकता है, क्यों हैंश टेबल को कभी-कभी किसी सरणी पर पसंद किया जाता है, हालांकि सरणी (और स्लाइस) में एक तेज़ "निरंतर" (O(1)) एक इंडेक्स दिया गया लुकअप समय होता है।

यह सब नीचे आता है कि आपको इस या उस डेटा संरचना की विशेषताओं की आवश्यकता है और क्या आप साइड इफेक्ट्स या गेटचास से निपटने के इच्छुक हैं या नहीं।

+3

हैश तालिकाओं को 'ओ (1)' माना जाता है, लेकिन एक सरणी से अधिक स्थिर होता है। सरणी को अनुक्रमणित करने के लिए समय जटिलता को 'Θ (1) '(बड़ा थेटा) के रूप में वर्गीकृत किया जाता है। – JimB

+0

धन्यवाद मैंने इसे संपादित किया है। यह थोड़ी देर हो गया है और मैं काफी अस्पष्ट हूं, लेकिन यह पूरी तरह से सही है। – Nick

4

मेरी टिप्पणी को एक उत्तर के रूप में रखने के लिए उचित लगता है। अंतर्निहित संरचनाएं जो आप तुलना कर रहे हैं पुनरावृत्ति प्रदर्शन हैश तालिका और एक सरणी (https://en.wikipedia.org/wiki/Hash_table बनाम https://en.wikipedia.org/wiki/Array_data_structure) हैं। रेंज अमूर्तता वास्तव में है (अनुमान, कोड नहीं मिल सकता है) सभी चाबियों को फिर से भरना, प्रत्येक मान तक पहुंचना, और दो को k,v := असाइन करना। यदि आप सरणी में पहुंचने से परिचित नहीं हैं, तो यह स्थिर समय है क्योंकि आप आइटम प्राप्त करने के लिए प्रारंभिक पॉइंटर में आकार (प्रकार) * जोड़ते हैं। मुझे नहीं पता कि नक्शा के आंतरिक गोलांग में क्या हैं, लेकिन मुझे यह जानने के लिए पर्याप्त पता है कि यह स्मृति प्रतिनिधित्व है और वहां पहुंच के लिए कुछ भी कुशल नहीं है।

विषय पर चश्मा विवरण अधिक नहीं है; http://golang.org/ref/spec#For_statements

यदि मुझे मानचित्र और टुकड़ा/सरणी के लिए सीमा के कार्यान्वयन को देखने का समय मिलता है तो मैं कुछ और तकनीकी विवरण दूंगा।

+0

यह एक अच्छा जवाब है और विशिष्ट गोलांग विवरण के साथ और अधिक सौदों। – Nick

संबंधित मुद्दे