Boost Statechart बनाम मेटा स्टेट मशीन


142

राज्य मशीनों के लिए स्पष्ट रूप से बढ़ावा देने के लिए दो अलग-अलग पुस्तकालय हैं: स्टेटचर्ट और मेटा स्टेट मशीन (एमएसएम)। टैगलाइन बहुत समान विवरण देती हैं:

  • Boost.Statechart - मनमाने ढंग से जटिल परिमित राज्य मशीनों को आसानी से पठनीय और बनाए रखने योग्य C ++ कोड में लागू किया जा सकता है।
  • मेटा स्टेट मशीन - अभिव्यंजक UML2 परिमित राज्य मशीनों के लिए एक बहुत ही उच्च प्रदर्शन वाली लाइब्रेरी।

क्या आपको पता है कि दोनों के बीच चुनने के लिए मुख्य अंतर क्या हैं और विचार क्या हैं?


4
हे, बहुत सारे ब्याज का एक और मामला, लेकिन कोई भी जवाब नहीं जानता है ... :)
j_random_hacker

8
: D यह प्रश्न मेरे SO अनुभव का शिखर है! दोनों डेवलपर्स से जवाब मिल रहा है ... यह किसी भी बेहतर हो सकता है ?! क्रिस्टोफ और एंड्रियास को बहुत धन्यवाद।
फायरआफिस

बहुत बढ़िया सवाल और आप दो प्रतिस्पर्धी विकासशील लोगों के जवाब पाने में कामयाब रहे!
ऑफिरमो

3
Statechart आपको कंस्ट्रक्टर्स और डिस्ट्रक्टर्स में कार्यक्षमता प्रदान करता है। यह एक विरोधी पैटर्न है, विशेष रूप से विध्वंसक के साथ।
लेव

2
स्टेटचर्ट में, निकास क्रियाओं को एक अलग निकास () हैंडलर में रखा जा सकता है जिसे विनाश से पहले कहा जाता है। मुझे लगता है कि यह प्रावधान लेव का उल्लेख है कि विरोधी पैटर्न के साथ मुख्य समस्या को कम करता है।
टिम क्रू ने

जवाबों:


116

जैसा कि बहुत रुचि लगती है, कृपया मुझे अपनी (स्पष्ट रूप से पक्षपाती) राय देने की अनुमति दें, जिसे नमक के एक दाने के साथ लिया जाना चाहिए:

  • एमएसएम ज्यादा तेज है
  • MSM के लिए कोई RTTI या कुछ भी आभासी की आवश्यकता नहीं है
  • MSM के पास एक अधिक पूर्ण UML2 समर्थन है (उदाहरण के लिए आंतरिक संक्रमण, UML- अनुरूप ऑर्थोगोनल क्षेत्र)
  • MSM एक वर्णनात्मक भाषा (वास्तव में कई) प्रदान करता है। उदाहरण के लिए, eUML फ्रंट-एंड का उपयोग करके, एक संक्रमण को स्रोत + घटना [गार्ड] / क्रिया == लक्ष्य के रूप में वर्णित किया जा सकता है
  • MSM आपके कंपाइलर को बड़ी राजकीय मशीनों के लिए नुकसान पहुंचाएगा, इसलिए आपको हाल ही के कंपाइलर (g ++> = 4.x, VC> = 9) की आवश्यकता होगी

आप MSM की समीक्षा के दौरान पोस्ट की गई टिप्पणियों की तलाश करके अपने आप को एक बेहतर राय बना सकते हैं। डेवलपर विषय पर इस विषय पर बहुत चर्चा की गई।


2
आपका बहुत बहुत धन्यवाद। खुद डेवलपर की राय सुनकर खुशी हुई! अब हमें केवल एंड्रियास
हबेर

16
माइनर नाइट-पिक: रिलीज़ मोड में, C ++ RTTI (डायनामिक_कास्ट, टाइपिड) का उपयोग Boost.Statechart के साथ सख्ती से वैकल्पिक है।

111

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

Boost.Statechart के साथ आप अपने राज्य मशीन के लेआउट (यानी राज्यों, संक्रमण) को कई अनुवाद इकाइयों (सीपीपी फाइलों) पर उन तरीकों से फैला सकते हैं जो आप एमएसएम के साथ नहीं कर सकते हैं। यह आपको बड़े FSM के कार्यान्वयन को अधिक बनाए रखने की अनुमति देता है और MSM की तुलना में बहुत तेज़ संकलन प्राप्त करता है।

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

Boost.Statechart के साथ लागू एक मामूली जटिल FSM को मानते हुए, यहां कुछ बॉलपार्क नंबर दिए गए हैं:

  • अधिकांश वर्तमान पीसी हार्डवेयर आसानी से प्रति सेकंड 100'000 घटनाओं के साथ सामना करेंगे
  • यहां तक ​​कि बहुत संसाधन-विवश हार्डवेयर प्रति सेकंड कुछ सौ घटनाओं को संसाधित करने में सक्षम होंगे।

सीपीयू लोड के बारे में, यदि इन संख्याओं की तुलना में प्रोसेस करने की घटनाओं की संख्या बहुत कम है, तो MSM की तुलना में Boost.Statechart ओवरहेड लगभग निश्चित रूप से ध्यान देने योग्य नहीं होगा। यदि संख्या बहुत अधिक है, तो आप निश्चित रूप से MSM से बेहतर हैं।

प्रदर्शन / स्केलेबिलिटी ट्रेडऑफ़ के बारे में अधिक गहराई से जानकारी यहाँ मिल सकती है: http://www.boost.org/doc/libs/1_45_0/libs/statechart/doc/performance.html


9
हाय एंड्रियास, लेआउट के प्रसार के बारे में, कुछ सुधार हुए हैं। अब आप अलग-अलग कोर पर सबमशीन संकलित कर सकते हैं। यह सही नहीं है, लेकिन ध्यान देने योग्य सुधार है। Svn.boost.org/svn/boost/trunk/libs/msm/doc/HTML/…
Christophe Henry

11

अपने स्वयं के पीपीपी कार्यान्वयन को कोड करते समय मैंने तीन कारणों से स्टेटचर्ट का उपयोग किया: 1) स्टेटचर्ट सरल है और इसमें स्पष्ट दस्तावेज हैं; 2) मैं वास्तव में यूएमएल को नापसंद करता हूं :)

बूस्ट डॉक्स का कहना है कि एमएसएम कम से कम 20 गुना तेज है, लेकिन बड़े एफएसएम के लिए धीमी गति से संकलन करता है।


7
जब तक मैं मानता हूं कि यूएमएल का अधिकांश हिस्सा नए कपड़े हैं, राज्य चार्ट एक ऐसी चीज है जिसका वास्तव में यूएमएल में मूल्य है।
जॉन ट्रैंटवेविन

4
निश्चित रूप से, लेकिन मैंने असतत गणित से राज्यशासन सीखा, न कि सॉफ्टवेयर इंजीनियरिंग से। यह पत्ते एक निशान :)
जलते

4

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


1
अधिकांश राज्यचर्चा प्रकार थ्रेडिंग को संबोधित नहीं करते हैं। मल्टीथ्रेडिंग के संबंध में, आपको MSM समकक्ष की तरह बढ़ावा देने का उपयोग करने में सक्षम होना चाहिए :: Statechart :: state_machine। बढ़ावा देना :: स्टेटचर्ट :: एसिंक्रोनस_स्टैट_मैचिन और संबंधित प्रकार स्टेटचर्ट लाइब्रेरी का एक सख्ती से वैकल्पिक हिस्सा हैं।

2

चर्चा में टिम की देर से प्रविष्टि के जवाब में (जो लेव की बहुत प्रारंभिक टिप्पणियों में से एक को संबोधित करता है)।

उन लोगों में से एक जिन्होंने राज्यचर्चा में विध्वंसकों से बाहर निकलने के लिए तर्क दिया था (एक वास्तविक उपयोग मामले पर आधारित तर्क, वास्तविक दुनिया के साथ बातचीत के बारे में अर्थात I / O) जिस तरह से बूस्ट के लिए प्रस्तुत किया गया था, मैं मानता हूं कि बाहर निकलने में समस्याएँ हो सकती हैं। तबाही में तर्क। डेविड अब्राहम ने बिना किसी अपवाद के सुरक्षा के संबंध में अनिश्चित तर्क दिए। उन कारणों से Statechart को आपको विध्वंसक में तर्क रखने की आवश्यकता नहीं है - लेकिन यह आपको सामान्य सलाह के साथ - करने की अनुमति देता है।

लॉजिक जो कभी भी एक राज्य से बाहर एक संक्रमण के हिस्से के रूप में चलना चाहिए (एक पूरे के रूप में स्टेटचर्ट ऑब्जेक्ट का विनाश नहीं) (और अगर वहाँ भी संसाधन सफाई करना है) एक अलग निकास () कार्रवाई में अलग किया जाना चाहिए।

बिना सक्रिय राज्य (संसाधन) वाले "पतले" राज्य के लिए, प्रदर्शन करने के लिए केवल प्रवेश / निकास क्रियाएं, आप उन कार्यों को ctor और d'tor में कर सकते हैं और सुनिश्चित कर सकते हैं कि कंस्ट्रक्टर और विध्वंसक फेंक न दें। उनके लिए कोई कारण नहीं है - आरएआई पर प्रदर्शन करने के लिए कोई राज्य नहीं है - इन स्थानों में त्रुटि से निपटने में कोई बुराई नहीं है उपयुक्त घटनाओं। आपको अभी भी यह विचार करने की आवश्यकता हो सकती है कि क्या आप एग्जिट एक्शन चाहते हैं जो बाहरी राज्य को राज्य मशीन विनाश पर चलाने के लिए बदल दें ... और यदि आप उन्हें इस मामले में नहीं चाहते हैं तो एग्जिट एक्शन में डाल दें ...

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

यह सब अच्छी तरह से प्रलेखित है - मेरा सुझाव है कि आप डॉक्स पढ़ें और इसे आज़माएं। मेरा सुझाव है कि आप "वास्तविक दुनिया से बाहर निकलने की क्रिया" करने के लिए "सॉफ्टवेयर संसाधनों" और निकास क्रियाओं को साफ करने के लिए विनाशकों का उपयोग करें।

यह ध्यान देने योग्य है कि अपवाद प्रचार केवल राज्यचरों के लिए ही नहीं बल्कि सभी घटना संचालित परिवेशों में एक समस्या है। अपने स्टेटचेयर डिज़ाइन में दोष / त्रुटियों के बारे में तर्क करना और उन्हें शामिल करना सबसे अच्छा है और यदि आप केवल अपवाद मैपिंग का दूसरा तरीका नहीं अपना सकते हैं तो। कम से कम जो मेरे लिए काम करता है - ymmmv ...।


धन्यवाद, मैं देखता हूं कि मेरी सभी चिंताओं को बूस्ट :: स्टेटचर्ट ट्यूटोरियल के "अपवाद हैंडलिंग" भाग में पर्याप्त रूप से संबोधित किया गया है। उस स्थिति में, मुझे लगता है कि लेव की (भ्रामक) टिप्पणी को केवल उस ट्यूटोरियल के "दो-चरण से बाहर निकलने" अनुभाग को इंगित करके संबोधित किया जा सकता है। मैं अपने उत्तर को हटाने पर विचार करूंगा, सिवाय इसके कि आपका स्वयं का उत्तर इस विषय में बहुमूल्य जानकारी जोड़ता है।
टिम क्रूज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.