गो मूल कोड में संकलित एक भाषा है, और इसलिए, जाहिर है, यह तेज होना चाहिए। हालांकि, दुर्भाग्य से, इस समय यह हमेशा सच से बहुत दूर है ।
मेरे मामले में, गो , 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
➜ गो बिल्ड ./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
वास्तविक 0m1.550s
उपयोगकर्ता 0m1.528s
sys 0m0.020s
इसके अलावा, ध्यान दें कि विभिन्न प्लेटफार्मों या विभिन्न लिंकर्स के लिए अलग-अलग कंपाइलरों का उपयोग करते समय अंतिम असेंबली में कुछ अंतर होता है। यहाँ जानकारी: blog.golang.org/gccgo-in-gcc-471
संक्षेप में, अगर आप g86go = = 4.7.1 का उपयोग करते हैं तो सब कुछ ठीक हो जाएगा। x86 (32/64) पर गोल्ड लिंकर के साथ जोड़ा। समस्याएं, शायद, बहुत डरावनी नहीं हैं, लेकिन अधिक लक्ष्य मंच दिखाई देते हैं। ऊपर दिए गए लिंक पर पोस्ट में विवरण।