2013-02-25 11 views
6

मुझे यकीन है कि golang जानने वाले सभी को पता है कि blog post यहां।उस विशेष मामले में जीसीओ से जीसीजी धीमा क्यों है?

इसे फिर से पढ़ना, मुझे आश्चर्य हुआ कि के बजाय gccgo का उपयोग करके गति थोड़ी अधिक बढ़ जाएगी। मेरे सामान्य उपयोग मामले (वैज्ञानिक कम्प्यूटेशंस) में, gccgo-जनरेटेड बाइनरी go build-जनरेटेड से हमेशा तेज होती है।

तो, सिर्फ इस फ़ाइल हड़पने: havlak6.go और यह संकलन:

go build havlak6.go -O havlak6_go 
gccgo -o havlak6_gccgo -march=native -Ofast havlak6.go 

आश्चर्य!

$/usr/bin/time ./havlak6_go 
5.45user 0.06system 0:05.54elapsed 99%CPU 

$/usr/bin/time ./havlak6_gccgo 
11.38user 0.16system 0:11.74elapsed 98%CPU 

मैं उत्सुक हूं और जानना चाहता हूं कि "अनुकूलन" कंपाइलर धीमी कोड क्यों उत्पन्न करता है। कोई भाग्य के साथ

gccgo -pg -march=native -Ofast havlak6.go 
./a.out 
gprof a.out gmon.out 

:

मैं gccgo उत्पन्न द्विआधारी पर gprof का उपयोग करने की कोशिश की

Flat profile: 

Each sample counts as 0.01 seconds. 
no time accumulated 

कोड वास्तव प्रोफाइल नहीं किया गया है के रूप में आप देख सकते हैं।

बेशक

, मैं this पढ़ते हैं, लेकिन जैसा कि आप देख सकते हैं, कार्यक्रम 10+ सेकंड लेता है निष्पादित करने के लिए ... नमूनों की संख्या होना चाहिए> 1000

मैं भी करने की कोशिश की:

rm a.out gmon.out 
LDFLAGS='-g -pg' gccgo -g -pg -march=native -Ofast havlak6.go 
./a.out 
gprof 

कोई सफलता न तो।

क्या आप जानते हैं कि क्या गलत है? क्या आपको पता है कि gccgo क्यों है, इसकी सभी अनुकूलन दिनचर्या gc से अधिक इस मामले में तेज़ी से विफल हो जाती है?

go संस्करण: 1.0.2 gcc संस्करण: 4.7.2

संपादित करें:

ओह, मैं पूरी तरह से भूल गया उल्लेख करने के लिए ... मैं स्पष्ट रूप से gccgo -generated द्विआधारी पर pprof की कोशिश की। .. यहाँ एक top10 है:

Welcome to pprof! For help, type 'help'. 
(pprof) top10 
Total: 1143 samples 
    1143 100.0% 100.0%  1143 100.0% 0x00007fbfb04cf1f4 
     0 0.0% 100.0%  890 77.9% 0x00007fbfaf81101e 
     0 0.0% 100.0%  4 0.3% 0x00007fbfaf8deb64 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f2faf 
     0 0.0% 100.0%  3 0.3% 0x00007fbfaf8f2fc5 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f2fc9 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f2fd6 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f2fdf 
     0 0.0% 100.0%  2 0.2% 0x00007fbfaf8f4a2f 
     0 0.0% 100.0%  1 0.1% 0x00007fbfaf8f4a33 

और यही कारण है मैं कुछ और की तलाश में हूँ है।

EDIT2:

ऐसा लगता है के बाद से है कि किसी को बंद करना पड़ा मेरे सवाल करना चाहता है, मैं नीले रंग से बाहर gprof उपयोग करने का प्रयास नहीं किया: gccgo-उत्पन्न द्विआधारी चल रहा है के तहत वेलग्रिंड लगता https://groups.google.com/d/msg/golang-nuts/1xESoT5Xcd0/bpMvxQeJguMJ

+0

लोग अभी भी [* विहित प्रोफाइलर रूप gprof में विश्वास करते हैं। *] (Http://stackoverflow.com/a/1779343/23771)। कुछ अंक: 1) gprof उथले कॉल के ढेर के साथ सीपीयू बाध्य कार्यक्रमों के लिए ही उपयोगी है, प्रत्यावर्तन के बिना, जिसके लिए यह सब प्रतीक हैं। 2) संकलक अनुकूलन केवल तंग आंतरिक छोरों या दिनचर्या एक बहुत कहा जाता है, अपने कोड में, है कि खुद को कार्य (स्मृति आवंटन, आदि) की तरह फोन नहीं में एक फर्क पड़ता है। कंपाइलर अनुकूलन सिर्फ सबकुछ तेज़ी से नहीं चलाता है। –

+0

हां, मुझे यह gprof के लिए मिला है। और मैं संकलक अनुकूलन के बारे में आपसे सहमत हूं। हालांकि, मैं ऑप्टिमाइज़ेशन-सक्षम कंपाइलर के साथ या तो खराब प्रदर्शन की अपेक्षा नहीं करता। प्रदर्शन बराबर या बेहतर होना चाहिए। यदि नहीं, तो वहाँ सुधार की गुंजाइश है और मैं समझता हूँ करना चाहते हैं यही कारण है कि :) –

+0

केवल समय मैं कभी भी ऐसा एंड-टू-एंड, संभवतः 10^n बार दोहराया और कहा कि से विभाजित है, और मैं के लिए मत देखो है 3 अंकों से अधिक सटीकता। शोर है और मुझे परवाह नहीं है। फिर मैं इसे तेजी से बनाने के तरीकों की तलाश करने के लिए यादृच्छिक रुकने का उपयोग करता हूं। जब तक कि यह पहले से ही स्पंज की तरह निचोड़ा नहीं गया है, मुझे रास्ता मिलेंगे, और फिर मैं इसे फिर से कर सकता हूं। जब कई चक्र के बाद मैं रिटर्न ह्रासमान मारा, और पीसी मेरी उत्पन्न निर्देश में सबसे अधिक बार है, तो मैं अनुकूलक है, जो यह हो सकता है 10% तेजी से बनाता है पर बारी। Whoopee। –

उत्तर

2

यह इंगित करने के लिए कि gccgo में एक अक्षम स्मृति आवंटक है। यह कारणों में से एक हो सकता है कि gccgo 4.7.2 go 1.0.2 से धीमा है। 1.0 जाकर उत्पन्न बाइनरी चलाने के लिए असंभव है।2 वालग्रिंड के तहत, इसलिए इस तथ्य की पुष्टि करना मुश्किल है कि इस मामले में स्मृति आवंटन gccgo की प्राथमिक प्रदर्शन समस्या है या नहीं।

+0

'वालग्रिंड' का उल्लेख करने के लिए धन्यवाद। यह पहली बार है जब मैं प्रोफाइलिंग में खोदता हूं और हालांकि मैं gprof प्रोफाइलर था ... मैं गलत था :) हालांकि ऐसा लगता है कि 'वालग्रिंड' सी-केवल प्रोफाइलर/प्रोफाइलिंग फ्रेमवर्क है। यह अनियंत्रित मूल्यों के बारे में शिकायत करता है और ऐसा लगता है कि "बिल्कुल" नहीं मिलता है ... क्या आप थोड़ा सा विस्तार कर सकते हैं? –

+0

मैंने gacgo- जेनरेट कोड के व्यवहार की जांच करने के लिए 'valgrind --tool = callgrind' और KCacheGrind का उपयोग किया था। वेलग्रिंड के callgrind भी कई गैर सी कोड चलाने में सक्षम है, लेकिन दुर्भाग्य से यह मान्यताओं जो go1.0.2-उत्पन्न बाइनरी का उल्लंघन कर रहे हैं कर रही है। https://code.google.com/p/go/issues/detail?id=782 –

0

याद रखें go build सेब की तुलना में सेब के लिए स्थिर लिंकिंग के लिए डिफ़ॉल्ट भी है, तो आपको -static या -static-libgo विकल्प gccgo देना चाहिए।

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