2013-06-26 4 views
15

के बीच अंतर सुविधाओं के माध्यम से जा रहा था, here का उल्लेख किया गया। समझ में नहीं आया कि parallelSort() वास्तव में क्या करता है। क्या कोई बता सकता है कि sort() और parallelSort() के बीच वास्तविक अंतर क्या है?Arrays.sort() और Arrays.parallelSort()

+23

उम, 'समानांतरॉर्ट' एकाधिक धागे का उपयोग करता है, जबकि 'sort' नहीं है ... –

उत्तर

32

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

इस तालिका पर एक नजर डालें (बेशक, परिणाम, सीपीयू, पृष्ठभूमि प्रक्रियाओं पर निर्भर करते हैं आदि):

enter image description here

इस लिंक से लिया: http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html

+1

ओवरहेड के बारे में बात करते समय "बहुत छोटा" जैसी कोई चीज़ नहीं है। आदर्श रूप से मुझे 0 पसंद है :) :) – Trejkaz

+4

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

+0

हे @TagirValeev। मुझे पता है कि यह सवाल पुराना है, लेकिन मैंने सोचा कि मैं यह इंगित करूंगा कि 602 के लिए समय में अंतर लंबाई की जांच के कारण नहीं है; कम से कम यह चेक विशेष रूप से दोष नहीं है। मुझे लगता है कि ये बार कई परीक्षणों का औसत नहीं था, इसलिए शायद यह एक और प्रक्रिया कंप्यूटर पर चल रही थी जिसने 3 एमएमएस अंतर को जन्म दिया। बस विचार करने के लिए कुछ विषय। लेकिन मैं मानता हूं कि माप गलत तरीके से आयोजित किए गए थे, क्योंकि सटीकता केवल परीक्षण मामलों की बड़ी संख्या के माध्यम से प्राप्त की जाती है। ऐसे अन्य लेख हैं जो समान प्रदर्शन लाभ दिखाते हैं। – adpro

13

Arrays.parallelSort():

विधि एक सीमा मूल्य और आकार सीमा मूल्य Arrays # तरह() API का उपयोग क्रमबद्ध हो जाता है की तुलना में कम से किसी सरणी (अर्थात अनुक्रमिक छंटाई) का उपयोग करता है।

private static final int getSplitThreshold(int n) { 
int p = ForkJoinPool.getCommonPoolParallelism(); 
int t = (p > 1) ? (1 + n/(p << 3)) : n; 
return t < MIN_ARRAY_SORT_GRAN ? MIN_ARRAY_SORT_GRAN : t; 
} 

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

  • सरणी को 4 भागों में विभाजित करें।

  • पहले दो हिस्सों को क्रमबद्ध करें और फिर उन्हें मर्ज करें।

  • अगले दो भागों को सॉर्ट करें और फिर उन्हें मर्ज करें। और ऊपर दिए गए चरणों को प्रत्येक भाग के साथ दोहराया जाता है जब तक कि भाग के आकार का आकार ऊपर की गई थ्रेसहोल्ड मान से कम न हो।

तुम भी Javadoc

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

Array.sort():

यह सामग्री सॉर्ट करने के लिए तरह या टिम विलय के नीचे क्रमबद्ध उपयोग करता है। यह सब अनुक्रमिक रूप से किया जाता है, भले ही मर्ज सॉर्ट का उपयोग विभाजन को विभाजित और जीतने के लिए किया जाता है, यह सब अनुक्रमिक रूप से किया जाता है।

Source

2

संक्षेप में, parallelSort एकाधिक धागे का उपयोग करता है। यदि आप वास्तव में जानना चाहते हैं तो यह article अधिक विस्तृत विवरण है।

2
जावा संग्रह फ्रेमवर्क (Collections.sort और Arrays.sort) सभी प्रदर्शन बुला धागे में छँटाई आपरेशन क्रमिक रूप से स्वीकृति देते हैं link

वर्तमान छंटाई कार्यान्वयन से

। यह वृद्धि Arrays क्लास द्वारा प्रदान की गई सॉर्टिंग परिचालनों का एक ही सेट प्रदान करेगी, लेकिन समानांतर कार्यान्वयन के साथ फोर्क/फ्रेमवर्क में शामिल हों। इन नए एपीआई अभी भी कॉलिंग थ्रेड पर के साथ तुल्यकालिक हैं क्योंकि यह समांतर प्रकार पूर्ण होने तक संचालन को सॉर्ट करने से आगे नहीं बढ़ेगा।

3

आप जो बताते हैं कि एल्गोरिथ्म कई सूत्र का उपयोग करता है, तो सरणी काफी बड़ी है the javadoc का उल्लेख कर सकते,:

छँटाई एल्गोरिथ्म एक समानांतर तरह-मर्ज है कि उप विन्यास में, सरणी टूट जाता है जो खुद को क्रमबद्ध कर रहे हैं और फिर विलय कर रहे हैं। जब उप-सरणी लंबाई न्यूनतम ग्रैन्युलरिटी तक पहुंच जाती है, तो उप-सरणी उचित Arrays.sort विधि का उपयोग करके क्रमबद्ध की जाती है। [...] ForkJoin सामान्य पूल किसी भी समांतर कार्यों को निष्पादित करने के लिए उपयोग किया जाता है।)

1. Arrays.sort (:

4

दोनों एल्गोरिथ्म के बीच मुख्य अंतर निम्न हैं एक अनुक्रमिक छंटाई है।

  • एपीआई ऑपरेशन के लिए एकल धागा का उपयोग करता है।
  • एपीआई ऑपरेशन करने के लिए थोड़ा लंबा समय लगता है।

2. Arrays.ParallelSort(): एक समानांतर छंटाई है।

एपीआई एकाधिक धागे का उपयोग करता है।

  • एपीआई सॉर्ट() की तुलना में कम समय लेता है।

अधिक परिणामों के लिए, हमें सभी को जवा 8 का इंतजार करना है !! चीयर्स !!

1

Array.sort(myArray);

अब आप उपयोग कर सकते हैं -

Arrays.parallelSort(myArray);

यह स्वचालित रूप से कई भागों, जो स्वतंत्र रूप से कोर की एक संख्या भर में हल हो जाएगा और फिर वापस एक साथ समूहीकृत में लक्ष्य संग्रह तोड़ देगा । यहां एकमात्र चेतावनी यह है कि जब एक व्यस्त वेब कंटेनर जैसे अत्यधिक बहु-थ्रेडेड वातावरण में बुलाया जाता है, तो इस दृष्टिकोण के लाभ बढ़ने वाले CPU संदर्भ स्विच की लागत के कारण (90% से अधिक) कम हो जाएंगे।

स्रोत link

0

Arrays.sort() तत्वों सॉर्ट करने के लिए एकल थ्रेड का उपयोग करता है लेकिन Arrays.ParallelSort() इच्छा से अधिक थ्रेड उपयोग करता है।
समानांतर में सामान्य प्रकार की तुलना में कम समय लगेगा।

संबंधित मुद्दे