Erlang 21 - 4. Specialized Decodes

4 विशेषीकृत निर्णय




erlang

4 विशेषीकृत निर्णय

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

दो पूर्ण डीकोड (डिकोड का सामान्य मामला) बनाने के बजाय, एक सर्वर में और एक पतादेसी में, केवल एक विशेष डिकोड (सर्वर में) और दूसरा पूर्ण डिकोड (पता में) बनाना आवश्यक है। यह खंड निम्नलिखित दो विशेष डिकोड का वर्णन करता है, जो इसे हल करने के लिए समर्थन करते हैं और इसी तरह की समस्याएं:

  • एक्सक्लूसिव डीकोड
  • चयनित डिकोड

यह कार्यक्षमता केवल BER (विकल्प ber ) का उपयोग करते समय प्रदान की जाती है।

४.१ अनन्य डिकोड

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

प्रक्रिया

एक विशेष डिकोड करने के लिए:

  • चरण 1: अनन्य डिकोड के लिए फ़ंक्शन का नाम तय करें।
  • चरण 2: कॉन्फ़िगरेशन फ़ाइल में निम्नलिखित निर्देश शामिल करें:

    • एक्सक्लूसिव डीकोड फंक्शन का नाम
    • ASN.1 विनिर्देशन का नाम
    • एक संकेतन जो बताता है कि संदेश संरचना के किन हिस्सों को डिकोड से बाहर रखा जाना है
  • चरण 3 अतिरिक्त विकल्प asn1config साथ संकलित करें। कंपाइलर कॉन्फ़िगरेशन फ़ाइल के लिए ASN.1 विनिर्देश के समान नाम के साथ खोज करता है, लेकिन एक्सटेंशन .asn1config साथ। यह कॉन्फ़िगरेशन फ़ाइल समान नहीं है जिसका उपयोग फ़ाइलों के सेट के संकलन के लिए किया जाता है। Writing an Exclusive Decode Instruction. अनुभाग देखें Writing an Exclusive Decode Instruction.

प्रयोक्ता इंटरफ़ेस

एक्सक्लूसिव डीकोड के रनटाइम यूजर इंटरफेस में निम्नलिखित दो कार्य होते हैं:

  • एक विशेष डिकोड के लिए एक फ़ंक्शन, जिसका नाम उपयोगकर्ता कॉन्फ़िगरेशन फ़ाइल में निर्णय लेता है
  • कंपाइलर एक decode_part/2 फ़ंक्शन उत्पन्न करता है जब अनन्य डिकोड चुना जाता है। यह फ़ंक्शन उन भागों को डीकोड करता है जिन्हें अनन्य डिकोड के दौरान पूर्ववत् छोड़ दिया गया था।

दोनों कार्यों को निम्नलिखित में वर्णित किया गया है।

यदि अनन्य डिकोड फ़ंक्शन में है, उदाहरण के लिए, नाम decode_exclusive और ASN.1 एन्कोडेड संदेश Bin अनन्य डिकोड किया जाना है, तो कॉल इस प्रकार है:

{ok,Excl_Message} = 'MyModule':decode_exclusive(Bin)      

परिणाम Excl_Message पास एक पूरी संरचना के रूप में एक ही डीकोड होगा, जो शीर्ष प्रकार के उन भागों को छोड़कर, जिन्हें डिकोड नहीं किया गया था। {Type_Key,Undecoded_Value} प्रारूप में संरचना के अपने स्थानों पर होते हैं {Type_Key,Undecoded_Value}

प्रत्येक अनिर्धारित भाग जिसे डिकोड किया जाना है, उसे फंक्शन decode_part/2 में निम्नानुसार decode_part/2 किया जाना चाहिए:

{ok,Part_Message} = 'MyModule':decode_part(Type_Key,Undecoded_Value)

एक्सक्लूसिव डिकोड इंस्ट्रक्शन लिखना

यह निर्देश निम्न प्रारूप में विन्यास फाइल में लिखा गया है:

Exclusive_Decode_Instruction = {exclusive_decode,{Module_Name,Decode_Instructions}}.

Module_Name = atom()

Decode_Instructions = [Decode_Instruction]+

Decode_Instruction = {Exclusive_Decode_Function_Name,Type_List}

Exclusive_Decode_Function_Name = atom()

Type_List = [Top_Type,Element_List]

Element_List = [Element]+

Element = {Name,parts} |
          {Name,undecoded} |
          {Name,Element_List}

Top_Type = atom()

Name = atom()

निर्देश एक वैध एर्लैंग शब्द होना चाहिए जो एक डॉट द्वारा समाप्त हो गया है।

Type_List में "प्रकार" शीर्ष प्रकार से प्रत्येक Type_List में वर्णित है। पथ का शीर्ष प्रकार एक परमाणु है, इसका नाम है। प्रत्येक घटक / प्रकार पर होने वाली क्रिया {Name,parts}, {Name,undecoded}, {Name,Element_List} से एक द्वारा वर्णित है।

क्रियाओं का उपयोग और प्रभाव इस प्रकार है:

  • {Name,undecoded} - बताता है कि तत्व विशेष डिकोड के दौरान पूर्ववत् छोड़ दिया जाता है। Name का प्रकार कोई भी ASN.1 प्रकार हो सकता है। तत्व Name का मान शीर्ष प्रकार के मान संरचना में टपल के रूप में दिया गया है (जैसा कि पिछले भाग में बताया गया है)।
  • {Name,parts} - Name का प्रकार खोज या SET OF एक हो सकता है। कार्रवाई का तात्पर्य है कि Name के विभिन्न अवयवों को पूर्ववत् छोड़ दिया जाता है। Name का मान टपल के रूप में दिया जाता है (जैसा कि पिछले भाग में बताया गया है) जहां दूसरा तत्व बायनेरिज़ की सूची है। ऐसा इसलिए है क्योंकि SEQUENCE OF एक SEQUENCE OF या SET OF प्रतिनिधित्व इसके आंतरिक प्रकार की एक सूची है। इस सूची या संपूर्ण सूची में कोई भी तत्व फ़ंक्शन decode_part द्वारा डीकोड किया जा सकता है।
  • {Name,Element_List} - यह क्रिया तब उपयोग की जाती है जब Name का एक या अधिक उपप्रकार अनन्य डिकोड किया जाता है।

इन क्रियाओं में Name एक घटक का नाम हो सकता है या SET OF , या किसी CHOICE में विकल्प का नाम हो सकता है।

उदाहरण

इस उदाहरण में, निम्नलिखित ASN.1 विनिर्देशन की परिभाषा का उपयोग किया जाता है:

GUI DEFINITIONS AUTOMATIC TAGS ::=

BEGIN

Action ::= SEQUENCE 
 { 
   number  INTEGER DEFAULT 15,
   handle  [0] Handle DEFAULT {number  12, on  TRUE}
 }

Key ::= [11] EXPLICIT Button
Handle ::= [12] Key
Button ::= SEQUENCE 
 {
   number  INTEGER,
   on  BOOLEAN
 }

Window ::= CHOICE 
 {
   vsn INTEGER,
   status E
 }

Status ::= SEQUENCE 
 {
   state INTEGER,
   buttonList SEQUENCE OF Button,
   enabled BOOLEAN OPTIONAL,
   actions CHOICE {
     possibleActions SEQUENCE OF Action,
     noOfActions INTEGER
   }
 }


END

यदि Button एक शीर्ष प्रकार है और इसे डिकोड से घटक number को बाहर करने की आवश्यकता है, तो कॉन्फ़िगरेशन फ़ाइल में निर्देश में Type_List ['Button',[{number,undecoded}]] । यदि आप डिकोड फ़ंक्शन को decode_Button_exclusive , तो Decode_Instruction {decode_Button_exclusive,['Button',[{number,undecoded}]]}

एक अन्य शीर्ष प्रकार Window जिसके प्रकार की Status में buttonList और घटक buttonList के भाग को buttonList है। इस प्रकार के लिए, फ़ंक्शन का नाम decode__Window_exclusive । पूरा Exclusive_Decode_Instruction कॉन्फ़िगरेशन निम्नानुसार है:

{exclusive_decode,{'GUI',
	[{decode_Window_exclusive,['Window',[{status,[{buttonList,parts},{actions,undecoded}]}]]},
	 {decode_Button_exclusive,['Button',[{number,undecoded}]]}]}}.

निम्न आंकड़ा Window:status के बाइट्स को दर्शाता है Window:status संदेश। घटकों buttonList और actions को डिकोड से बाहर रखा गया है। केवल डिकोड decode__Window_exclusive कहा जाता है जब state और enabled डिकोड किया जाता है।

चित्र 4.1: विंडो के बाइट्स: स्थिति संदेश

कॉन्फ़िगरेशन फ़ाइल सहित GUI.asn संकलन निम्नानुसार किया जाता है:

unix> erlc -bber +asn1config GUI.asn

erlang> asn1ct:compile('GUI', [ber,asn1config]).

मॉड्यूल का उपयोग निम्नानुसार किया जा सकता है:

1> Button_Msg = {'Button',123,true}.
{'Button',123,true}
2> {ok,Button_Bytes} = 'GUI':encode('Button',Button_Msg).
{ok,[<<48>>,
     [6],
     [<<128>>,
      [1],
      123],
     [<<129>>,
      [1],
      255]]}
3> {ok,Exclusive_Msg_Button} = 'GUI':decode_Button_exclusive(list_to_binary(Button_Bytes)).
{ok,{'Button',{'Button_number',<<28,1,123>>},
         true}}
4> 'GUI':decode_part('Button_number',<<128,1,123>>).
{ok,123}
5> Window_Msg = 
{'Window',{status,{'Status',35,
              [{'Button',3,true},
               {'Button',4,false},
               {'Button',5,true},
               {'Button',6,true},
               {'Button',7,false},
               {'Button',8,true},
               {'Button',9,true},
               {'Button',10,false},
               {'Button',11,true},
               {'Button',12,true},
               {'Button',13,false},
               {'Button',14,true}],
              false,
              {possibleActions,[{'Action',16,{'Button',17,true}}]}}}}. 
{'Window',{status,{'Status',35,
              [{'Button',3,true},
               {'Button',4,false},
               {'Button',5,true},
               {'Button',6,true},
               {'Button',7,false},
               {'Button',8,true},
               {'Button',9,true},
               {'Button',10,false},
               {'Button',11,true},
               {'Button',12,true},
               {'Button',13,false},
               {'Button',14,true}],
              false,
              {possibleActions,[{'Action',16,{'Button',17,true}}]}}}}
6> {ok,Window_Bytes}='GUI':encode('Window',Window_Msg).
{ok,[<<161>>,
     [127],
     [<<128>>, ...


8> {ok,{status,{'Status',Int,{Type_Key_SeqOf,Val_SEQOF},
BoolOpt,{Type_Key_Choice,Val_Choice}}}}=
'GUI':decode_Window_status_exclusive(list_to_binary(Window_Bytes)).
{ok,{status,{'Status',35,
        {'Status_buttonList',[<<48,6,128,1,3,129,1,255>>,
                              <<48,6,128,1,4,129,1,0>>,
                              <<48,6,128,1,5,129,1,255>>,
                              <<48,6,128,1,6,129,1,255>>,
                              <<48,6,128,1,7,129,1,0>>,
                              <<48,6,128,1,8,129,1,255>>,
                              <<48,6,128,1,9,129,1,255>>,
                              <<48,6,128,1,10,129,1,0>>,
                              <<48,6,128,1,11,129,1,255>>,
                              <<48,6,128,1,12,129,1,255>>,
                              <<48,6,128,1,13,129,1,0>>,
                              <<48,6,128,1,14,129,1,255>>]},
        false,
        {'Status_actions',
<<163,21,160,19,48,17,2,1,16,160,12,172,10,171,8,48,6,128,1,...>>}}}}
10> 'GUI':decode_part(Type_Key_SeqOf,Val_SEQOF).
{ok,[{'Button',3,true},
     {'Button',4,false},
     {'Button',5,true},
     {'Button',6,true},
     {'Button',7,false},
     {'Button',8,true},
     {'Button',9,true},
     {'Button',10,false},
     {'Button',11,true},
     {'Button',12,true},
     {'Button',13,false},
     {'Button',14,true}]}
11> 'GUI':decode_part(Type_Key_SeqOf,hd(Val_SEQOF)).
{ok,{'Button',3,true}}
12> 'GUI':decode_part(Type_Key_Choice,Val_Choice).  
{ok,{possibleActions,[{'Action',16,{'Button',17,true}}]}}

४.२ चयनात्मक डिकोड

यह विशेष डीकोड एक निर्मित मूल्य के उपप्रकार को डिकोड करता है और एक उप-रेखा निकालने का सबसे तेज़ तरीका है। इस डिकोड का उपयोग आम तौर पर तब किया जाता है जब आप निरीक्षण करना चाहते हैं, उदाहरण के लिए, एक संस्करण संख्या, जो यह तय करने में सक्षम हो कि पूरे मूल्य के साथ क्या करना है। परिणाम को {ok,Value} या {error,Reason} रूप में लौटाया जाता है।

प्रक्रिया

एक चयनात्मक डिकोड करने के लिए:

  • चरण 1: कॉन्फ़िगरेशन फ़ाइल में निम्नलिखित निर्देश शामिल करें:

    • उपयोगकर्ता फ़ंक्शन का नाम
    • ASN.1 विनिर्देशन का नाम
    • एक संकेतन जो बताता है कि किस प्रकार का डिकोड किया जाना है
  • चरण 2: अतिरिक्त विकल्प के साथ संकलन करें asn1config । कंपाइलर कॉन्फ़िगरेशन फ़ाइल के लिए ASN.1 विनिर्देशन के समान नाम के साथ खोज करता है, लेकिन एक्सटेंशन .asn1config साथ। उसी फ़ाइल में आप एक्सक्लूसिव डीकोड के लिए कॉन्फ़िगरेशन स्पेसिफिकेशन भी दे सकते हैं। उत्पन्न Erlang मॉड्यूल में एन्कोड / डिकोड संरक्षित के लिए सामान्य कार्यक्षमता है और विशेष डीकोड कार्यक्षमता जोड़ा गया है।

प्रयोक्ता इंटरफ़ेस

केवल नया उपयोगकर्ता इंटरफ़ेस फ़ंक्शन कॉन्फ़िगरेशन फ़ाइल में उपयोगकर्ता द्वारा प्रदान किया गया एक है। समारोह की शुरुआत ModuleName:FunctionName संकेतन द्वारा की ModuleName:FunctionName है।

उदाहरण के लिए, यदि कॉन्फ़िगरेशन फ़ाइल में विनिर्देशन {selective_decode,{'ModuleName',[{selected_decode_Window,TypeList}]}} हैं, तो {ok,Result}='ModuleName':selected_decode_Window(EncodedBinary). द्वारा चयनात्मक डिकोड करें {ok,Result}='ModuleName':selected_decode_Window(EncodedBinary).

एक चयनात्मक डिकोड निर्देश लिखना

कॉन्फ़िगरेशन फ़ाइल में एक या अधिक चयनात्मक डिकोड फ़ंक्शन का वर्णन किया जा सकता है। निम्नलिखित संकेतन का उपयोग करें:

Selective_Decode_Instruction = {selective_decode,{Module_Name,Decode_Instructions}}.

Module_Name = atom()

Decode_Instructions = [Decode_Instruction]+

Decode_Instruction = {Selective_Decode_Function_Name,Type_List}

Selective_Decode_Function_Name = atom()

Type_List = [Top_Type|Element_List]

Element_List = Name|List_Selector

Name = atom()

List_Selector = [integer()]

निर्देश एक वैध एर्लैंग शब्द होना चाहिए जो एक डॉट द्वारा समाप्त हो गया है।

  • Module_Name ASN.1 विनिर्देशन के नाम के समान है, लेकिन विस्तार के बिना।
  • Decode_Instruction आपके चुने हुए फ़ंक्शन नाम और शीर्ष प्रकार के घटकों के साथ एक टपल है जो उस एकल प्रकार की ओर जाता है जिसे आप डीकोड करना चाहते हैं। अपने फ़ंक्शन का नाम चुनना सुनिश्चित करें जो किसी भी उत्पन्न फ़ंक्शन के समान नहीं है।
  • Type_List का पहला तत्व एन्कोडेड संदेश का शीर्ष प्रकार है। Element_List , यह घटक नामों में से प्रत्येक द्वारा पीछा किया जाता है जो चयनित प्रकार की ओर जाता है।
  • Element_List में प्रत्येक नाम अंतिम नाम को छोड़कर एक निर्मित प्रकार होना चाहिए, जो किसी भी प्रकार का हो सकता है।
  • List_Selector यह संभव बनाता है कि किसी एक SEQUENCE OF या SET OF में एन्कोड किए गए घटकों में से एक को चुनें। उस घटक में आगे जाना और डिकोड करने के लिए उस का एक उपप्रकार चुनना भी संभव है। तो, Type_List : ['Window',status,buttonList,[1],number] , कंपोनेंट buttonList को टाइप SEQUENCE OF SET OF या SET OF होना चाहिए।

उदाहरण में, buttonList के SEQUENCE OF में एन्कोड किए गए तत्वों में से पहले के घटक number का चयन किया जाता है। यह ASN.1 विनिर्देश पर धारा Writing an Exclusive Decode Instruction में लागू होता है Writing an Exclusive Decode Instruction

एक और उदाहरण

इस उदाहरण में, ASN.1 विनिर्देशन के रूप में धारा Writing an Exclusive Decode Instruction का उपयोग किया जाता है। निम्नलिखित एक मान्य चयनात्मक डिकोड निर्देश है:

{selective_decode,
    {'GUI',
        [{selected_decode_Window1,
            ['Window',status,buttonList, 
             [1],
             number]},
 {selected_decode_Action,
     ['Action',handle,number]},
 {selected_decode_Window2,
     ['Window',
      status,
      actions,
      possibleActions,
      [1],
      handle,number]}]}}.

पहला निर्देश, {selected_decode_Window1,['Window',status,buttonList,[1],number]} पिछले अनुभाग में वर्णित है।

दूसरा निर्देश, {selected_decode_Action,['Action',handle,number]} , टाइप Action के handle घटक में घटक number लेता है। यदि मान ValAction = {'Action',17,{'Button',4711,false}} , तो आंतरिक मूल्य 4711 ValAction = {'Action',17,{'Button',4711,false}} द्वारा उठाया जाना है। एरलैंग टर्मिनल में यह इस प्रकार दिखता है:

ValAction = {'Action',17,{'Button',4711,false}}.
{'Action',17,{'Button',4711,false}}
7> {ok,Bytes}='GUI':encode('Action',ValAction).
...
8> BinBytes = list_to_binary(Bytes).
<<48,18,2,1,17,160,13,172,11,171,9,48,7,128,2,18,103,129,1,0>>
9> 'GUI':selected_decode_Action(BinBytes).
{ok,4711}
10>

तीसरा निर्देश, ['Window',status,actions,possibleActions,[1],handle,number] , निम्नानुसार काम करता है:

  • चरण 1: प्रकार Window साथ शुरू होता है।
  • चरण 2: Window की घटक status लेता है जो कि प्रकार की Status
  • चरण 3: प्रकार की Status की कार्रवाई करता है।
  • चरण 4: आंतरिक रूप से परिभाषित CHOICE प्रकार के possibleActions CHOICE लेता possibleActions
  • चरण 5: SEQUENCE OF के पहले घटक SEQUENCE OF जाता है [1] । वह घटक टाइप Action
  • चरण 6: घटक handle लेता handle
  • चरण 7: टाइप Button घटक number लेता है।

निम्न आंकड़ा दिखाता है कि TypeList में कौन से घटक हैं ['Window',status,actions,possibleActions,[1],handle,number] TypeList ['Window',status,actions,possibleActions,[1],handle,number] :

चित्र 4.2: विंडो मेसेज में सबवेलेव के चयनात्मक डिकोड के लिए विन्यास फाइल में निर्दिष्ट तत्व

निम्नलिखित आकृति में, केवल selected_decode_Window2 तत्व को चयनित_डॉब्लौस_विंडो 2 द्वारा डिकोड किया जाता है:

चित्रा 4.3: एक खिड़की के बाइट: स्थिति संदेश

निम्नलिखित उदाहरण के साथ, आप यह जांच कर सकते हैं कि दोनों चयनित_डब्लू_विन्डो 2 और सेलेक्टेड_डब्लू_विंडो 1 मूल्य मान के उप-खंड को डिकोड करते हैं:

1> Val = {'Window',{status,{'Status',12,
                    [{'Button',13,true},
                     {'Button',14,false},
                     {'Button',15,true},
                     {'Button',16,false}],
                    true,
                    {possibleActions,[{'Action',17,{'Button',18,false}},
                                      {'Action',19,{'Button',20,true}},
                                      {'Action',21,{'Button',22,false}}]}}}}
2> {ok,Bytes}='GUI':encode('Window',Val).
...
3> Bin = list_to_binary(Bytes).
<<161,101,128,1,12,161,32,48,6,128,1,13,129,1,255,48,6,128,1,14,129,1,0,48,6,128,1,15,129,...>>
4> 'GUI':selected_decode_Window1(Bin).
{ok,13}
5> 'GUI':selected_decode_Window2(Bin).
{ok,18}

ध्यान दें कि चयनात्मक डिकोड फ़ंक्शन में खिलाया गया मान एक बाइनरी होना चाहिए।

4.3 प्रदर्शन

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

ASN.1 विनिर्देशन, संदेश और कॉन्फ़िगरेशन

परीक्षण में विनिर्देशों GUI और MEDIA-GATEWAY-CONTROL का उपयोग किया गया था।

GUI विनिर्देशन के लिए कॉन्फ़िगरेशन निम्नानुसार था:

{selective_decode,
  {'GUI',
    [{selected_decode_Window1,
         ['Window',
          status,buttonList,
          [1],
          number]},
     {selected_decode_Window2,
         ['Window',
          status,
          actions,
          possibleActions,
          [1],
          handle,number]}]}}.
     {exclusive_decode,
         {'GUI',
            [{decode_Window_status_exclusive,
                ['Window',
                 [{status,
                     [{buttonList,parts},
                      {actions,undecoded}]}]]}]}}.

MEDIA-GATEWAY-CONTROL विन्यास इस प्रकार था:

{exclusive_decode,
  {'MEDIA-GATEWAY-CONTROL',
    [{decode_MegacoMessage_exclusive,
        ['MegacoMessage',
         [{authHeader,undecoded},
          {mess,
             [{mId,undecoded},
              {messageBody,undecoded}]}]]}]}}.
{selective_decode,
  {'MEDIA-GATEWAY-CONTROL',
    [{decode_MegacoMessage_selective,
         ['MegacoMessage',mess,version]}]}}.

निम्न मान इस प्रकार थे:

{'Window',{status,{'Status',12,
              [{'Button',13,true},
               {'Button',14,false},
               {'Button',15,true},
               {'Button',16,false},
               {'Button',13,true},
               {'Button',14,false},
               {'Button',15,true},
               {'Button',16,false},
               {'Button',13,true},
               {'Button',14,false},
               {'Button',15,true},
               {'Button',16,false}],
              true,
              {possibleActions,
                 [{'Action',17,{'Button',18,false}},
                  {'Action',19,{'Button',20,true}},
                  {'Action',21,{'Button',22,false}},
                  {'Action',17,{'Button',18,false}},
                  {'Action',19,{'Button',20,true}},
                  {'Action',21,{'Button',22,false}},
                  {'Action',17,{'Button',18,false}},
                  {'Action',19,{'Button',20,true}},
                  {'Action',21,{'Button',22,false}},
                  {'Action',17,{'Button',18,false}},
                  {'Action',19,{'Button',20,true}},
                  {'Action',21,{'Button',22,false}},
                  {'Action',17,{'Button',18,false}},
                  {'Action',19,{'Button',20,true}},
                  {'Action',21,{'Button',22,false}},
                  {'Action',17,{'Button',18,false}},
                  {'Action',19,{'Button',20,true}},
                  {'Action',21,{'Button',22,false}}]}}}}


{'MegacoMessage',asn1_NOVALUE,
  {'Message',1,
    {ip4Address,
      {'IP4Address',[125,125,125,111],55555}},
  {transactions,
    [{transactionReply,
      {'TransactionReply',50007,asn1_NOVALUE,
       {actionReplies,
        [{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
          [{auditValueReply,{auditResult,{'AuditResult',
            {'TerminationID',[],[255,255,255]},
             [{mediaDescriptor,
               {'MediaDescriptor',asn1_NOVALUE,
                {multiStream,
                 [{'StreamDescriptor',1,
                   {'StreamParms',
                    {'LocalControlDescriptor',
                     sendRecv,
                     asn1_NOVALUE,
                     asn1_NOVALUE,
                     [{'PropertyParm',
                       [0,11,0,7],
                       [[52,48]],
                       asn1_NOVALUE}]},
                    {'LocalRemoteDescriptor',
                     [[{'PropertyParm',
                        [0,0,176,1],
                        [[48]],
                        asn1_NOVALUE},
                       {'PropertyParm',
                         [0,0,176,8],
                         [[73,78,32,73,80,52,32,49,50,53,46,49,
                           50,53,46,49,50,53,46,49,49,49]],
                         asn1_NOVALUE},
                       {'PropertyParm',
                         [0,0,176,15],
                         [[97,117,100,105,111,32,49,49,49,49,32,
                           82,84,80,47,65,86,80,32,32,52]],
                         asn1_NOVALUE},
                       {'PropertyParm',
                         [0,0,176,12],
                         [[112,116,105,109,101,58,51,48]],
                         asn1_NOVALUE}]]},
                    {'LocalRemoteDescriptor',
                     [[{'PropertyParm',
                         [0,0,176,1],
                         [[48]],
                         asn1_NOVALUE},
                       {'PropertyParm',
                         [0,0,176,8],
                         [[73,78,32,73,80,52,32,49,50,52,46,49,50,
                           52,46,49,50,52,46,50,50,50]],
                         asn1_NOVALUE},
                       {'PropertyParm',
                         [0,0,176,15],
                         [[97,117,100,105,111,32,50,50,50,50,32,82,
                           84,80,47,65,86,80,32,32,52]],
                         asn1_NOVALUE},
                       {'PropertyParm',
                         [0,0,176,12],
                         [[112,116,105,109,101,58,51,48]],
                         asn1_NOVALUE}]]}}}]}}},
              {packagesDescriptor,
               [{'PackagesItem',[0,11],1},
                {'PackagesItem',[0,11],1}]},
              {statisticsDescriptor,
               [{'StatisticsParameter',[0,12,0,4],[[49,50,48,48]]},
                {'StatisticsParameter',[0,11,0,2],[[54,50,51,48,48]]},
                {'StatisticsParameter',[0,12,0,5],[[55,48,48]]},
                {'StatisticsParameter',[0,11,0,3],[[52,53,49,48,48]]},
                {'StatisticsParameter',[0,12,0,6],[[48,46,50]]},
                {'StatisticsParameter',[0,12,0,7],[[50,48]]},
                {'StatisticsParameter',[0,12,0,8],[[52,48]]}]}]}}}]}]}}}]}}}

एन्कोडेड मानों का आकार GUI लिए 458 बाइट्स और MEDIA-GATEWAY-CONTROL लिए 464 बाइट्स था।

परिणाम

परीक्षण में ASN.1 विनिर्देशों को विकल्प ber_bin, optimize, driver और asn1config साथ संकलित किया गया था। ओमिटिंग विकल्प driver decode और decode_part लिए उच्च मान देता है। ये परीक्षण एनआईएफ का उपयोग करके पुन: नहीं किया गया है, लेकिन लिंक्ड-इन ड्राइवर की तुलना में लगभग 5% बेहतर प्रदर्शन करने की उम्मीद है।

परीक्षण कार्यक्रम मूल्य पर 10000 डिकोड चलाता है, जिसके परिणामस्वरूप माइक्रोकोड में बाद वाले समय में कुल संख्या के लिए आउटपुट होता है।

समारोह समय (माइक्रोसेकंड) डिकोड प्रकार ASN.1 विशिष्टता समय का पूरा बनाम डिकोड
decode_MegacoMessage_selective/1 374045 Selective MEDIA-GATEWAY-CONTROL 8.3
decode_MegacoMessage_exclusive/1 621107 Exclusive MEDIA-GATEWAY-CONTROL 13.8
decode/2 4507457 Complete MEDIA-GATEWAY-CONTROL 100
selected_decode_Window1/1 449585 Selective GUI 7.6
selected_decode_Window2/1 890666 Selective GUI 15.1
decode_Window_status_exclusive/1 1251878 Exclusive GUI 21.3
decode/2 5889197 Complete GUI 100

तालिका 4.1: पूर्ण, अनन्य और चयनात्मक डिकोड के परिणाम

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

क्रिया समारोह समय (माइक्रोसेकंड) ASN.1 विशिष्टता समय का पूरा बनाम डिकोड
Complete decode/2 4507457 MEDIA-GATEWAY-CONTROL 100
Selective and Complete decode_MegacoMessage_selective/1 4881502 MEDIA-GATEWAY-CONTROL 108.3
Exclusive and decode_part decode_MegacoMessage_exclusive/1 5481034 MEDIA-GATEWAY-CONTROL 112.3
Complete decode/2 5889197 GUI 100
Selective and Complete selected_decode_Window1/1 6337636 GUI 107.6
Selective and Complete selected_decode_Window2/1 6795319 GUI 115.4
Exclusive and decode_part decode_Window_status_exclusive/1 6249200 GUI 106.1

तालिका 4.2: पूर्ण, अनन्य + डीकोड_पार्ट और चयनात्मक + पूर्ण डीकोड के परिणाम

अन्य ASN.1 प्रकार और मूल्य इन आंकड़ों से बहुत भिन्न हो सकते हैं। इसलिए यह महत्वपूर्ण है कि आप, हर मामले में जहां आप इन दोनों में से किसी भी डिकोड का उपयोग करने का इरादा रखते हैं, कुछ ऐसे परीक्षण करें जो दिखाते हैं कि क्या आप इस उद्देश्य से लाभान्वित होंगे।

अंतिम टिप्पणी

  • एक पूर्ण डिकोड के बजाय चयनात्मक और अनन्य डिकोड का उपयोग करने का लाभ अधिक बड़ा मूल्य और संरचना में कम गहरा है जिसे आपको डिकोड करना है।
  • यदि आप केवल एक ही उप-क्षेत्र में रुचि रखते हैं, तो विशेष डीकोड के बजाय चयनात्मक डिकोड का उपयोग करें।
  • यदि डिकोडिंग के लिए अलग-अलग सर्वरों को भेजा जाता है, या यदि आप कुछ मामलों में सभी भागों में रुचि नहीं रखते हैं, तो decode_part डिकोड के बाद आने वाले विशेष डीकोड आकर्षक हैं।
  • सबसे तेज चयनात्मक डिकोड है जब डिकोड्ड प्रकार एक आदिम प्रकार है और शीर्ष प्रकार की संरचना में इतना गहरा नहीं है। चयनित_डब्लू_विन्डो 2 एक उच्च निर्मित मूल्य को डिकोड करता है, जो बताता है कि यह ऑपरेशन अपेक्षाकृत धीमा क्यों है।
  • यह मामले से अलग-अलग हो सकता है जो चयनात्मक / पूर्ण डिकोड या अनन्य / भाग डिकोड का संयोजन सबसे तेज है।