हास्केल (GHC) इतना तेज़ क्यों है?


247

हास्केल ( GHCसंकलक के साथ ) आपकी अपेक्षा से बहुत अधिक तेज है । सही तरीके से इस्तेमाल होने पर, यह निम्न-स्तर की भाषाओं के करीब-ईश प्राप्त कर सकता है। (Haskellers के लिए एक पसंदीदा बात यह है कि C के 5% के भीतर प्रयास करें और प्राप्त करें (या इसे हरा भी दें, लेकिन इसका मतलब है कि आप एक अक्षम C प्रोग्राम का उपयोग कर रहे हैं, क्योंकि GHC Haskell को C से संकलित करता है)।) मेरा सवाल है, क्यों?

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

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

खेद है कि अगर यह भयंकर लग रहा है, लेकिन यहाँ मेरा सवाल है: हास्केल (जीएचसी के साथ संकलित) इतनी तेज क्यों है, इसकी अमूर्त प्रकृति और भौतिक मशीनों से अंतर को देखते हुए?

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


27
"चूंकि GHC हास्केल को C" में संकलित करता है - यह नहीं है। GHC में कई बैकएंड हैं। सबसे पुराना एक (लेकिन डिफ़ॉल्ट नहीं) एक सी जनरेटर है। यह IR के लिए Cmm कोड उत्पन्न करता है, लेकिन यह "C का संकलन" नहीं है, जिसकी आप सामान्य रूप से अपेक्षा करते हैं। ( downloads.haskell.org/~ghc/latest/docs/html/users_guide/… )
viraptor

20
मैं साइमन पेटन जोन्स (जीएचसी के प्राथमिक कार्यान्वयनकर्ता) द्वारा कार्यात्मक प्रोग्रामिंग भाषाओं के कार्यान्वयन को पढ़ने की अत्यधिक सलाह देता हूं, यह आपके कई सवालों का जवाब देगा।
जो हिलेंब्रांड

94
क्यों? 25 साल की कड़ी मेहनत।
अगस्त २ aug

31
"भले ही इसका कोई तथ्यात्मक उत्तर हो, लेकिन यह कुछ भी नहीं, बल्कि एक राय होगी।" - किसी प्रश्न को बंद करने का यह सबसे खराब संभावित कारण है। क्योंकि इसका एक अच्छा जवाब हो सकता है, लेकिन यह संभवतः कम गुणवत्ता वाले लोगों को भी आकर्षित करेगा। नीरस मुझे ऐसा लगता है कि अकादमिक शोध के बारे में एक अच्छा, ऐतिहासिक, तथ्यात्मक जवाब दिया गया है और जब कुछ विकास हुआ है। लेकिन मैं इसे पोस्ट नहीं कर सकता क्योंकि लोग चिंतित हैं यह प्रश्न कम गुणवत्ता वाले उत्तर भी आकर्षित कर सकता है। फिर से, हाँ
sclv

7
@ साइमनमैन को एक कार्यात्मक संकलक कैसे काम करता है , इसके विवरण की मूल बातों के माध्यम से चलने के लिए मुझे एक महीने या कई ब्लॉग पोस्ट की आवश्यकता होगी । मुझे केवल व्यापक रूपरेखा में स्केच करने के लिए एक एसओ उत्तर की आवश्यकता है कि कैसे एक ग्राफ मशीन को स्टॉक हार्डवेयर पर सफाई से लागू किया जा सकता है और आगे पढ़ने के लिए प्रासंगिक स्रोतों को इंगित किया जा सकता है ...
sclv

जवाबों:


264

मैं डिट्रिच एप के साथ सहमत हूं: यह कई चीजों का संयोजन है जो जीएचसी को तेज बनाते हैं।

और सबसे पहले, हास्केल बहुत उच्च-स्तरीय है। यह संकलक को आपके कोड को तोड़ने के बिना आक्रामक अनुकूलन करने में सक्षम बनाता है ।

SQL के बारे में सोचो। अब, जब मैं एक SELECTबयान लिखता हूं , तो यह एक अनिवार्य लूप की तरह लग सकता है , लेकिन ऐसा नहीं है । ऐसा लग सकता है कि यह उस तालिका की सभी पंक्तियों पर लूप करता है जो निर्दिष्ट शर्तों से मेल खाने वाले को खोजने की कोशिश कर रहा है, लेकिन वास्तव में "कंपाइलर" (डीबी इंजन) इसके बजाय एक इंडेक्स लुकअप कर सकता है - जिसमें पूरी तरह से अलग प्रदर्शन विशेषताएं हैं। लेकिन चूँकि SQL इतना उच्च-स्तर का है, इसलिए "कंपाइलर" पूरी तरह से अलग एल्गोरिदम को स्थानापन्न कर सकता है, कई प्रोसेसर या I / O चैनल या पूरे सर्वर को पारदर्शी रूप से लागू कर सकता है, और बहुत कुछ।

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

इसे देखने का एक और तरीका हो सकता है ... हास्केल को तेज क्यों नहीं होना चाहिए ? यह क्या करता है कि इसे धीमा करना चाहिए?

यह पर्ल या जावास्क्रिप्ट जैसी व्याख्या वाली भाषा नहीं है। यह जावा या C # जैसी वर्चुअल मशीन प्रणाली भी नहीं है। यह देशी मशीन कोड के लिए नीचे सभी तरह से संकलित करता है, इसलिए कोई उपरि नहीं है।

OO भाषाओं के विपरीत [जावा, C #, जावास्क्रिप्ट…], हास्केल में पूर्ण प्रकार का क्षरण होता है [जैसे C, C ++, पास्कल…]। सभी प्रकार की जाँच केवल संकलन-समय पर होती है। इसलिए आपको धीमा करने के लिए कोई रन-टाइम टाइप-चेकिंग नहीं है। (उस मामले के लिए कोई नल-पॉइंटर चेक नहीं है। जावा, जेवीएम को अशक्त बिंदुओं की जांच करनी चाहिए और यदि आप एक को टालते हैं तो अपवाद को फेंक दें। हास्केल को उस चेक से परेशान नहीं होना चाहिए।)

आप कहते हैं कि यह "रन-टाइम में फ़्लाई पर फ़ंक्शंस बनाने" में धीमा लगता है, लेकिन यदि आप बहुत ध्यान से देखते हैं, तो आप वास्तव में ऐसा नहीं करते हैं। यह आप की तरह लग सकता है, लेकिन आप नहीं करते। यदि आप कहते हैं (+5), ठीक है, कि आपके स्रोत कोड में हार्ड-कोडित है। यह रन-टाइम में नहीं बदल सकता। तो यह वास्तव में एक गतिशील कार्य नहीं है। यहां तक ​​कि करीकृत कार्य वास्तव में सिर्फ डेटा ब्लॉक में मापदंडों को बचा रहे हैं। सभी निष्पादन योग्य कोड वास्तव में संकलन-समय पर मौजूद हैं; कोई रन-टाइम व्याख्या नहीं है। (कुछ अन्य भाषाओं के विपरीत, जिनमें "eval function" है।)

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

मुझे लगता है कि बात यह है कि हास्केल उन्नत और परिष्कृत और उच्च-स्तरीय दिखता है, और हर कोई सोचता है कि "अरे वाह, यह वास्तव में शक्तिशाली है, यह आश्चर्यजनक रूप से धीमा होना चाहिए! " लेकिन यह नहीं है। या कम से कम, यह उस तरह से नहीं है जैसा आप उम्मीद करेंगे। हां, यह एक अद्भुत प्रकार की प्रणाली है। लेकिन आप जानते हैं कि क्या? यह सब संकलन-समय पर होता है। रन-टाइम तक, यह चला गया। हां, यह आपको कोड की एक पंक्ति के साथ जटिल ADTs बनाने की अनुमति देता है। लेकिन आप जानते हैं कि क्या? एक ADT सिर्फ सादा साधारण सी unionहै struct। और कुछ नहीं।

असली हत्यारा आलसी मूल्यांकन है। जब आपको अपने कोड की कठोरता / आलस्य मिलता है, तो आप मूर्खतापूर्ण तेज़ कोड लिख सकते हैं जो अभी भी सुरुचिपूर्ण और सुंदर है। लेकिन अगर आपको यह सामान गलत लगता है, तो आपका कार्यक्रम हजारों बार धीमा हो जाता है , और यह वास्तव में गैर-स्पष्ट है कि ऐसा क्यों हो रहा है।

उदाहरण के लिए, मैंने यह गिनने के लिए एक तुच्छ सा प्रोग्राम लिखा कि एक फाइल में कितनी बार प्रत्येक बाइट दिखाई देती है। 25KB इनपुट फ़ाइल के लिए, प्रोग्राम को चलाने में 20 मिनट लगे और 6 गीगाबाइट रैम को निगल लिया ! वह बेतुका है !! लेकिन तब मुझे एहसास हुआ कि समस्या क्या थी, एक एकल बैंग-पैटर्न जोड़ा, और रन-टाइम 0.02 सेकंड तक गिरा ।

यह वह जगह है जहां हास्केल अप्रत्याशित रूप से धीरे-धीरे जाता है। और यह निश्चित है कि इसकी आदत पड़ने में थोड़ा समय लगता है। लेकिन समय के साथ, वास्तव में तेज कोड लिखना आसान हो जाता है।

हास्केल इतनी तेजी से क्या करता है? पवित्रता। स्थैतिक प्रकार। आलस्य। लेकिन इन सबसे ऊपर, पर्याप्त रूप से उच्च-स्तरीय होना कि संकलक आपके कोड की अपेक्षाओं को तोड़ने के बिना कार्यान्वयन को मौलिक रूप से बदल सकता है।

लेकिन मुझे लगता है कि यह सिर्फ मेरी राय है ...


13
@cimmanon मुझे नहीं लगता कि यह विशुद्ध रूप से राय आधारित है। यह एक दिलचस्प सवाल है कि अन्य लोग शायद इसका जवाब चाहते हैं। लेकिन मुझे लगता है कि हम देखेंगे कि अन्य मतदाता क्या सोचते हैं।
MathematicalOrchid

8
@cimmanon - यह खोज केवल डेढ़ सूत्र देती है, और इन सभी को समीक्षा ऑडिट के साथ करना है। और थ्रेड का उत्कीर्ण उत्तर कहता है "कृपया उस सामान को मॉडरेट करना बंद करें जिसे आप नहीं समझते हैं।" मेरा सुझाव है कि अगर किसी को लगता है कि इसका उत्तर आवश्यक रूप से बहुत व्यापक है, तो वे आश्चर्यचकित होंगे और उत्तर का आनंद लेंगे, क्योंकि उत्तर बहुत व्यापक नहीं है।
sclv

34
", कहते हैं, जावा में, जेवीएम को अशक्त बिंदुओं की जांच करनी चाहिए और यदि आप किसी को टालते हैं तो अपवाद छोड़ दें।" जावा का निहित शून्य चेक महंगा है। जावा इंप्लीमेंटेशन वर्चुअल मेमोरी का लाभ ले सकता है और एक गुम पृष्ठ पर अशक्त पते को मैप कर सकता है, इसलिए null पॉइंटर को सीपीयू स्तर पर एक पेज फॉल्ट ट्रिगर करता है, जिसे जावा उच्च स्तरीय अपवाद के रूप में पकड़ता है और फेंकता है। इसलिए अधिकांश नल चेक सीपीयू में मेमोरी मैपिंग यूनिट द्वारा मुफ्त में किए जाते हैं।
Boann

4
@ साइमन: शायद ऐसा इसलिए है क्योंकि हास्केल उपयोगकर्ता एकमात्र ऐसा समुदाय प्रतीत होता है, जो वास्तव में खुले विचारों वाले लोगों का एक अनुकूल समूह है ... जिसे आप "मजाक" मानते हैं ... नियम के कुत्ते-खाने वाले कुत्ते समुदाय के बजाय नाज़ी है। एक-दूसरे को हर मौके पर एक नया मौका दें ... जो आपको लगता है कि आप "सामान्य" हैं।
Evi1M4chine

14
@ मैमेटेमिकलऑर्चिड: क्या आपके पास अपने मूल कार्यक्रम की एक प्रति है जिसे चलाने में 20 मिनट लगते हैं? मुझे लगता है कि यह अध्ययन करने के लिए काफी शिक्षाप्रद होगा कि यह इतना धीमा क्यों है।
जॉर्ज

79

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

ग्राफ़ की कमी के आधार पर डिजाइन की एक दूसरी लहर उभरी, और बहुत अधिक कुशल संकलन की संभावना को खोला। साइमन पेयटन जोन्स ने अपनी दो पुस्तकों द इंप्लीमेंटेशन ऑफ फंक्शनल प्रोग्रामिंग लैंग्वेजेज एंड इंप्लीमेंटिंग फंक्शनल लैंग्वेजेज: अ ट्यूटोरियल (वाडलर एंड हैनकॉक के अनुभागों के साथ पूर्व और डेविड लेस्टर के साथ लिखित) के बारे में इस शोध के बारे में लिखा। (लेनार्ट ऑगस्टसन ने मुझे यह भी बताया कि पूर्व पुस्तक के लिए एक प्रमुख प्रेरणा इस तरीके का वर्णन कर रही थी कि उनके एलएमएल संकलक, जो कि व्यापक रूप से टिप्पणी नहीं की गई थी, अपने संकलन को पूरा किया)।

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

इसे बाद के एक पेपर में वर्णित किया गया है जो इस बात के लिए मूल बातें बताती है कि जीएचसी आज भी कैसे काम करता है (हालांकि मॉडुलो कई विभिन्न मोड़ ): "स्टॉक हार्डवेयर पर आलसी कार्यात्मक भाषाएं लागू करना: द स्पिनलेस टैगलेस जी-मशीन।" । जीएचसी के लिए वर्तमान निष्पादन मॉडल जीएचसी विकी पर अधिक विस्तार से प्रलेखित है ।

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

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

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

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


2
कि मांग विश्लेषक लिंक सोने में अपने वजन के लायक है! विषय के बारे में अंत में कुछ ऐसा है जो ऐसा नहीं है जैसे कि यह मूल रूप से अकथनीय काला जादू है। मैंने यह कैसे नहीं सुना है ?? इसे हर जगह से जोड़ा जाना चाहिए, जहां कोई भी पूछता है कि आलस्य के साथ समस्याओं से कैसे निपटना है!
Evi1M4chine

@ Evi1M4chine मुझे डिमांड एनालाइज़र से संबंधित लिंक नहीं दिखता है, शायद यह किसी तरह खो गया है। क्या कोई लिंक को पुनर्स्थापित कर सकता है या संदर्भ को स्पष्ट कर सकता है? यह काफी दिलचस्प लगता है।
संकट पी।

1
@ क्रिस का मानना ​​है कि अंतिम कड़ी वही है जिसे संदर्भित किया जा रहा है। यह GHC विकी पर GHC में डिमांड एनालाइजर के एक पेज पर जाता है।
सर्प

@ तारपीन कौगर, क्रिस पी: हां, यह मेरा मतलब है।
Evi1M4chine

19

खैर, यहाँ पर टिप्पणी करने के लिए बहुत कुछ है। मैं जितना हो सके उतना जवाब देने की कोशिश करूंगा।

सही तरीके से इस्तेमाल होने पर, यह निम्न-स्तर की भाषाओं के करीब-ईश प्राप्त कर सकता है।

मेरे अनुभव में, आमतौर पर 2x के भीतर कई मामलों में जंग के प्रदर्शन को प्राप्त करना संभव है। लेकिन कुछ (व्यापक) उपयोग के मामले भी हैं जहां प्रदर्शन निम्न-स्तरीय भाषाओं की तुलना में खराब है।

या इसे भी हरा सकते हैं, लेकिन इसका मतलब है कि आप एक अक्षम C प्रोग्राम का उपयोग कर रहे हैं, क्योंकि GHC Haskell to C को संकलित करता है)

जो पूरी तरह सही नहीं है। हास्केल C-- (C का सबसेट) के लिए संकलित करता है, जिसे बाद में मूल कोड जनरेटर के माध्यम से विधानसभा में संकलित किया जाता है। मूल कोड जनरेटर आमतौर पर सी कंपाइलर की तुलना में तेजी से कोड उत्पन्न करता है, क्योंकि यह कुछ अनुकूलन कर सकता है जो एक साधारण सी कंपाइलर नहीं कर सकता है।

मशीन आर्किटेक्चर स्पष्ट रूप से अनिवार्य हैं, जो कि ट्यूरिंग मशीनों पर आधारित हैं, मोटे तौर पर।

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

वास्तव में, हास्केल के पास एक विशिष्ट मूल्यांकन क्रम भी नहीं है।

वास्तव में, हास्केल करता परोक्ष एक मूल्यांकन आदेश परिभाषित करते हैं।

इसके अलावा, मशीन डेटा प्रकारों से निपटने के बजाय, आप हर समय बीजीय डेटा प्रकार बनाते हैं।

वे कई मामलों में मेल खाते हैं, बशर्ते आपके पास पर्याप्त उन्नत संकलक हों।

आप सोचते होंगे कि मक्खी पर कार्य करना, और उन्हें चारों ओर फेंकना, एक कार्यक्रम को धीमा कर देगा।

हास्केल संकलित है, और इसलिए उच्च-क्रम के कार्यों को वास्तव में मक्खी पर नहीं बनाया गया है।

यह हास्केल कोड को अनुकूलित करने के लिए लगता है, आपको इसे और अधिक मशीन की बजाय, अधिक सुरुचिपूर्ण और सार बनाने की आवश्यकता है।

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

f x = [x]और f = pureउदाहरण के लिए हास्केल में ठीक यही बात है। एक अच्छा संकलक पूर्व मामले में बेहतर प्रदर्शन नहीं करेगा।

हास्केल (जीएचसी के साथ संकलित) इतना तेज क्यों है, इसकी अमूर्त प्रकृति और भौतिक मशीनों से अंतर को देखते हुए?

संक्षिप्त उत्तर है "क्योंकि यह वास्तव में ऐसा करने के लिए डिज़ाइन किया गया था।" जीएचसी स्पिनलेस टैगलेस जी-मशीन (एसटीजी) का उपयोग करता है। आप यहां इसके बारे में एक पेपर पढ़ सकते हैं (यह काफी जटिल है)। जीएचसी कई अन्य चीजें भी करता है, जैसे कि कठोरता विश्लेषण और आशावादी मूल्यांकन

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

क्या असमंजस की बात यह है कि परिवर्तनशीलता धीमी कोड की ओर ले जाए? हास्केल के आलस्य का वास्तव में मतलब है कि उत्परिवर्तन उतना मायने नहीं रखता जितना आप सोचते हैं कि यह उच्च स्तर है, इसलिए कई अनुकूलन हैं जो कंपाइलर लागू कर सकते हैं। इस प्रकार, रिकॉर्ड को संशोधित करने की जगह शायद ही कभी धीमी होगी क्योंकि यह सी जैसी भाषा में होगा।


3

हास्केल (GHC) इतना तेज़ क्यों है?

जब मैंने आखिरी बार हास्केल के प्रदर्शन को मापा, तब से कुछ नाटकीय रूप से बदल गया। उदाहरण के लिए:

  • एक RRD फ़ाइल प्रोसेसिंग बेंचमार्क जहाँ लेखक ने पाया कि हास्केल समय लगा विकसित करने के लिए और रन और धीरे धीरे (1,020s) जाओ (130s) और OCaml (67s) की तुलना में, यानी OCaml की तुलना में धीमी 15x।
  • एक सरल शब्दकोश बेंचमार्क में Haskell को F # की तुलना में ~ 10x धीमा दिखाया गया है।
  • रे ट्रेसर भाषा तुलना एक और उदाहरण है, जहां हास्केल सी की तुलना में धीमी थी ++ है, OCaml और यहां तक कि जावा और लिस्प।
  • हास्केल में एक समानांतर जेनेरिक एस्कॉर्ट एफ # की तुलना में 55% धीमा था और इसके लिए काफी अधिक कोड की आवश्यकता होती है।

तो क्या बदल गया है? मैं न तो इस प्रश्न पर ध्यान देता हूं और न ही इसका कोई वर्तमान उत्तर किसी भी सत्यापन योग्य बेंचमार्क या कोड को संदर्भित करता है।

हास्केलर्स के लिए एक पसंदीदा चीज सी के 5% के भीतर प्रयास करना और प्राप्त करना है

क्या आपके पास सत्यापन योग्य परिणामों के लिए कोई संदर्भ है जहां किसी को भी कभी भी उसके पास कहीं भी मिला है?


6
क्या किसी ने तीन बार फिर से दर्पण के सामने हरोप का नाम कहा?
चक एडम्स

2
10x नहीं, लेकिन फिर भी, यह पूरी प्रविष्टि प्रचार और ट्रिप का विपणन कर रही है। GHC वास्तव में C के नज़दीक पहुंचने या कभी-कभी गति के मामले में इसे पार करने में भी काफी सक्षम है, लेकिन आमतौर पर प्रोग्रामिंग में सी में खुद को प्रोग्रामिंग की तुलना में बहुत अलग नहीं, निम्न-स्तरीय शैली की आवश्यकता होती है। दुर्भाग्य से। उच्च स्तर का कोड, धीमा होता है, आमतौर पर। अंतरिक्ष लीक, सुविधाजनक अभी तक अंडरपरफॉर्मेंट एडीटी प्रकार ( बीजीय , सार नहीं , जैसा कि वादा था), आदि, आदि
विल नेस

1
मैं इसे सिर्फ इसलिए पोस्ट कर रहा हूं क्योंकि मैंने आज इसे chrispenner.ca/posts/wc देखा । यह Haskell में लिखी गई wc उपयोगिता का एक कार्यान्वयन है जो कथित रूप से c संस्करण को धड़कता है।
गैरीसन

3
@ लिंक के लिए धन्यवाद । 80 पंक्तियों को मैंने "प्रोग्रामिंग की निम्न-स्तरीय शैली कहा जाता है, जो सी में प्रोग्रामिंग से बहुत अलग नहीं है।" । "उच्च स्तर का कोड", जो "बेवकूफ" होगा fmap (length &&& length . words &&& length . lines) readFile। तो यह है कि तेजी से किया गया था (या यहां तक कि तुलनीय करने के लिए) सी, प्रचार यहां पूरी तरह से उचित हो जाएगा तो । हम अभी भी सी के रूप में हास्केल में गति के लिए कड़ी मेहनत करने की आवश्यकता है, बिंदु है।
विल नेस

2
Reddit reddit.com/r/programming/comments/dj4if3/… पर इस चर्चा को देखते हुए कि हास्केल कोड वास्तव में छोटी गाड़ी है (जैसे कि व्हाट्सएप के साथ लाइनें शुरू होती हैं या समाप्त हो जाती हैं, एए पर टूट जाती हैं) और अन्य दावा किए गए प्रदर्शन परिणामों को पुन: उत्पन्न नहीं कर सकते हैं।
जॉन हैरोप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.