गो कितनी तेजी से जा सकते हैं?


39

गो उन कुछ भाषाओं में से एक है, जिन्हें 'मेटल के करीब' चलना चाहिए, यानी यह बिना किसी वीएम के, मूल रूप से संकलित और कोड को निष्पादित करता है। यह जावा, C # और इस तरह से एक गति लाभ देना चाहिए। हालांकि, ऐसा लगता है कि यह जावा के पीछे है ( प्रोग्रामिंग लैंग्वेज शूटआउट देखें )

मैं यह मान रहा हूं कि इसके लिए कम परिपक्व संकलक बेहद जिम्मेदार हैं, लेकिन क्या कोई अन्य कारण हैं? क्या गो के डिजाइन में कुछ भी निहित है जो इसे जावा से अधिक तेज चलने से रोक सकता है? मेरे पास रनटाइम मॉडल के बारे में बहुत ही अनौपचारिक दृष्टिकोण है, लेकिन ऐसा लगता है कि कम से कम सिद्धांत रूप में यह जावा की तुलना में तेजी से चलने में सक्षम होना चाहिए, देशी कोड निष्पादन के लिए धन्यवाद।


3
पर्याप्त रूप से स्मार्ट कंपाइलर (और / या वीएम, और / या जेआईटी-कंपाइलर) को देखते हुए, दी गई भाषा हमेशा तेज हो सकती है (अच्छी तरह से, भौतिक सीमाएं हैं, लेकिन यह है)। बेशक यह ट्रूइज़म किसी को तब तक मदद नहीं करता है जब तक यह पर्याप्त रूप से स्मार्ट कंपाइलर नहीं है। ध्यान दें कि जावा में पहले से ही पर्याप्त रूप से स्मार्ट कार्यान्वयन हैं, और वे अविश्वसनीय रूप से स्मार्ट हैं। जीवन का एक और तथ्य यह है कि कार्यान्वयन के रूप में रनटाइम प्रदर्शन पर कोड रन का कम से कम प्रभाव होता है।

1
मुझे यह समझ में आता है, लेकिन मैं सोच रहा था कि क्या यह उचित है कि गो के मैच की गति की अपेक्षा की जाए / जैसे जावा का कंपाइलर परिपक्व हो।
ग्रेग स्लोडकोविज़

17
प्रोग्रामिंग भाषाओं में गति नहीं होती है। न ही भाषा कार्यान्वयन। किसी दिए गए भाषा कार्यान्वयन में कुछ दिए गए इनपुट की गति होती है, और यह गति इनपुट के आधार पर बहुत अधिक हो सकती है।

8
जागो मुझे .. इससे पहले कि तुम जाओ ... WHAM! । क्षमा करें, मैं विरोध नहीं कर सका। यहाँ झंडे आते हैं .. यहाँ झंडे आते हैं ..
Tim Post

2
@delnan - या "Java" कहने के बजाय "Java" कहना पूरी तरह से बहुत आसान है , मिश्रित विधा) ":-)
igouy

जवाबों:


46

भाषा डिजाइन के संदर्भ में, वास्तव में ऐसा कुछ भी नहीं है जो सामान्य रूप से जावा की तुलना में धीमा हो। वास्तव में, यह आपको अपने डेटा संरचनाओं के मेमोरी लेआउट का अधिक नियंत्रण देता है, इसलिए बहुत सारे सामान्य कार्यों के लिए यह कुछ हद तक तेज होना चाहिए। हालाँकि, वर्तमान प्राथमिक Go संकलक, अनुसूचक, कचरा संग्रहकर्ता, regexp पुस्तकालय, और बहुत सी अन्य चीजें विशेष रूप से अनुकूलित नहीं हैं। इसमें लगातार सुधार हो रहा है, लेकिन लगता है कि यह उपयोगी, सरल, और तेजी से माइक्रोबेनचर्च में जीतने के लिए पर्याप्त है।

लिंक किए गए बेंचमार्क में, गो बाइनरी ट्री और रेगेक्स टेस्ट पर जावा से बड़ा हार जाता है। वे क्रमशः मेमोरी मैनेजमेंट सिस्टम और regexp लाइब्रेरी के परीक्षण हैं। गो की मेमोरी प्रबंधन तेज हो सकती है और निश्चित रूप से समय के साथ सुधार होगा, और वर्तमान मानक regexp पुस्तकालय बहुत बेहतर कार्यान्वयन के लिए एक प्लेसहोल्डर है जो जल्द ही आने वाला है। इसलिए, उन दो पर हारना आश्चर्यजनक नहीं है, और निकट भविष्य में मार्जिन अधिक संकीर्ण होना चाहिए।

K- न्यूक्लियोटाइड बेंचमार्क के लिए, यह तुलना करना थोड़ा कठिन है क्योंकि जावा कोड एक अलग एल्गोरिथ्म का उपयोग करता है। गो कोड निश्चित रूप से कंपाइलर, शेड्यूलर और एलोकेटर सुधारों से लाभान्वित होगा, यहां तक ​​कि लिखित रूप में भी, लेकिन किसी को गो कोड को फिर से लिखना होगा ताकि हम अधिक सटीक तरीके से तुलना कर सकें।

जावा मैंडलब्रॉट बेंचमार्क में जीतता है क्योंकि यह सभी फ़्लोटिंग पॉइंट अंकगणित और लूप्स है, और जेवीएम के लिए रनटाइम के दौरान वास्तव में अच्छा मशीन कोड और होइस्ट चीजें उत्पन्न करने के लिए यह एक शानदार जगह है। तुलना में, एक बहुत सरल संकलक है जो वर्तमान में वास्तव में तंग मशीन कोड को लहराता, अनियंत्रित या उत्पन्न नहीं करता है, इसलिए यह आश्चर्यजनक नहीं है कि यह खो देता है। हालाँकि, एक को ध्यान में रखना चाहिए कि जावा टाइमिंग JVM स्टार्ट-अप टाइम की गिनती नहीं करता है या कई बार इसे JVM के लिए इसे अच्छी तरह से JIT करने के लिए चलाने की आवश्यकता होती है। लंबे समय तक चलने वाले कार्यक्रमों के लिए, यह प्रासंगिक नहीं है, लेकिन कुछ मामलों में यह मायने रखता है।

बेंचमार्क के बाकी हिस्सों के लिए, जावा और गो मूल रूप से गर्दन-इन-नेक हैं, गो काफी मेमोरी कम लेते हैं और ज्यादातर मामलों में कम कोड। इसलिए, जब गो उन परीक्षणों की संख्या में जावा की तुलना में धीमा है, तो जावा बहुत तेज है, गो तुलना में बहुत अच्छा करता है, और निकट भविष्य में गो शायद विशेष रूप से तेज हो जाएगा।

जब gccgo (गो संकलक का उपयोग करने वाला गो संकलक) परिपक्व हो, तो मैं आगे देख रहा हूँ; यह कई प्रकार के कोड के लिए C के अनुरूप बहुत अधिक जाना चाहिए, जो दिलचस्प होगा।


2
अच्छी तरह से किया, यह समझने के लिए कि स्रोत कोड को देखना और जांचना आवश्यक है कि क्या किया जा रहा है!
इगौई

1
उन कार्यक्रमों के लिए जावा शुरू हुआ समय पर, देखें shootout.alioth.debian.org/help.php#java
igouy

2
ऐसा इसलिए है कि वास्तव में इस सवाल का जवाब की तरह मैं के लिए, धन्यवाद उम्मीद कर रहा था!
ग्रेग स्लोडकोविज़

बहुत कम कोड और मेमोरी उपयोग, मशीन कोड के संकलन, बेहतर डिज़ाइन किए गए। यह सब गति के नुकसान को नियंत्रित करता है।
मोशे रेवह

22
  1. यह कहे बिना कि कौन सी समस्याएं हल की गईं, पूरा बेंचमार्क बेकार है।
  2. JVM और CLR दोनों JITs का उपयोग मशीन कोड बनाने के लिए करते हैं। कोई कारण नहीं है कि यह धीमा होना चाहिए। यह सिर्फ आपको बूट करने के लिए उम्र खर्च करता है।
  3. गो को तेजी से निर्माण करने के लिए डिजाइन किया गया था । आपके पास संकलन समय और बूट समय अनुकूलन के टन नहीं हैं। एक जावा ऐप के बूट होने तक गो अपनी खुद की मानक लाइब्रेरी संकलित करता है।

गो रनटाइम में तेज हो सकता है? हाँ। क्या गो रनटाइम में कभी तेज होगा? मुझे नहीं पता। हो सकता है कि कंपाइलर बिल्डर्स कंपाइल समय की कीमत पर वैकल्पिक अनुकूलन जोड़ देंगे। लेकिन मुझे नहीं लगता कि उनकी इसमें ज्यादा रुचि है। वे Google पर काम करते हैं।
वे जो चाहते हैं वह एक ऐसी भाषा है जो तेजी से विकास की अनुमति देती है और जो वे करते हैं उसमें अच्छा प्रदर्शन करती है। नरक, भले ही वह बेंचमार्क विश्वसनीय था, इसका मतलब यह होगा कि वे सी के रूप में आधे के रूप में तेज़ हैं और 14 बार पायथन के रूप में उपवास करते हैं। यह काफी अच्छे से अधिक है।
हार्डवेयर सस्ता है, कोड महंगा है। जैसे ही आप पैसा लगाते हैं, कोड बड़ा और धीमा होता जाता है, हार्डवेयर सस्ता और छोटा होता जाता है। आप एक ऐसी भाषा चाहते हैं, जिसके लिए किसी उपयोगी चीज को पूरा करने के लिए 4 रूपरेखा और 2000 वर्गों की आवश्यकता न हो।
गो के डिजाइन में कुछ भी अंतर्निहित नहीं है, जो इसे धीमा कर देता है। हालाँकि गो के डिजाइनरों में कुछ अंतर्निहित है, जो इसे विधानसभा की तुलना में धीमा बनाता है: सामान्य ज्ञान।


1
अधिकांश (सभी?) जेआईटी रनटाइम के दौरान संकलन करते हैं, न कि जब कोड पहली बार लोड किया जाता है। इस मशीन कोड कुछ कोड के लिए सभी में उत्पन्न नहीं किया जा सकता है और यह भी आसानी से अवैध जा सकता है, उदाहरण के लिए अगर objsमें for (obj : objs) { obj.meth() }के विभिन्न कार्यान्वयन है methहर बार और JIT की कोशिश करता यह इनलाइन करने के लिए। बेशक, यह सब वास्तव में आम मामलों में एक लाभ है, लेकिन फिर भी नोट योग्य है।

@delnan: V8 किसी भी कोड को निष्पादित करने से पहले JIT करता है। इसके अलावा, एलएलवीएम को जेआईटी को ध्यान में रखकर बनाया गया था, इसलिए (निश्चित रूप से कुछ प्रयासों के साथ) आप किसी भी समय में कोई अनुकूलन कर सकते हैं, अन्यथा यह संकलन समय पर होगा। हालांकि, कुछ अनुकूलन, जैसे कि बच विश्लेषण केवल वास्तव में जेआईटी के साथ काम करते हैं।
back2dos

3
>> बिना यह कहे भी कि कौन सी समस्याएं हल हुईं << देखो और आप पाएंगे कि वे वेब पेज कहते हैं कि कौन सी समस्याएं हल हुईं। वास्तव में, आपको प्रोग्राम सोर्स कोड मिलेगा, कमांड्स बनाएंगे, कमांड्स चलाएंगे, भाषा कार्यान्वयन संस्करण, या दा दा हां
igouy

10

मैंने यह भी देखा है कि गो विशेष रूप से regex-dna बेंचमार्क में धीमा था । Russ कॉक्स ने बताया कि गो इस विशेष बेंचमार्क में वह प्रदर्शन क्यों नहीं था । इसका कारण यह है कि गो का regexp पैकेज एक अलग मिलान एल्गोरिथ्म का उपयोग कर रहा है जो इस विशेष बेंचमार्क में खराब प्रदर्शन करता है, लेकिन अन्य बेंचमार्क में तेजी से परिमाण द्वारा हो सकता है । इसके अलावा रूबी, पायथन और अन्य स्क्रिप्टिंग भाषाएं एक अन्य रेग्जैक्स मिलान एल्गोरिदम के सी कार्यान्वयन का उपयोग कर रही हैं ।

अंत में कंप्यूटर लैंग्वेज बेंचमार्क गेम में माइक्रो-बेंचमार्क शामिल होते हैं जो मापी गई भाषाओं की कई विशेषताओं को ठीक से प्रतिबिंबित नहीं कर सकते हैं और यहां तक ​​कि गलत इंप्रेशन को भी मध्यस्थ कर सकते हैं। हाल ही में Google द्वारा प्रकाशित किया गया यह शोध पत्र गो, स्काला, जावा और सी ++ की कई भाषा विशेषताओं का अधिक सटीक अवलोकन देता है - विशेष रूप से "वी। प्रदर्शन विश्लेषण" भाग। तो अंत में Go की लगभग मेमोरी के रूप में जावा (Java की मेमोरी का 81%) के रूप में उपयोग किया जाता है और यहां तक ​​कि 170% मेमोरी का भी उपयोग करता है, जितना कि स्काला (जेवीएम की मेमोरी की खपत को माना जाता है)।

लेकिन फिर से, गो के युवा और अभी भी भारी विकास (एपीआई परिवर्तन) के तहत! कई सुधार जल्द ही आ रहे हैं।


3
>> यह शोध पत्र, हाल ही में Google द्वारा प्रकाशित << यह एक शोध पत्र नहीं है, और यह Google द्वारा प्रकाशित नहीं किया गया था। यह "स्काला डेज़ 2011" स्काला वर्कशॉप में प्रस्तुत एक Google कर्मचारी की एक अनुभव रिपोर्ट है।
इगौई

>> मापी गई भाषाओं की कई विशेषताओं को ठीक से प्रतिबिंबित नहीं कर सकता है और यहां तक ​​कि गलत इंप्रेशन को भी मध्यस्थता कर सकता है << यह सिर्फ "लूप मान्यता" कार्यक्रमों के रूप में सच है, और विभिन्न प्रोग्रामिंग भाषाओं के बीच हर प्रदर्शन तुलना के सच होने की संभावना है। वास्तव में लेखक आपको बताता है - "हम मल्टी-थ्रेडिंग या उच्च स्तरीय प्रकार के तंत्र के किसी भी पहलू का पता नहीं लगाते हैं ... हम भारी संख्यात्मक गणना भी नहीं करते हैं ..."
igouy

@igouy कवर पर आप "Google" पढ़ सकते हैं और प्रासंगिक सब कुछ संबंधित संदर्भों के साथ कवर किया गया है। तो क्यों यह "शोध पत्र नहीं है, जो Google द्वारा प्रकाशित किया गया है" यदि Google का मुख्यालय के पते से उल्लेख किया गया है? शोध पत्र केवल अकादमिया-मात्र डोमेन नहीं हैं।
एलेक्स

कवर पर आप उस मेलिंग पते को पढ़ सकते हैं जिस पर लेखक से संपर्क किया जा सकता है, और लेखक का ईमेल पता। आपके द्वारा पोस्ट किए गए पीडीएफ के URL की जांच करें। डोमेन पर ध्यान दें - days2011.scala-lang.org - स्काला डेज़ 2011 "स्काला वर्कशॉप।
igouy

1

Go पायथन से तेज़ है और जावा से थोड़ा धीमा है। मेरे मोटे अनुभव ने पाया है कि पायथन की तुलना में गो बहुत अधिक (परिमाण के 1-2 क्रम) और जावा की तुलना में लगभग 10-20% धीमा है। हालाँकि, यदि यह क्वाड-कोर (x64) के साथ प्रयोग किया जाता है, तो गो जावा की तुलना में थोड़ा तेज़ है। मेमोरी रैम के संदर्भ में गो बहुत अधिक कुशल है।

मैं जावा और पायथन के प्रदर्शन के लिए गो की क्षमता के बारे में कुछ बिंदु जोड़ना चाहूंगा। गो उन चीजों की अधिक अनुमति देता है जो C करता है जो लगातार C को अधिकांश अन्य भाषाओं को बेहतर बनाने की अनुमति देता है। उच्च प्रदर्शन कोड से बचने के लिए कैश मिक्स काफी महत्वपूर्ण हैं। कैश मिस को कम करने के लिए आपके डेटा संरचनाओं की मेमोरी लेआउट को नियंत्रित करने की आवश्यकता होती है। गो आपको ऐसा करने की अनुमति देता है। जावा ऐसा नहीं है जो मेमोरी और कैश के फ्रैक्चर से बचना कठिन बनाता है।

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

इसलिए मुझे लगता है कि जावा के पिछले किनारों से पहले यह वास्तव में समय का सवाल है। हालाँकि किसी भी भाषा कोड के साथ गो में लिखे होने की संभावना अपने आप तेज़ होने वाली नहीं है। आपको उन सुविधाओं का उपयोग करना होगा जो भाषा आपको देती है। मैं कहूंगा कि गो केवल आपके कोड को ट्यून करने के अधिक अवसर देता है।

वैसे भी, यह सिर्फ एक डेवलपर का अनुभव है।


4
यह एक 8 साल पुराना सवाल है और सस्ती कंप्यूटिंग शक्ति ने इसे बहुत अप्रासंगिक बना दिया है। आपका उत्तर भी कठिन डेटा के बजाय "आपकी भावना" पर आधारित है। मेरा मतलब आपको हतोत्साहित करना नहीं है, लेकिन ...
कायमन जू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.