Erlang 21 - 2. cprof - The Call Count Profiler

2 cprof - कॉल गणना प्रोफाइलर




erlang

2 cprof - कॉल गणना प्रोफाइलर

cprof एक प्रोफाइलिंग टूल है जिसका उपयोग सिस्टम में विभिन्न कार्यों को कितनी बार किया जाता है, इसकी एक तस्वीर प्राप्त करने के लिए किया जा सकता है।

cprof स्थानीय कॉल ट्रेस के समान ब्रेकप्वाइंट का उपयोग करता है, लेकिन प्रोफाइलिंग डेटा एकत्र करने के लिए काउंटरों से युक्त होता है। इसके अलावा किसी भी मॉड्यूल के विशेष संकलन की कोई आवश्यकता नहीं है।

cprof कुल कॉल काउंट ऑर्डर को कम करने में सभी cprof मॉड्यूल को प्रस्तुत करता है, और प्रत्येक मॉड्यूल के लिए कॉल काउंट ऑर्डर को कम करने में सभी cprof फ़ंक्शन भी प्रस्तुत करता है। एक कॉल काउंट सीमा को सभी कार्यों को सीमा से नीचे फ़िल्टर करने के लिए निर्दिष्ट किया जा सकता है।

प्रोफाइलिंग निम्न चरणों में की जाती है:

cprof:start/0..3
उन पर कॉल काउंट ब्रेकप्वाइंट सेट करके निर्दिष्ट कार्यों के लिए शून्य कॉल काउंटर के साथ प्रोफाइलिंग शुरू करता है।
Mod:Fun()
कोड को चलाया जाता है।
cprof:pause/0..3
निर्दिष्ट कार्यों के लिए कॉल काउंटर को रोक देता है। यह पृष्ठभूमि में या शेल में चल रहे कोड के प्रभाव को कम करता है जो रूपरेखा को परेशान करता है। कॉल काउंटर स्वचालित रूप से रोक दिया जाता है जब वे मेजबान मशीन शब्द के आकार की "छत से टकराते हैं"। 32 बिट होस्ट के लिए अधिकतम काउंटर मूल्य 2147483647 है।
cprof:analyse/0..2
कॉल काउंटर इकट्ठा करता है और परिणाम की गणना करता है।
cprof:restart/0..3
निर्दिष्ट कार्यों के लिए शून्य से कॉल काउंटर को पुनरारंभ करता है। काउंटर प्रोफाइलिंग को रोकने और शुरू करने के लिए काउंटरों के एक नए सेट को इकट्ठा करने के लिए इस्तेमाल किया जा सकता है।
cprof:stop/0..3
निर्दिष्ट कार्यों से कॉल काउंट विराम बिंदुओं को हटाकर प्रोफाइल को रोकता है।

कार्य को सिस्टम में सभी के रूप में निर्दिष्ट किया जा सकता है, सभी एक मॉड्यूल में, सभी फ़ंक्शन एक फ़ंक्शन, एक फ़ंक्शन या सभी मॉड्यूल में सभी फ़ंक्शन अभी तक लोड नहीं किए गए हैं। अभी तक, BIF को कॉल काउंट ट्रेस नहीं किया जा सकता है।

विश्लेषण परिणाम या तो सभी मॉड्यूल के लिए हो सकता है, या एक मॉड्यूल के लिए। या तो मामले में एक कॉल काउंट सीमा दी जा सकती है ताकि फ़ंक्शंस को फ़िल्टर करने के लिए सीमा से नीचे कॉल काउंट दिया जा सके। सभी मॉड्यूल विश्लेषण में मॉड्यूल cprof ही नहीं होता है, इसका विश्लेषण करने के लिए केवल एकल मॉड्यूल के रूप में निर्दिष्ट करके इसका विश्लेषण किया जा सकता है।

ट्रेस के अन्य रूपों की तुलना में कॉल काउंट ट्रेसिंग बहुत हल्की होती है क्योंकि कोई ट्रेस संदेश उत्पन्न नहीं होता है। कुछ माप 10 प्रतिशत के आसपास के क्षेत्र में प्रदर्शन में गिरावट का संकेत देते हैं।

निम्नलिखित अनुभागों में cprof साथ प्रोफाइलिंग के कुछ उदाहरण हैं। cprof(3) भी देखें।

2.1 उदाहरण: पृष्ठभूमि का काम

एरलैंग शेल से:

1> cprof:start(), cprof:pause(). % Stop counters just after start
3476
2> cprof:analyse().
{30,
 [{erl_eval,11,
            [{{erl_eval,expr,3},3},
             {{erl_eval,'-merge_bindings/2-fun-0-',2},2},
             {{erl_eval,expand_module_name,2},1},
             {{erl_eval,merge_bindings,2},1},
             {{erl_eval,binding,2},1},
             {{erl_eval,expr_list,5},1},
             {{erl_eval,expr_list,3},1},
             {{erl_eval,exprs,4},1}]},
  {orddict,8,
           [{{orddict,find,2},6},
            {{orddict,dict_to_list,1},1},
            {{orddict,to_list,1},1}]},
  {packages,7,[{{packages,is_segmented_1,1},6},
               {{packages,is_segmented,1},1}]},
  {lists,4,[{{lists,foldl,3},3},{{lists,reverse,1},1}]}]}
3> cprof:analyse(cprof).
{cprof,3,[{{cprof,tr,2},2},{{cprof,pause,0},1}]}
4> cprof:stop().
3476

उदाहरण ने पृष्ठभूमि का काम दिखाया कि शेल केवल पहली कमांड लाइन की व्याख्या करने के लिए प्रदर्शन करता है। ज्यादातर काम erl_eval और orddict द्वारा किया जाता है।

इस उदाहरण में जो कैप्चर किया गया है, वह वह कार्य है, जो कमांड लाइन की व्याख्या करते समय शेल करता है, जो कि वास्तविक कॉल के बीच घटित होने के लिए होता है cprof:start() और cprof:analyse()

2.2 उदाहरण: एक मॉड्यूल

एरलैंग शेल से:

1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R.
1
2> cprof:analyse(calendar).
{calendar,9,
          [{{calendar,df,2},1},
           {{calendar,dm,1},1},
           {{calendar,dy,1},1},
           {{calendar,last_day_of_the_month1,2},1},
           {{calendar,last_day_of_the_month,2},1},
           {{calendar,is_leap_year1,1},1},
           {{calendar,is_leap_year,1},1},
           {{calendar,day_of_the_week,3},1},
           {{calendar,date_to_gregorian_days,3},1}]}
3> cprof:stop().
3271

उदाहरण हमें बताता है कि "अक्तीबोलागेट एलएम एरिक्सन एंड कंपनी" को सोमवार को पंजीकृत किया गया था (चूंकि पहले कमांड का वापसी मूल्य 1 है), और calendar मॉड्यूल को गणना करने के लिए 9 फ़ंक्शन कॉल की आवश्यकता थी।

इस उदाहरण में cprof:analyse() उपयोग करना भी पहले उदाहरण की तरह लगभग उसी बैकग्राउंड के काम को दिखाता है।

2.3 उदाहरण: कोड में

एक मॉड्यूल लिखें:

-module(sort).
      
-export([do/1]).
      
do(N) ->
    cprof:stop(),
    cprof:start(),
    do(N, []).
      
do(0, L) ->
    R = lists:sort(L),
    cprof:pause(),
    R;
do(N, L) ->
    do(N-1, [random:uniform(256)-1 | L]).

एरलैंग शेल से:

1> c(sort).
{ok,sort}
2> l(random).
{module,random}
3> sort:do(1000).
[0,0,1,1,1,1,1,1,2,2,2,3,3,3,3,3,4,4,4,5,5,5,5,6,6,6,6,6,6|...]
4> cprof:analyse().
{9050,
 [{lists_sort,6047,
              [{{lists_sort,merge3_2,6},923},
               {{lists_sort,merge3_1,6},879},
               {{lists_sort,split_2,5},661},
               {{lists_sort,rmerge3_1,6},580},
               {{lists_sort,rmerge3_2,6},543},
               {{lists_sort,merge3_12_3,6},531},
               {{lists_sort,merge3_21_3,6},383},
               {{lists_sort,split_2_1,6},338},
               {{lists_sort,rmerge3_21_3,6},299},
               {{lists_sort,rmerge3_12_3,6},205},
               {{lists_sort,rmerge2_2,4},180},
               {{lists_sort,rmerge2_1,4},171},
               {{lists_sort,merge2_1,4},127},
               {{lists_sort,merge2_2,4},121},
               {{lists_sort,mergel,2},79},
               {{lists_sort,rmergel,2},27}]},
  {random,2001,
          [{{random,uniform,1},1000},
           {{random,uniform,0},1000},
           {{random,seed0,0},1}]},
  {sort,1001,[{{sort,do,2},1001}]},
  {lists,1,[{{lists,sort,1},1}]}]}
5> cprof:stop().
5369

उदाहरण lists:sort/1 कुछ विवरण दिखाता है lists:sort/1 काम करता है। इसने कार्य को पूरा करने के लिए मॉड्यूल lists_sort में 6047 फ़ंक्शन कॉल का उपयोग किया।

इस बार, चूंकि शेल शामिल नहीं था, इसलिए प्रोफाइलिंग के दौरान सिस्टम में कोई अन्य काम नहीं किया गया था। यदि आप उसी उदाहरण को नए सिरे से शुरू किए गए code_server , लेकिन कमांड l(random) , तो विश्लेषण code_server और अन्य द्वारा किए गए code_server को स्वचालित रूप से random लोड करने के लिए बहुत अधिक फ़ंक्शन कॉल code_server