2008-09-23 18 views
8

यदि आप विजेता O’Rourke's Perl solution से Lundh's Python solution की तुलना कर सकते हैं, तो मुझे बहुत आभारी होंगे, क्योंकि मुझे नहीं पता कि पर्ल वहां क्या हो रहा है यह समझने के लिए पर्याप्त है। अधिक विशेष रूप से मैं जानना चाहता हूं कि पर्ल संस्करण 3x लाभ क्या है: एल्गोरिदमिक श्रेष्ठता, सी एक्सटेंशन की गुणवत्ता, अन्य कारक?वाइड फाइंडर चुनौती के लिए पायथन और पर्ल समाधान की तुलना

Wide Finder: Results

उत्तर

5

पर्ल भारी पाठ संसाधन के लिए अनुकूलित है। ऐसे कई कारक हैं जो कहना मुश्किल है कि सटीक अंतर क्या है। पाठ को पूरी तरह से आंतरिक रूप से अलग किया जाता है (utf-8 बनाम utf-16/utf-32) और नियमित अभिव्यक्ति इंजन भी पूरी तरह अलग हैं। पायथन का नियमित अभिव्यक्ति इंजन एक कस्टम है और जितना अधिक इस्तेमाल नहीं किया जाता है। पर्ल एक के विपरीत यह बहुत कम डेवलपर्स काम कर रहे हैं (मुझे लगता है कि यह काफी हद तक अनजान है) जो मूल रूप से "भाषा का मूल" है।

सभी पर्ल टेक्स्ट प्रोसेसिंग भाषा के बाद है।

+1

नमूना लॉग ASCII हैं, जहां तक ​​मुझे पता है, और पायथन संस्करण बिना किसी यूनिकोड रूपांतरण के बाइट स्ट्रिंग का उपयोग करता है। तो मेरा मानना ​​है कि यहां "utf-8 बनाम यूटीएफ -16" नहीं है। – Constantin

+1

मैं निरंतरता से सहमत हूं। मुझे नहीं लगता कि अवांछित यूनिकोड को इसके साथ क्या करना है। –

10

पर्ल का बेहतर रेगेक्स कार्यान्वयन कहानी का एक हिस्सा है। यह समझा नहीं सकता है कि क्यों पर्ल कार्यान्वयन बेहतर है। अंतर अधिक प्रोसेसर के साथ बड़ा हो जाता है। किसी कारण से पाइथन कार्यान्वयन में कोई समस्या है।

1

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

पर्ल के तार और नियमित अभिव्यक्ति 8-बिट बाइट आधारित हैं (उदाहरण के लिए जावा के लिए utf16 के विपरीत), इसलिए पर्ल का मूल 'चरित्र प्रकार' mmapped फ़ाइल का एक ही एन्कोडिंग है।

जब नियमित अभिव्यक्ति इंजन तब एमएमएपी समर्थित चर पर काम करता है, तो यह सीधे पंप के आईओ कार्यों, या यहां तक ​​कि libc के IO फ़ंक्शंस के बिना बिना मैंप किए गए मेमोरी क्षेत्र के माध्यम से फ़ाइल डेटा तक पहुंच रहा है।

एमएमएपी सामान्य पायथन आईओ पुस्तकालयों का उपयोग करके पाइथन संस्करण बनाम प्रदर्शन अंतर के लिए काफी हद तक ज़िम्मेदार है - जो अतिरिक्त रूप से लाइन ब्रेक की तलाश में ओवरहेड पेश करता है।

पर्ल प्रोग्राम प्रसंस्करण समानांतर करने के लिए एजे का भी समर्थन करता है, जहां ओपेन "- |" एक कांटा() का कारण बनता है जहां माता-पिता में फ़ाइल हैंडल बच्चे के stdout के लिए है। बच्चा अपने परिणामों को stdout पर क्रमबद्ध करने की प्रक्रिया करता है और माता-पिता उन्हें परिणामों को समन्वयित और संक्षिप्त करने के लिए डी-धारावाहिक करता है।

+1

पायथन संस्करण mmap का भी उपयोग करता है। और पायथन का रेगेक्स भी एमएमएपी पर सीधे काम करता है। – Constantin

0

पर्ल कार्यान्वयन एमएमएपी सिस्टम कॉल का उपयोग करता है।

यह। यह बफर कॉपीिंग से बचाता है और एसिंक I/O प्रदान करता है।

+1

पायथन संस्करण mmap-based भी है। लेकिन क्या आप "एमएमएपी पर्ल संस्करण के लिए एसिंक I/O प्रदान करते हैं" पर विस्तृत कर सकते हैं? – Constantin

3

पर्ल के लिए कई कोर इंजन (एमसीई) जारी किया गया है। एमसीई इस पर काफी अच्छा करता है, भले ही 8 कर्मचारियों (ठंडा कैश) के साथ डिस्क से सीधे पढ़ा जाए। Wf_mmap की तुलना करें। इनपुट डेटा पढ़ने पर एमसीई एक बैंक क्यूइंग मॉडल का पालन करता है। स्लाइड्स के लिए छवियों फ़ोल्डर के नीचे देखो।

स्रोत कोड http://code.google.com/p/many-core-engine-perl/

पर होस्ट किया गया है पर्ल प्रलेखन https://metacpan.org/module/MCE

MCE साथ वाइड खोजक का एक कार्यान्वयन के अंतर्गत उदाहरण/tbray प्रदान की जाती है पर पढ़ा जा सकता/

https://metacpan.org/source/MARIOROY/MCE-1.514/examples/tbray/

एमसीई का आनंद लें।

Script....: baseline1 baseline2 wf_mce1 wf_mce2 wf_mce3 wf_mmap 
Cold cache:  1.674  1.370 1.252 1.182 1.174 3.056 
Warm cache:  1.236  0.923 0.277 0.106 0.098 0.092