गो पर एक कार्यक्रम को कैसे गति दें

काश, मैं अपना ब्लॉग नहीं रखता, और मैं हाल ही की "खोज" के परिणाम को आवश्यक नोट के रूप में प्रकाशित करने पर विचार करता हूं। मुझे लगता है कि ऐसे लोग होंगे जो इसे उपयोगी पाएंगे।



गो मूल कोड में संकलित एक भाषा है, और इसलिए, जाहिर है, यह तेज होना चाहिए। हालांकि, दुर्भाग्य से, इस समय यह हमेशा सच से बहुत दूर है

मेरे मामले में, गो , PHP से हार गया (ठीक है, वास्तव में सी में एक PHP मॉड्यूल है, लेकिन परिणाम अभी भी निराशाजनक है)। संक्षेप में, व्हर्लपूल हैश की गणना करते समय, गो 3.5-7.5 बार खो दिया!



कई स्रोत समान कारण बताते हैं - "कमजोर" मानक गो संकलक (जिसे गो बिल्ड कहा जाता है)। यह पूरी तरह सच है। तथ्य यह है कि संकलक काफी "युवा" है और अब तक अनुकूलन का कोई सामान नहीं है, उदाहरण के लिए, जीसीसी के पास है।

एक समाधान है - गो संकलक का एक प्रकार है - gccgo।

अनुकूलन के साथ gccgo के माध्यम से कार्यक्रम का निर्माण निम्नानुसार है:

go build -compiler gccgo -gccgoflags "-march=native -O3" main.go





इस मामले में, वर्तमान उपकरणों पर सभी उपलब्ध अनुकूलन और निर्देशों के साथ एक विधानसभा का प्रदर्शन किया जाएगा।

सामान्य तौर पर, बस -O2 विकल्प का उपयोग करें।



मेरे मामले के लिए परीक्षण के परिणाम:

छिपा हुआ पाठ
# स्टैंडआर्ट कंपाइलर

➜ गो बिल्ड ./dedup.go

➜ समय ।/dedup> / dev / null



असली 0m4.612s

उपयोगकर्ता 0m4.588s

sys 0m0.020s



# अनुकूलन के बिना gccgo संकलक

➜ go build -compiler gccgo ./dedup.go

➜ समय ।/dedup> / dev / null



असली 0m2.110s

उपयोगकर्ता 0m2.084s

sys 0m0.024s



# PHP कार्यान्वयन

➜ समय php hash.php> / dev / null



असली 0m0.634s

उपयोगकर्ता 0m0.608s

sys 0m0.024s



# अनुकूलन के साथ gccgo

➜ गो बिल्ड -a -gccgoflags "-march = native -O3" -compiler gccgo ./dedup.go

➜ समय ।/dedup> / dev / null



वास्तविक 0m0.534s

उपयोगकर्ता 0m0.512s

sys 0m0.020s





कुल मिलाकर, अनुकूलन के साथ gccgo द्वारा संकलित कार्यक्रम का रनटाइम बिना अनुकूलन के निर्माण की तुलना में 4.29.2 गुना अधिक तेज था।

सारांश "प्लेट":

विकल्प सापेक्ष समय
gccgo को अनुकूलित किया गया 85%
पीएचपी 100%
gc v1.2.1 210%
gccgo 350%
gc v1 750%


इस पर, सामान्य रूप से, सब कुछ, आपके ध्यान के लिए धन्यवाद।



UPD1 : 1.2.1 में संकलक काफी बेहतर परिणाम देता है (तालिका में जोड़ा गया):

छिपा हुआ पाठ
➜ समय ।/dedup> / dev / null



वास्तविक 0m1.550s

उपयोगकर्ता 0m1.528s

sys 0m0.020s



इसके अलावा, ध्यान दें कि विभिन्न प्लेटफार्मों या विभिन्न लिंकर्स के लिए अलग-अलग कंपाइलरों का उपयोग करते समय अंतिम असेंबली में कुछ अंतर होता है। यहाँ जानकारी: blog.golang.org/gccgo-in-gcc-471

संक्षेप में, अगर आप g86go = = 4.7.1 का उपयोग करते हैं तो सब कुछ ठीक हो जाएगा। x86 (32/64) पर गोल्ड लिंकर के साथ जोड़ा। समस्याएं, शायद, बहुत डरावनी नहीं हैं, लेकिन अधिक लक्ष्य मंच दिखाई देते हैं। ऊपर दिए गए लिंक पर पोस्ट में विवरण।



All Articles