2010-07-25 4 views
7

मैं स्कैला के लिए नया हूं और बस Scala By Example पढ़ रहा था। अध्याय 2 में, लेखक के पास क्विक्सोर्ट के 2 अलग-अलग संस्करण हैं।स्कैला प्रदर्शन: अनिवार्य बनाम कार्यात्मक शैली

def sort(xs: Array[Int]) { 
    def swap(i: Int, j: Int) { 
     val t = xs(i); xs(i) = xs(j); xs(j) = t 
    } 
    def sort1(l: Int, r: Int) { 
     val pivot = xs((l + r)/2) 
     var i = l; var j = r 
     while (i <= j) { 
      while (xs(i) < pivot) i += 1 
      while (xs(j) > pivot) j -= 1 
      if (i <= j) { 
       swap(i, j) 
       i += 1 
       j -= 1 
      } 
     } 
     if (l < j) sort1(l, j) 
     if (j < r) sort1(i, r) 
    } 
    sort1(0, xs.length - 1) 
} 

एक यह है कार्यात्मक शैली:

def sort(xs: Array[Int]): Array[Int] = { 
    if (xs.length <= 1) xs 
    else { 
    val pivot = xs(xs.length/2) 
    Array.concat(
     sort(xs filter (pivot >)), 
      xs filter (pivot ==), 
     sort(xs filter (pivot <))) 
    } 
} 

स्पष्ट लाभ कार्यात्मक शैली जरूरी शैली से अधिक है संक्षिप्तता है

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

नोट: लेखक ने उल्लेख किया है कि कार्यात्मक शैली अधिक स्मृति का उपयोग करती है।

+2

संभावित डुप्लिकेट [क्या स्कैला कार्यात्मक प्रोग्रामिंग पारंपरिक कोडिंग की तुलना में धीमी है?] (Http://stackoverflow.com/questions/2794823/is-scala- कार्यात्मक- प्रोग्रामिंग- स्लोवर- थान-ट्रैडिशनल-कोडिंग) – missingfaktor

+2

"संक्षिप्त" "पठनीय" के समान नहीं है। साक्ष्य: [जे प्रोग्रामिंग भाषा] (http://en.wikipedia.org/wiki/J_ (प्रोग्रामिंग_भाषा)) –

+1

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

उत्तर

11

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

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

मैं कार्यात्मक शैली के साथ शुरू करने का सुझाव दूंगा। यदि यह बहुत धीमा है, तो इसे प्रोफाइल करें। आमतौर पर एक बेहतर कार्यात्मक समाधान होता है। यदि नहीं, तो आप अंतिम उपाय के रूप में अनिवार्य शैली (या दोनों का मिश्रण) का उपयोग कर सकते हैं।

+0

लेकिन इस तरह के उद्देश्य को सही तरीके से हराया जाता है? मेरा मतलब है, स्कैला को पहली भाषा के रूप में सम्मानित किया जाता है जो पुल कार्यात्मक और ऑब्जेक्ट प्रोग्रामिंग करता है। लेकिन, यदि आप यह सुनिश्चित नहीं कर सकते कि कार्यात्मक तरीके प्रोग्रामिंग कुशल रहेगी, तो प्रदर्शन करने वाले लोग स्काला को "जावा" तरीके से समाप्त कर देंगे? – sivabudh

+5

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

+9

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