2010-12-01 14 views
12

मुझे गति के लिए मेरे कार्यक्रम के विभिन्न हिस्सों को बेंचमार्क करने में दिलचस्पी है। मैंने जानकारी (आंकड़े) और erlang का उपयोग करने की कोशिश की है: अब()ERLANG - समय अनुप्रयोग

मुझे माइक्रोसॉन्ड को पता होना चाहिए कि औसत गति क्या है। मुझे नहीं पता कि मुझे लिखी गई लिपि में परेशानी क्यों है।

यह कहीं भी शुरू करने और कहीं भी समाप्त करने में सक्षम होना चाहिए। मैं एक समस्या में भाग गया जब मैंने इसे एक ऐसी प्रक्रिया पर शुरू करने की कोशिश की जो समानांतर में 4 गुना तक चल रहा हो।

क्या कोई ऐसा व्यक्ति है जिसके पास पहले से ही इस मुद्दे का समाधान है?

संपादित करें:

अगर किसी को यह करने के लिए एक स्क्रिप्ट प्रदान कर सकते हैं एक इनाम देने के लिए तैयार। हालांकि कई प्रक्रियाओं को चलाने की जरूरत है। मैं टाइमर जैसे फ़ंक्शन को स्वीकार नहीं कर सकता .. कम से कम कार्यान्वयन में मैंने देखा है। आईटी केवल एक प्रक्रिया को पार करता है और फिर भी एक पूर्ण कार्यक्रम के पूर्ण परीक्षण के लिए कुछ प्रमुख संपादन आवश्यक है। आशा है कि मैंने इसे पर्याप्त स्पष्ट कर दिया है।

+0

वहाँ रहे हैं ungivens के एक जोड़े: यह एक है उत्पादन प्रणाली? 'eprof' और * विशेष रूप से *' fprof' चलते समय एक प्रदर्शन हिट होता है। दोनों नव-निर्मित प्रसंस्करण का पालन कर सकते हैं। आप नेटवर्क राउंड-ट्रिप जैसे कुछ और मापना चाहेंगे और इतने पर! सबसे आसान तरीका शायद मापने के लिए फ़ंक्शन के चारों ओर एक 'टाइमर: टीसी' कॉल इंजेक्ट करना है। वैकल्पिक रूप से, 'erlang: अब() 'ले लो और उसे दूसरी प्रक्रिया में भेज दें जो माप माप कर सकता है। –

+0

आपको पृष्ठ पर अपनी ईप्रोफ स्क्रिप्ट (या वॉथथ्रू) कम है :) –

उत्तर

38

यहाँ कैसे आप के लिए eprof संभावना सबसे आसान समाधान का उपयोग करने के, है:

सबसे पहले आप, यह शुरू करने की आवश्यकता वहाँ बाहर सबसे अनुप्रयोगों की तरह:

23> eprof:start(). 
{ok,<0.95.0>} 

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

24> eprof:start_profiling([self()]). 
profiling 

यह सबकुछ प्रोफाइल करने के लिए ई-प्रॉफ को बताता है जो खोल से चलाया जाएगा और खोल से उत्पन्न होगा। नई प्रक्रियाओं को यहां शामिल किया जाएगा।

25> trade_calls:main_ab(). 
Spawned Carl: <0.99.0> 
Spawned Jim: <0.101.0> 
<0.100.0> 
Jim: asking user <0.99.0> for a trade 
Carl: <0.101.0> asked for a trade negotiation 
Carl: accepting negotiation 
Jim: starting negotiation 
... <snip> ... 

अब हम रूपरेखा को रोकने के लिए एक बार समारोह चल रहा किया जाता है eprof बता सकते हैं: मैं कुछ मनमाने ढंग से बहु समारोह मेरे पास है, जिसके बारे में 4 प्रक्रियाओं कुछ सेकंड के लिए एक दूसरे के साथ संवाद स्थापित करने spawns चलेंगे।

26> eprof:stop_profiling(). 
profiling_stopped 

और हम लॉग चाहते हैं। Eprof उन्हें डिफ़ॉल्ट रूप से स्क्रीन पर प्रिंट करेगा। आप इसे eprof:log(File) वाली फ़ाइल पर लॉग इन करने के लिए भी कह सकते हैं। फिर आप परिणामों का विश्लेषण करने के लिए कह सकते हैं। हम यह बताना विकल्प total (अधिक विकल्पों के लिए manual देखें) के साथ एक एकल तालिका में सभी प्रक्रियाओं से रन टाइम संक्षिप्त करने के लिए:

27> eprof:analyze(total).   
FUNCTION         CALLS  % TIME [uS/CALLS] 
--------         ----- --- ---- [----------] 
io:o_request/3        46 0.00  0 [  0.00] 
io:columns/0         2 0.00  0 [  0.00] 
io:columns/1         2 0.00  0 [  0.00] 
io:format/1         4 0.00  0 [  0.00] 
io:format/2         46 0.00  0 [  0.00] 
io:request/2         48 0.00  0 [  0.00] 
... 
erlang:atom_to_list/1       5 0.00  0 [  0.00] 
io:format/3         46 16.67 1000 [  21.74] 
erl_eval:bindings/1       4 16.67 1000 [ 250.00] 
dict:store_bkt_val/3      400 16.67 1000 [  2.50] 
dict:store/3        114 50.00 3000 [  26.32] 

और आप देख सकते हैं कि समय (50%) के सबसे खर्च किया जाता है dict में: स्टोर/3। परिणाम उत्पन्न करने में 16.67% लिया जाता है, एक और 16.67% erl_eval द्वारा लिया जाता है (यही कारण है कि आप खोल में छोटे कार्यों को चलाकर प्राप्त करते हैं - पार्सिंग उन्हें चलाने से अधिक लंबा हो जाता है)।

फिर आप वहां से जा सकते हैं। Erlang के साथ रनिंग रनिंग प्रोफाइल की मूल बातें हैं। देखभाल के साथ संभाल लें, ईप्रोफ उत्पादन प्रणाली पर या बहुत लंबे समय तक चलने वाले कार्यों के लिए काफी भार हो सकता है। विशेष रूप से एक उत्पादन प्रणाली पर।इस https://raw.github.com/virtan/eep/master/doc/sshot1.png एक परिणाम के रूप की तरह कुछ https://github.com/virtan/eep

आप मिल जाएगा:

+0

अच्छा काम करने वाला आदमी, इसे आजमाया, अच्छा लग रहा है .. एक सवाल: कुछ प्रोजेक्ट क्यों कहते हैं 'मेरे प्रॉग में 0 कॉल कहते हैं? मुझे पता है कि सूचियों जैसे कुछ अन्य मज़ेदार होने के लिए इसे बुलाया जाना था: फ़्लैटन कहा जाता है। क्या यह कुछ स्पष्ट है? या मेरे कार्यक्रम के लिए थोड़ा और गूढ़। – BAR

+0

मैं कोड के बिना नहीं कह सकता - मुझे इसे अपने कोड में देखना याद नहीं है। –

3

ऐसा करने का सामान्य तरीका टाइमर के साथ है: टीसी। Here एक अच्छी व्याख्या है।

+0

मुझे इसे प्रक्रिया में चलाने की आवश्यकता है 'केवल एक परीक्षण न करें। – BAR

+1

'eprof' वह उपकरण है जिसे आप चाहते हैं। –

0

मैं आप इस उपकरण की सिफारिश कर सकते हैं।

चल सिस्टम पर सभी प्रक्रियाओं की रूपरेखा के लिए कदम अनुदेश द्वारा कदम:

लक्ष्य प्रणाली पर:

1> eep:start_file_tracing("file_name"), timer:sleep(20000), eep:stop_tracing(). 
$ scp -C $PWD/file_name.trace desktop: 

डेस्कटॉप पर:

1> eep:convert_tracing("file_name"). 
$ kcachegrind callgrind.out.file_name