मैं गो में स्मृति आवंटन के प्रदर्शन की जांच करते हुए एक दिलचस्प बात पर ठोकर खाई।गोलांग टुकड़ा आवंटन प्रदर्शन
package main
import (
"fmt"
"time"
)
func main(){
const alloc int = 65536
now := time.Now()
loop := 50000
for i := 0; i<loop;i++{
sl := make([]byte, alloc)
i += len(sl) * 0
}
elpased := time.Since(now)
fmt.Printf("took %s to allocate %d bytes %d times", elpased, alloc, loop)
}
मैं जाने संस्करण 1.6 64 बिट (32 बिट पर भी एक ही परिणाम) और 16GB रैम (Windows 10 पर) तो यह चलता है जब alloc 65536 (वास्तव में 64K) है के साथ एक कोर-i7 2600 पर इस चला रहा हूँ 30 सेकंड के लिए (!!!!)। जब आवंटन 65535 है तो यह ~ 200ms लेता है। क्या कोई मुझे यह समझा सकता है? मैंने अपने कोर i7-920 @ 3.8GHZ के साथ घर पर एक ही कोड की कोशिश की लेकिन यह एक ही परिणाम नहीं दिखाया (दोनों 200 मिमी ले गए)। किसी को भी पता है कि क्या हो रहा है?
विंडोज 7 (गो 1.6, 64 बिट) पर अपना कोड आजमाने के लिए और भी भिन्नता जोड़ने के लिए, मुझे लगता है कि 'आवंट' '65536' या' 65535' कोई फर्क नहीं पड़ता। – icza
मैं आवंटन आंतरिक पर एक विशेषज्ञ नहीं हूं, लेकिन मैं बस उल्लेख करना चाहता हूं कि 65536 बाइट्स का एक टुकड़ा आवंटित करना वास्तव में उस प्लस 2 पूर्णांक ('लेन 'और' कैप 'काउंटर) आवंटित कर रहा है, इसलिए वास्तव में 64KB से अधिक। – Elwinar
समस्या के लिए और अधिक जानकारी जोड़ने के लिए, मैंने अपने आर्कलिनक्स (i7-4720HQ @ 2.60GHz) पर कोड चलाया, और यह लगातार ~ 600ms लेता है। आपको सेटअप पर प्रोफाइलिंग टूल का उपयोग करने का प्रयास करना चाहिए जो लंबे समय तक लेता है। यदि आप इसे पहले से नहीं जानते हैं तो यह वास्तव में सीखना शुरू करने का एक अच्छा मामला है। – Elwinar