2011-01-22 19 views
6

एरलांग के लिए नया। मैं कुछ कोड लिखना शुरू कर रहा हूं। मेरे मन में जो समाधान है, वह दो तरीकों में से एक जा सकता है। मैं गणितीय गणना का एक गुच्छा कर सकता हूं, या मैं इसे बड़े पैमाने पर पैटर्न मिलान के रूप में कोड कर सकता हूं। जब मैं "पैटर्न मिलान" कहता हूं, तो मेरा मतलब रेगेक्स या ऐसा कुछ नहीं है - मेरा मतलब क्लॉज हेड में मिलान पैटर्न है।एरलांग पैटर्न मिलान प्रदर्शन

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

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

किसी भी अंतर्दृष्टि के लिए धन्यवाद।

+3

कोड्ज़ पोस्ट करें। इस सवाल के रूप में दोबारा जवाब दें कि यह क्यों दुर्घटनाग्रस्त हो जाएगा। – EvilTeach

+0

कोड 2 बहुत ही सरल कार्यक्रम थे। पहला कार्यक्रम अनुक्रम खंड (0) -> 0 के 10 खंड प्रमुख थे; खंड (1) -> 0; (10 तक) परीक्षण करने के लिए मैंने 2 मिलियन 0 की सूची बनाने के लिए डुप्लिकेट का उपयोग किया, और उस पर क्लॉज मैप करने के लिए मानचित्र का उपयोग किया। दूसरा प्रोग्राम बस 7 पूर्णांक की 2 मिलियन सूचियां बनाने के लिए डुप्लिकेट का उपयोग कर रहा था, फिर उस पर योग मैप करने के लिए मानचित्र का उपयोग कर रहा था। फिर मैं प्रोग्रामिंग तकनीक के रूप में इस्तेमाल पैटर्न मिलान के सापेक्ष प्रदर्शन का परीक्षण करने की कोशिश कर रहा था। मेरा सवाल यह है कि क्या एर्लांग प्रोग्रामर को प्रोलॉग प्रोग्रामर के रूप में पैटर्न मिलान (जहां व्यावहारिक) का उपयोग करने के लिए प्रोत्साहित किया जाता है। – Ultranewb

+0

उदाहरण के साथ बंप किया –

उत्तर

6

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

आंतरिक में आमतौर पर पैटर्न मिलान कंपाइलर होता है जो चेक की संख्या को कम करने के लिए लक्ष्य के साथ चेक की एक सरल श्रृंखला में एक उन्नत पैटर्न मिलान को बदल देता है।


ठीक है, पहले पकड़ लिया: "कुछ भी खोल में पेश व्याख्या की है"। तो हम इसके बजाय मॉड्यूल संकलित करते हैं:

-module(z). 

-compile(export_all). 

%% This pattern is highly uninteresting because it only matches 
%% on a single value. Any decent system can do this quickly. 
cl(0) -> 0; 
cl(1) -> 0; 
cl(2) -> 0; 
cl(3) -> 0; 
cl(4) -> 0; 
cl(5) -> 0; 
cl(6) -> 0; 
cl(7) -> 0; 
cl(8) -> 0; 
cl(9) -> 0. 

mcl(L) -> 
    [cl(E) || E <- L]. 

यह आपको आपके उदाहरण का धावक देता है।

cl2(a, 0) -> a0; 
cl2(a, 1) -> a1; 
cl2(a, 2) -> a2; 
cl2(b, 0) -> b0; 
cl2(b, 1) -> b1; 
cl2(b, 2) -> b2; 
cl2(c, 0) -> c0; 
cl2(c, 1) -> c0; 
cl2(c, 2) -> c0. 

mcl2(L) -> 
    [cl2(A, V) || {A, V} <- L]. 

एक और अधिक रोचक उदाहरण के लिए एक धावक। यहां, हम पैटर्न में स्किप का उपयोग कर सकते हैं। यदि (a, 0)a पर मिलान करने में विफल रहता है तो हम जानते हैं कि हम सीधे (b, 0) मामले पर जा सकते हैं क्योंकि नकारात्मक मिलान जानकारी सिस्टम में जानकारी के रूप में प्रचारित की जा सकती है। पैटर्न मिलान कंपाइलर आमतौर पर यह अनुकूलन बनाता है।

test1() -> 
    L1 = [X rem 10 || X <- lists:seq(1, 2000000)], 
    %% A Core 2 Duo 2.4Ghz P8600 eats this in 132984 microseconds without HiPE 
    %% c(z). 
    %% With HiPE it is 91195 or in 0.6857591890753775 of the time the non-HiPE variant use 
    %% c(z, [native, {hipe, [o3]}]). 
    timer:tc(z, mcl, [L1]). 

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

test2() -> 
    random:seed(erlang:now()), 
    L2 = [{case random:uniform(3) of 
        1 -> a; 
        2 -> b; 
        3 -> c 
        end, V rem 3} || V <- lists:seq(1, 2000000)], 
    %% With HiPE this is 220937 
    %% Without HiPE this is 296980 
    timer:tc(z, mcl2, [L2]). 

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


समानांतर संस्करणों मुकदमा चलाया गया, लेकिन वे के बारे में 10 2 लाख कार्यकर्ता प्रक्रियाओं बनाने की भूमि के ऊपर के बाद से इस मामले में धीमी बार अब तक वास्तविक प्रसंस्करण :)

+0

एक स्थिर प्रकार की जांच भाषा में स्विच करना, उदा। हास्केल, ओपी की चिंता को एक साथ खत्म कर दें? – kirakun

+3

जबकि मैं आपकी टिप्पणी की सराहना करता हूं ... नहीं, मैं एक स्थाई रूप से टाइप की गई भाषा पर स्विच नहीं करूँगा :-) – Ultranewb

+0

स्टेटिक भाषाओं में आमतौर पर तेज़ पैटर्न मिलान होते हैं क्योंकि उनके पास पैटर्न के मिलान के लिए विशेष रूप से टाइप करने के लिए अधिक जानकारी होती है वहां पहुंच सकता है। Erlang में HiPE के साथ संकलन आपको कुछ में वापस देता है। –

5

यह मूल रूप से के रूप में @ (बहुत है पर हावी रहे हैं) क्रैप उत्तर :-) ने कहा है और उसका उदाहरण दिखाता है।

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

तो, हाँ, एरलांग प्रोलॉग से तेज़ी से मिलान करने वाला पैटर्न करेगा।

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