Boost Statechart vs. Meta State Machine
contient apparemment deux bibliothèques distinctes pour les machines d'état: Statechart et Meta State Machine (MSM). Les taglines donnent des descriptions très similaires:
- coup de pouce.Statechart - des machines d'états finis complexes peuvent être implémentées dans du code C++ facilement lisible et maintenable.
- Méta-État de la Machine - Une très haute performance de la bibliothèque expressives UML2 finis les machines d'état.
savez-vous quelles sont les principales différences et quelles sont les considérations à choisir entre les deux?
5 réponses
comme il semble y avoir beaucoup d'intérêt, permettez-moi de donner mon opinion (évidemment biaisée), qui devrait donc être prise avec un grain de sel:
- MSM est beaucoup plus rapide
- MSM ne nécessite pas de RTTI ou quoi que ce soit de virtuel
- MSM a un support UML2 plus complet (par exemple transitions internes, régions orthogonales conformes à UML)
- MSM offre un langage descriptif (en fait plusieurs). Pour exemple, en utilisant le front-end de l'eUML, une transition peut être décrite comme Source + Event [Guard] / Action = = Target
- MSM va faire souffrir votre compilateur pour les plus grosses machines d'état, donc vous aurez besoin d'un compilateur assez récent (g++ >= 4.x, VC >= 9)
Vous pouvez vous faire une meilleure opinion par la recherche de commentaires affichés lors de l'examen de MSM. Ce sujet a fait l'objet de nombreuses discussions sur la liste des développeurs.
Comme Christophe l'a déjà mentionné, l'une des principales différences entre les deux bibliothèques est les performances d'exécution. Alors que MSM offre probablement le meilleur que vous pouvez obtenir ici, Statechart échange consciemment la mémoire et les cycles de processeur vers une meilleure évolutivité.
Avec Boost.Statechart vous pouvez étendre la mise en page (c.-à-d. les États, les transitions) de votre machine d'état sur plusieurs unités de traduction (fichiers cpp) de façons que vous ne pouvez pas avec MSM. Ce vous permet de faire la mise en œuvre de grands FSMs plus maintenable et obtenir la compilation beaucoup plus rapide qu'avec MSM.
si oui ou non la performance overhead de Statechart par rapport à MSM sera réellement significative pour votre application est souvent assez facile à répondre quand vous vous demandez combien d'Événements votre application devra traiter par seconde.
en supposant un FSM modérément complexe mis en œuvre avec Boost.Statechart, voici quelques ballpark numéros:
- la plupart du matériel PC actuel sera facilement faire face à >100'000 événements par seconde
- Even very le matériel aux ressources limitées sera capable de traiter quelques centaines d'événements par seconde.
en ce qui concerne la charge CPU, si le nombre d'événements à traiter est beaucoup plus faible que ces chiffres, Boost.Les frais généraux de Statechart par rapport aux HARSAH ne seront presque certainement pas perceptibles. Si l' le nombre est beaucoup plus élevé, vous êtes certainement mieux avec MSM.
des informations plus détaillées sur les compromis performance/évolutivité peuvent être trouvées ici: http://www.boost.org/doc/libs/1_45_0/libs/statechart/doc/performance.html
tout en codant ma propre mise en œuvre PPP j'ai utilisé Statechart pour trois raisons: 1) Statechart est plus simple et a une documentation plus claire; 2) Je n'aime vraiment pas UML:)
Boost docs disent MSM est au moins 20 fois plus rapide, mais compiles assez lent pour les grands FSM.
il y a quelque temps J'ai commencé avec Statechart et j'ai déménagé à MSM parce que c'était plus facile à utiliser en conjonction avec asio à partir d'un seul fil. Je n'ai pas réussi à associer Statechart et ses capacités de multithreading avec mon utilisation d'asio - il était probablement une sorte de newbie incompréhension de Statechart de ma part. J'ai découvert que le MSM était plus facile à utiliser car il ne s'adressait pas à la lecture multiple.
En réponse à Tim entrée tardive à la discussion (qui traite aussi l'un des premiers commentaires de la Lev).
comme l'un de ceux qui ont plaidé pour la séparation de sortie des destructeurs dans statechart (argument basé sur un cas d'utilisation réelle, à propos de l'interaction avec le monde réel i.e. I/O) chemin du retour quand il a été soumis à Boost, je suis d'accord qu'il peut y avoir des problèmes à mettre la logique de sortie dans les destructeurs. David Abrahams a sans surprise fait des arguments convaincants concernant l'exception la sécurité aussi bien. Pour ces raisons, Statechart ne vous demande pas de mettre de la logique dans les destructeurs - mais il vous permet de le faire - avec les conseils habituels.
logique qui ne devrait jamais s'exécuter que dans le cadre d'une transition hors d'un état (et non la destruction de l'objet statechart dans son ensemble) peut (et devrait s'il y a aussi un nettoyage de ressources à faire) être séparée en une action de sortie() séparée.
pour un État "mince" sans état actif (ressources), seulement les actions d'entrée/sortie pour effectuer, vous pouvez effectuer ces actions dans ctor et d'Tor et assurez-vous que le constructeur et le destructeur ne lancent pas. Il n'y a aucune raison pour eux de - il n'y a pas d'État pour exécuter la Rai I on - il n'y a aucun mal à ce que la manipulation des erreurs dans ces endroits soulèvent des événements appropriés. Vous pouvez encore avoir besoin de considérer si vous voulez des actions de sortie qui modifient l'état extérieur pour fonctionner sur la destruction de machine d'état cependant... et mettez-les en action de sortie si vous ne voulez pas qu'ils se produisent dans ce cas...
Statechart modèles d'activation, comme l'instanciation d'un objet, donc si votre constructeur a un réel travail/activation/instanciation à faire et si il est capable d'échouer, tels que l'état ne peut pas être entré Statechart soutient qu'en vous donnant la possibilité de mapper une exception pour un événement. Ceci est traité d'une manière qui fonctionne dans la hiérarchie des États à la recherche d'un état externe qui gère l'événement d'exception, analogue à la façon dont la pile se serait déroulée pour une invocation basée sur une pile d'appels modèle.
tout cela est bien documenté - je vous suggère de lire les documents et de l'essayer. Je suggère que vous utilisiez des destructeurs pour nettoyer des "ressources logicielles" et des actions de sortie pour effectuer des "actions de sortie dans le monde réel".
il est intéressant de noter que la propagation d'exception est un peu un problème dans tous les environnements event driven, pas seulement statecharts. Il est préférable de raisonner et d'inclure les défauts / erreurs dans votre conception de statechart et si et seulement si vous ne pouvez pas gérer ils une autre voie recourent à la cartographie d'exception. Au moins ça marche pour moi - ymmmv....