[msm] state machine construction / destruction

MSM enthusiasts, I have done a performance profiling with a simple parser with 3 implementations, plain C++, SMC and Boost MSM. I was happy to learn that the MSM implementation was very efficient. I'm having some questions about MSM space allocation, please let me know if my understanding of things are wrong (very likely). I work in a high performance computing environment so I will try to minimize unnecessary object constructions. Is it possible for the data in the state machine backend live somewhere else external to the state machine? If that's possible then I can put the state machine's internal states close to the data that needs to be manipulated and the state machine itself is data-less and I can have a single copy of the state machine and each data item carries everything. I know this breaks encapsulation but I'm just wondering. The state machine has a events queue (std::deque?), can I choose to not have this and other data structures I don't think I will need? Thanks, -jh

Hi,
MSM enthusiasts,
I have done a performance profiling with a simple parser with 3 implementations, plain C++, SMC and Boost MSM. I was happy to learn that the MSM implementation was very efficient.
:)
I'm having some questions about MSM space allocation, please let me know if my understanding of things are wrong (very likely).
I work in a high performance computing environment so I will try to minimize unnecessary object constructions.
Is it possible for the data in the state machine backend live somewhere else external to the state machine? If that's possible then I can put the state machine's internal states close to the data that needs to be manipulated and the state machine itself is data-less and I can have a single copy of the state machine and each data item carries everything. I know this breaks encapsulation but I'm just wondering.
No, all the states are constructed at the same time (fsm creation) and live together in a fusion set. I'm thinking about allowing different construction schemes but it's not going to be in the short-term. You can of course have in the states a pointer to the data but it's probably not what you're looking for. Sorry, at the moment it's not doable.
The state machine has a events queue (std::deque?), can I choose to not have this and other data structures I don't think I will need?
You can do 2 things: - replace the queue by something more efficient (like a boost::circular_buffer) if you need the queue but are stuck with a bad deque implementation (http://www.boost.org/doc/libs/1_47_0/libs/msm/doc/HTML/ch03s05.html#d0e2678) - remove the queue if you don't need it (meaning no posting of events during transition processing, no exit pseudo-states). To do this, provide a no_message_queue typedef. See: http://www.boost.org/doc/libs/1_47_0/libs/msm/doc/HTML/ch03s02.html#d0e1197. If you didn't use this yet, you might still not be getting the best speed out of msm. Providing also no_exception_thrown will get you a tick more speed. Please let me know whether the performance inproves (with compiler / target system if possible), I'm very interested in msm performance.
Thanks, -jh
HTH, Christophe
participants (2)
-
Christophe Henry
-
Jinsong Huang