Boost logo

Boost Users :

Subject: Re: [Boost-users] finite state machine performance info
From: Conoscenza Silente (abruzzoforteegentile_at_[hidden])
Date: 2009-11-26 11:18:37


Whell I did a small test application to test the usage of
boost::pool_allocator and boost::fast_pool_allocator. My application will
possibly do a lot of transition from a state to another.
I found that it is better to use state chart classes without allocator.
In the code below tese are the results:

   - Without allocator 5.7 sec
   - with boost::pool_allocator 10.7 sec
   - with boost::fast_pool_allocator 8.7 sec

Next action could be

   - test with another allocator
   - try the asynchronous version

Any suggestion?

#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/event.hpp>
#include <boost/statechart/transition.hpp>
#include <boost/timer.hpp>
#include <boost/progress.hpp>
#include <boost/pool/pool_alloc.hpp>

using namespace boost::statechart;

struct state_1;
struct state_2;
struct state_3;
struct state_4;

   struct main_machine :
   state_machine<
       main_machine,
       state_1

       // without allocator I have 5.6 seconds (used also in events)

       //,boost::pool_allocator< main_machine > // with this
       // allocator I go to 10 sec used also in events

       //,boost::fast_pool_allocator< main_machine > // with this
       //allocator I go to 8.7 sec

> {};

   struct event_1_2 : event< event_1_2
   //, boost::fast_pool_allocator< event_1_2 >
>{};
   struct event_2_3 : event< event_2_3
   //, boost::fast_pool_allocator< event_2_3 >
>{};
   struct event_3_4 : event< event_3_4
   //, boost::fast_pool_allocator< event_3_4 >
>{};
   struct event_4_1 : event< event_4_1
   //, boost::fast_pool_allocator< event_4_1 >
>{};

   struct state_1
   : simple_state< state_1, main_machine >
   {
       typedef transition< event_1_2, state_2 > reactions;
   };

   struct state_2
   : simple_state< state_2, main_machine >
   {
       typedef transition< event_2_3, state_3 > reactions;
   };

   struct state_3
   : simple_state< state_3, main_machine >
   {
       //typedef transition< event_3_4, state_4 > arc; // it doesn't work
       typedef transition< event_3_4, state_4 > reactions;

       //state_3(){std::cout<<"3";}
       //~state_3(){std::cout<<"~3";}
   };

   struct state_4
   : simple_state< state_4, main_machine >
   {
       typedef transition< event_4_1, state_1 > reactions;
   };

void main(){
      main_machine fsm;
       fsm.initiate();
       {
           boost::progress_timer t; // count the time elapsed
           // before distruction: not very precise
           // for expected big differences

           for( int i = 0; i < 1000000; i ++ ){

               fsm.process_event( event_1_2() );
               fsm.process_event( event_2_3() );
               fsm.process_event( event_3_4() );
               fsm.process_event( event_4_1() );
           }
       }
}

On Thu, Nov 26, 2009 at 4:57 PM, Eric J. Holtman <eric_at_[hidden]> wrote:
> Conoscenza Silente wrote:
>>
>> I would like to fasten up the whole process; let's say that I would
>> like to avoid the creation/destruction of the class each time using
>> object already allocated in memory that are deleted only at the exit
>> of the application.
>> Is this a good way in your opinion ?
>>
>>
>
> So when you profile your entire application, how much
> time is being spent in boost's state library?
> _______________________________________________
> 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