2016-03-21 4 views
5

मैं गो में स्मृति आवंटन के प्रदर्शन की जांच करते हुए एक दिलचस्प बात पर ठोकर खाई।गोलांग टुकड़ा आवंटन प्रदर्शन

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 मिमी ले गए)। किसी को भी पता है कि क्या हो रहा है?

+1

विंडोज 7 (गो 1.6, 64 बिट) पर अपना कोड आजमाने के लिए और भी भिन्नता जोड़ने के लिए, मुझे लगता है कि 'आवंट' '65536' या' 65535' कोई फर्क नहीं पड़ता। – icza

+0

मैं आवंटन आंतरिक पर एक विशेषज्ञ नहीं हूं, लेकिन मैं बस उल्लेख करना चाहता हूं कि 65536 बाइट्स का एक टुकड़ा आवंटित करना वास्तव में उस प्लस 2 पूर्णांक ('लेन 'और' कैप 'काउंटर) आवंटित कर रहा है, इसलिए वास्तव में 64KB से अधिक। – Elwinar

+2

समस्या के लिए और अधिक जानकारी जोड़ने के लिए, मैंने अपने आर्कलिनक्स (i7-4720HQ @ 2.60GHz) पर कोड चलाया, और यह लगातार ~ 600ms लेता है। आपको सेटअप पर प्रोफाइलिंग टूल का उपयोग करने का प्रयास करना चाहिए जो लंबे समय तक लेता है। यदि आप इसे पहले से नहीं जानते हैं तो यह वास्तव में सीखना शुरू करने का एक अच्छा मामला है। – Elwinar

उत्तर

4

जीओजीसी = बेहतर प्रदर्शन बंद (100 एमएमएस से कम) को सेट करना। क्यूं कर? escape analysis के becaue। जब आप go build -gcflags -m के साथ बनाते हैं तो संकलक मुद्रित करता है जो भी आवंटन ढेर से बच निकलता है। यह वास्तव में आपकी मशीन और गो कंपाइलर संस्करण पर निर्भर करता है लेकिन जब संकलक निर्णय लेता है कि आवंटन ढेर में ले जाना चाहिए तो इसका मतलब है 2 चीजें: 1. आवंटन में अधिक समय लगेगा (चूंकि स्टैक पर "आवंटित" केवल 1 सीपीयू निर्देश है) 2. जीसी को बाद में उस मेमोरी को साफ करना होगा - मेरी मशीन के लिए अधिक CPU समय की लागत, 65536 बाइट्स का आवंटन ढेर से निकलता है और 65535 नहीं होता है। यही कारण है कि 1 बाइट्स ने पूरे प्रोसेस को 200ms से 30 तक बदल दिया। कमाल ..