Boost logo

Boost Users :

Subject: Re: [Boost-users] [msm] Why does it take so many bytes to represent a state machine?
From: 谢任中 (joshchia_at_[hidden])
Date: 2012-11-13 16:13:13


Thanks for the quick response and thanks for making this handy library.

I turned off message queueing (typedef int no_message_queue) and I'm down
to 20 bytes, much better, though still with some unaccounted bytes. I'm
looking for a better way.

I don't use any attributes, except for event attributes, or submachines. I
also don't care about event/state history. This means the only
state-related info is the state ID. What about just reading and storing the
state ID, and using the stored ID to restore the state next time I need to
process an event? I know how to get state ID (current_state()), but how do
I set state from ID?

Josh

On Tue, Nov 13, 2012 at 3:52 PM, Christophe Henry <
christophe.j.henry_at_[hidden]> wrote:

> **
>
> *>*Hi,
>
> >
> >I'm using msm to store the state of many small objects. Each one is
> around 24 bytes on its own. However, I just found out
>
> >from experimentation that a MSM state machine takes many bytes to store.
> For the following program, the print out is:
>
> >entering: State1
>
> >104
>
> >48
>
> >This indicates that the very simple one-state, no-transition, machine is
> 104 bytes, and takes 48 bytes even to serialized.
>
> >The front::state_machine_def, however, is only 1 byte, though I suspect
> thet real state is stored only
>
> >in the 104-byte back::state_machine.
>
> Hi Josh,
>
> It depends on several factors:
>
> - MSM creates all the states at state machine creation and the states live
> until the state machine is destroyed, so even if the states have no data,
> it'll be a byte per state.
>
> - you need to keep the id of the current state in each region (int)
>
> - 2 bool for internal implementation details
>
> - a queue for deferred events if you have some in your fsm (if none, MSM
> will deactivate this, but you'll still pay 1 byte).
>
> - an event queue (enabled by default but you can deactivate it if not
> needed (see
> http://svn.boost.org/svn/boost/trunk/libs/msm/doc/HTML/ch03s02.html#d0e1139)
> but it will still cost 1 byte.
> Both queues are per default a std::deque, which can be expensive on some
> systems. You can choose another container if you wish (see
> http://svn.boost.org/svn/boost/trunk/libs/msm/doc/HTML/ch03s05.html#d0e2680
> ).
>
> As you see, if you remove the queues, there is not much more to take away.
>
> Also note that a text archive brings its own costs.
>
> HTH,
>
> Christophe
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net