सामान्य प्रोग्राम के रूप में फ़ंक्शनल प्रोग्रामिंग तेज़ कार्यक्रमों के लिए नहीं है। यह जो बनाता है वह आसान समानांतर और समवर्ती प्रोग्रामिंग के लिए है। इसकी दो मुख्य कुंजी हैं:
- उत्परिवर्तनीय स्थिति से बचने के लिए उन चीजों की संख्या कम हो जाती है जो एक कार्यक्रम में गलत हो सकती हैं, और इससे भी अधिक समवर्ती कार्यक्रम में।
- उच्च-स्तरीय अवधारणाओं के पक्ष में साझा-मेमोरी और लॉक-आधारित सिंक्रोनाइज़ेशन प्राइमेटिविटी से बचने के लिए कोड के थ्रेड्स के बीच सिंक्रोनाइज़ेशन को सरल बनाया जाता है।
बिंदु # 2 का एक उत्कृष्ट उदाहरण यह है कि हास्केल में हम निर्धारक समानतावाद बनाम गैर-निर्धारक समरूपता के बीच एक स्पष्ट अंतर रखते हैं । हस्केल में साइमन मारलो की उत्कृष्ट पुस्तक समानांतर और समवर्ती प्रोग्रामिंग को उद्धृत करने से बेहतर कोई स्पष्टीकरण नहीं है (उद्धरण 1 अध्याय से हैं :
एक समानांतर प्रोग्राम वह है जो कम्प्यूटेशनल हार्डवेयर (जैसे, कई प्रोसेसर कोर) की बहुलता का उपयोग करता है एक कम्प्यूटेशन को और अधिक तेज़ी से करने के लिए। उद्देश्य एक ही समय में निष्पादित करने वाले विभिन्न प्रोसेसर के लिए अभिकलन के विभिन्न भागों को सौंपकर, पहले उत्तर पर पहुंचना है।
इसके विपरीत, संगामिति एक प्रोग्राम-स्ट्रक्चरिंग तकनीक है जिसमें नियंत्रण के कई सूत्र हैं। वैचारिक रूप से, नियंत्रण के धागे "एक ही समय में" निष्पादित होते हैं; अर्थात्, उपयोगकर्ता उनके प्रभाव को देखता है। चाहे वे वास्तव में एक ही समय में निष्पादित हों या नहीं एक कार्यान्वयन विवरण है; एक समवर्ती कार्यक्रम एक एकल प्रोसेसर पर interleaved निष्पादन या कई भौतिक प्रोसेसर के माध्यम से निष्पादित कर सकता है।
इसके अलावा, मार्लो में नियतत्ववाद के आयाम का भी उल्लेख किया गया है :
एक संबंधित अंतर निर्धारक और नोंडेटर्मिनिस्टिक प्रोग्रामिंग मॉडल के बीच है । एक नियतात्मक प्रोग्रामिंग मॉडल वह है जिसमें प्रत्येक प्रोग्राम केवल एक परिणाम दे सकता है, जबकि एक nondeterministic प्रोग्रामिंग मॉडल उन कार्यक्रमों को स्वीकार करता है जिनके निष्पादन के कुछ पहलू के आधार पर अलग-अलग परिणाम हो सकते हैं। समवर्ती प्रोग्रामिंग मॉडल अनिवार्य रूप से नोंडेटरमिनिस्टिक हैं क्योंकि उन्हें बाहरी एजेंटों के साथ बातचीत करनी चाहिए जो अप्रत्याशित समय पर घटनाओं का कारण बनते हैं। Nondeterminism में कुछ उल्लेखनीय कमियां हैं, हालांकि: कार्यक्रम परीक्षण और तर्क के लिए काफी कठिन हो जाते हैं।
समानांतर प्रोग्रामिंग के लिए, हम यदि संभव हो तो नियतात्मक प्रोग्रामिंग मॉडल का उपयोग करना चाहते हैं। चूंकि लक्ष्य बस और अधिक तेजी से उत्तर पर पहुंचने के लिए है, इसलिए हम इस प्रक्रिया में डिबग करने के लिए अपने कार्यक्रम को कठिन नहीं बनाएंगे। नियतात्मक समानांतर प्रोग्रामिंग दोनों दुनिया में सबसे अच्छी है: परीक्षण, डिबगिंग और तर्क क्रमिक कार्यक्रम पर किया जा सकता है, लेकिन अधिक प्रोसेसर के साथ कार्यक्रम तेजी से चलता है।
हास्केल में इन अवधारणाओं के आसपास समानता और संगामिति विशेषताएँ डिज़ाइन की गई हैं। विशेष रूप से, अन्य भाषाओं के समूह एक साथ एक फीचर सेट के रूप में, हास्केल को दो में विभाजित करते हैं:
- समानता के लिए निर्धारक विशेषताएं और पुस्तकालय ।
- गैर-निर्धारक सुविधाओं और पुस्तकालयों के लिए संगामिति ।
यदि आप सिर्फ एक शुद्ध, नियतात्मक संगणना को गति देने की कोशिश कर रहे हैं, तो नियतात्मक समानता होने से अक्सर चीजें बहुत आसान हो जाती हैं। अक्सर आप ऐसा कुछ करते हैं:
- एक फ़ंक्शन लिखें जो उत्तरों की एक सूची तैयार करता है, जिनमें से प्रत्येक गणना करने के लिए महंगा है, लेकिन एक दूसरे पर बहुत अधिक निर्भर नहीं है। यह हास्केल है, इसलिए सूचियां आलसी हैं- उनके तत्वों के मूल्य वास्तव में गणना नहीं किए जाते हैं जब तक कि उपभोक्ता उनसे मांग नहीं करता है।
- कई कोर में समानांतर में अपने फ़ंक्शन के परिणाम सूचियों का उपभोग करने के लिए रणनीतियाँ लाइब्रेरी का उपयोग करें।
मैंने वास्तव में कुछ सप्ताह पहले अपने एक खिलौना परियोजना कार्यक्रम के साथ ऐसा किया था । यह कार्यक्रम को समानांतर करने के लिए तुच्छ था - मुझे जो कुछ करना था, वह महत्वपूर्ण था, कुछ कोड जोड़ें जो कहता है कि "समानांतर में इस सूची के तत्वों की गणना करें" (पंक्ति 90), और मुझे एक निकट-रेखीय थ्रूपुट बढ़ावा मिला मेरे कुछ और महंगे टेस्ट केस।
अगर मेरा पारंपरिक ताला-आधारित बहु-स्तरीय उपयोगिताओं के साथ चला गया था, तो क्या मेरा कार्यक्रम इससे तेज है? मुझे बहुत संदेह है। मेरे मामले में साफ-सुथरी बात इतने कम हिरन से बहुत धमाकेदार हो रही थी- मेरा कोड शायद बहुत ही अडॉप्टिमल है, लेकिन क्योंकि यह समानांतर करना इतना आसान है, तो मुझे इसमें से एक बड़ा स्पीडअप मिल गया है, जिसमें इसे ठीक से प्रोफाइल करने और इसे अनुकूलित करने की तुलना में बहुत कम प्रयास किया गया है, और दौड़ की स्थिति का कोई खतरा नहीं। और यह कि, मैं दावा करूंगा, मुख्य तरीका है कार्यात्मक प्रोग्रामिंग आपको "तेज" प्रोग्राम लिखने की अनुमति देता है।