Boost logo

Boost Users :

Subject: Re: [Boost-users] [Multi-index container] Why insertions into my Multi-index container are so slow?
From: Angel Sunye (angelsunye_at_[hidden])
Date: 2008-09-04 11:19:02


>
>
> I don't see anything strange with your definitions... In order to try to
> elucidate what's
> going on, I'd need some more information:
>
> * Are you using the safe mode and/or the invariant-checking mode described
> at
> http://www.boost.org/libs/multi_index/doc/tutorial/debug.html ?

Perfect!!!... Just I had

#if !defined(NDEBUG)
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE
#endif

and I haven't defined NDEBUG!!!

Now, time is much better than before, but still continues slow than
manually.

> * You say you're comparing against manual management: can you please
> explain
> what this manual management consists in?

I wanted to refer manual management as without using multi-index library.
The code I used is as follows:

-----------------BEGIN CODE-----------------
// Record definition
struct TProcessRec {
   std::string text;
   u32 inputTimestamp;

   // Constructors...
};

enum PRIORITY_LEVEL
{
  PRIORITY_NULL,
  PRIORITY_LOW,
  PRIORITY_DEFAULT,
  PRIORITY_HIGH,
  PRIORITY_EXPRESS
};

// Key definition
struct QueueMsgKey {
  std::string msg_key;
  PRIORITY_LEVEL priority;
  // Constructors....
};

struct QueueMsgKeyLess {
    bool operator()(const QueueMsgKey k1, const QueueMsgKey k2) const
    { return k1.priority!=k2.priority ? k1.priority>k2.priority :
k1.msg_key<k2.msg_key; }
};

struct MsgKeyLess {
    bool operator()(const std::string k1, const std::string k2) const
    { return k1<k2; }
};

// Container types definition
typedef std::map< QueueMsgKey, TProcessRec*, QueueMsgKeyLess > :: iterator
TProcessListIterator;
typedef std::map< std::string, TProcessListIterator, MsgKeyLess > ::
iterator TRefListIterator;

// Class definition
class TOutProcessList
{
  private:
    TInProcessList process_list;
    TRefList ref_list;

  public:
    bool insert(const QueueMsgKey &qmsg_key, TProcessRec* const data)
    {
      TRefListIterator itr = ref_list.find( qmsg_key.msg_key );
      if ( itr == ref_list.end() ) {
        std::pair< TProcessListIterator, bool > result =
 process_list.insert( std::make_pair( qmsg_key, data) );
        if(result.second == true) {
          ref_list[qmsg_key.msg_key] = result.first;
          return true;
        }
        else return false;
      }
      return false;
    };
};

// Testing manual form...
TOutProcessList elContainer;
for ( int i=0; i<10000; i++ ) {
  QueueMsgKey key( "A0000" + boost::lexical_cast<std::string>( i ) );
  elContainer.insert( key, new( "...", time(NULL) ));
}
// Here prints total time 1

// Testing with Multi-index library
TElementsMIContainer elMIContainer;
for ( int i=0; i<10000; i++ ) {
  elMIContainer.insert( elMIContainer.template get<TMainIndexTag>().end(),
      TElementRec( priority, key, content, inputTimestamp, 0 ));
}
// Here prints total time 2

RESULT: time 2 > time 1

-----------------END CODE-----------------

>
> * Are you building in release or debug mode? Any difference if you change
> this?

No. And I use the same program for comparing both forms (insertions with
Multi-index and without).

> * What's your environment (compiler, OS)?

 I'm using g++ 4.3.0 with Boost library 1.35.0 in Linux

> * Are you able to isolate this odd behavior in a complete program that you
> can send
> to me so that I can reproduce the problem locally?
>

Copied before

Thanks a lot for your time

Angel Suñe Marti



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