2010-01-05 6 views
9

मैं एक कंटेनर की तलाश में हूं जो encapsulated तत्वों के माध्यम से सबसे तेज़ unordered पुनरावृत्तियों प्रदान करता है। दूसरे शब्दों में, "एक बार जोड़ें, कई बार पुनरावृत्त करें"।सबसे तेज़ पुनरावृत्ति के साथ मानक ओकैमल डेटा संरचना क्या है?

क्या ओकैमल के मानक मॉड्यूल में से एक है जो पर्याप्त तेज़ है (जैसे कि इसका और अधिक अनुकूलन बेकार होगा)? या किसी प्रकार की तीसरी पार्टी जीपीएल तैयार हैं?

AFAIK वहाँ सिर्फ एक OCaml संकलक है, तो किया जा रहा है की अवधारणा तेजी से कम या ज्यादा स्पष्ट है ...

... लेकिन उसके बाद मैं जवाब के एक जोड़े को देखा, ऐसा लगता है, यह नहीं है। बेशक, वहां बहुत सारे डेटा संरचनाएं हैं जो आकार एन के कंटेनर के माध्यम से ओ (एन) पुनरावृत्ति की अनुमति देती हैं। लेकिन जो कार्य मैं हल कर रहा हूं उनमें से एक है, जहां ओ (एन) और ओ (2 एन) मामलों के बीच अंतर ;-)।

मैं यह भी देखता हूं कि Arrays और Lists जोड़े गए तत्वों के क्रम के बारे में अनावश्यक जानकारी प्रदान करते हैं, जिनकी मुझे आवश्यकता नहीं है। हो सकता है कि "कार्यात्मक दुनिया" में डेटा संरचनाएं मौजूद हों, जो इस जानकारी को थोड़ी सी गतिशील गति के लिए व्यापार कर सकती हैं।

सी में मैं एक सादा सरणी चुनता हूं। सवाल यह है कि, मुझे ओकैमल में क्या चुनना चाहिए?

+3

1) पैडेंटिक होने के लिए, ओ (एन) और ओ (2 एन) के बीच कोई अंतर नहीं है। आप निरंतर कारकों के बारे में बात कर रहे हैं। 2) तत्वों के लिए मनमाने ढंग से क्रम चुनना और इसे ठीक करना, जैसा कि किसी सरणी या सूची में है, वैसे ही आप पुनरावृत्ति के लिए अनुकूलित कैसे करते हैं। आप पुनरावृत्ति गति के लिए "सूचकांक में वृद्धि/सूचकांक का पालन करें, स्मृति से प्राप्त करें" पर सुधार करने की अपेक्षा कैसे करते हैं? –

+0

1) हां, मैं निरंतर कारकों के बारे में बात कर रहा हूं, क्योंकि मैं बाधा को अनुकूलित कर रहा हूं; 2) मुझे नहीं पता कि इसे कैसे सुधारें, लेकिन क्या यह * ऐरे और सूची मॉड्यूल का तरीका है? लगातार स्मृति पर कब्जा करने के लिए ऐरे * नहीं कहा गया है (जबकि यह * * * ज्ञात * हो सकता है)। सूची सूचक सूचकांक की आवश्यकता है (धीमी?)। मैं अभी भी संदेह में हूँ। –

+1

@ पावेल: क्रिस क्या कह रहा है कि आप बिग ओ नोटेशन का दुरुपयोग कर रहे हैं। वह यह नहीं कह रहा है कि आपको लगातार कारकों की परवाह नहीं करनी चाहिए, केवल तभी जब आप उन्हें संदर्भित करते हुए अपने गणितीय नोटेशन में अधिक स्पष्ट होना चाहिए। – bcat

उत्तर

8

अंतर्निर्मित सरणी और सूचियों से बेहतर करने की संभावना नहीं है, क्योंकि वे सी में हाथ से कोडित हैं, जब तक आप एक इटरेटर के अपने मूल कार्यान्वयन से बंधे न हों। एक सरणी लगभग सी में एक सरणी की तरह व्यवहार करेगी (जिसमें तत्व मानों का अनुक्रम वाला स्मृति का एक आवंटित आवंटित ब्लॉक) संभवतः मुक्केबाजी के कारण कुछ अतिरिक्त सूचक संकेतों के साथ व्यवहार करेगा। सूची बिल्कुल लागू की जाती है कि आप कैसे अपेक्षा करेंगे: एक मूल्य वाले सेल और "अगला" पॉइंटर के रूप में। Arrays आपको अनबॉक्स किए गए प्रकारों (विशेष रूप से float एस) के लिए सर्वश्रेष्ठ स्थान प्रदान करेगा, जिसमें एक सुपर-विशेष अनबॉक्स किए गए कार्यान्वयन हैं)।

सरणियों और सूचियों के कार्यान्वयन के बारे में जानकारी के लिए, Section 18.3 of the OCaml manual देख सकते हैं और फ़ाइलों byterun/mlvalues.h, byterun/array.c, और OCaml स्रोत कोड में byterun/alloc.c

प्रश्नकर्ता से: वास्तव में, Array सबसे तेज़ समाधान प्रतीत होता है। हालांकि यह केवल List से 7% तक बेहतर प्रदर्शन किया। शायद ऐसा इसलिए था क्योंकि सरणी तत्व का प्रकार पर्याप्त सादा नहीं था: यह बीजगणितीय प्रकार था। Hashtbl ने अपेक्षा की तुलना में 4 गुना अधिक खराब प्रदर्शन किया।

तो, मैं Array चुनूंगा और मैं इसे स्वीकार कर रहा हूं। अच्छा।

+2

यह काफी पुराना है लेकिन पूरे कारण को किसी कारण से शीर्ष पर ले जाया गया है। मुझे ध्यान दें कि सूचियों को सी में कोड-कोड नहीं किया गया है, उन्हें सामान्य बीजगणितीय डेटाटाइप के रूप में परिभाषित किया जाता है। मॉड्यूलो सुविधा के लिए कुछ वाक्य रचनात्मक चीनी, यह सिर्फ एक सूची = प्रकार है 'शून्य' एक सूची 'ए *' के विपक्ष। अच्छे प्रदर्शन को ओकैमल डेटाटाइप के लिए अच्छे प्रतिनिधित्व विकल्पों द्वारा समझाया गया है, विशेषज्ञता नहीं। Arrays अंतर्निहित हैं और बेहतर इलाके है, हालांकि। – gasche

1

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

कम से कम सूचियों और सरणी महत्वपूर्ण ओवरहेड के बिना पुनरावृत्ति की अनुमति देते हैं। मैं ऐसी स्थिति के बारे में नहीं सोच सकता जहां वह पर्याप्त तेज़ नहीं होगा।

3

सरणी - अनुक्रमिक क्रम में देखी गई वस्तुओं के साथ स्मृति का एक रैखिक टुकड़ा - सीपीयू के एल 1 डेटा कैश का सबसे अच्छा उपयोग करता है।

+0

यह सी में सच था ... है यह अभी भी ओकैमल में सबसे तेज़ है? –

+7

यदि यह एक अनबॉक्सित डेटाटाइप (उदा।, पूर्णांक) है, तो सरणी मान स्मृति के एक संगत ब्लॉक में संग्रहीत किए जाएंगे। यदि यह एक "बॉक्सिंग" डेटाटाइप (अधिकांश हैं) है, तो यह पॉइंटर्स की एक सरणी होगी, इसलिए आपको शायद एक सूची में ज्यादा लाभ नहीं मिलेगा। –

8

निश्चित रूप से जानने के लिए, आपको मापना होगा। मशीन निर्देशों के आधार पर संकलक उत्पन्न होने की संभावना है, मैं एक सरणी, फिर एक सूची का प्रयास करता हूं।

  • एक सरणी तत्व तक पहुंच एक सीमा जांच, पता गणित, और एक लोड

  • एक सूची के सिर तक पहुंच की आवश्यकता है एक पर एक लोड, खाली सूची के लिए एक परीक्षण, और एक लोड की आवश्यकता ज्ञात संकलन समय ऑफसेट।

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

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

अंत में कृपया ध्यान दें कि केवल एक ओकैमल कंपाइलर हो सकता है, लेकिन इसमें दो बैक सिरों: बाइटकोड और मूल कोड है। स्वाभाविक रूप से यदि आप इस स्तर के प्रदर्शन की परवाह करते हैं, तो आप देशी कोड ocamlopt संस्करण का उपयोग कर रहे हैं। सही?

कृपया माप लें और परिणामों को अपने प्रश्न में संपादित करें।

6

Bigarray एस के बारे में मत भूलना, वे सी सरणी (केवल स्मृति का एक फ्लैट टुकड़ा) के करीब हैं, लेकिन मनमाने ढंग से ओकैम मूल्य नहीं हो सकते हैं। स्विचिंग सीमाओं को जांचने पर भी विचार करें (unsafe_set/get)। और निश्चित रूप से आपको पहले प्रोफाइल करना चाहिए।