[ROOT] Performance of Streamers -- code generated for STL vectors.

From: Walter F.J. Mueller (w.f.j.mueller@gsi.de)
Date: Thu Nov 29 2001 - 23:39:15 MET


Hi ROOTers,

Currently (ROOT 3.02/03) the read part of an automatically generated 
streamer contains for reading of a STL vector code like

    fCoeff.clear();
    int R__i, R__n;
    R__b >> R__n;
    for (R__i = 0; R__i < R__n; R__i++) {
      double R__t;
      R__b >> R__t;
      fCoeff.push_back(R__t);
    }

This works, but can cause an unnecessary amount of reallocations of the
vector. Since the number of elements to be inserted is known up front
this can be avoided by requesting enough capacity before the elements 
are inserted by calling the reserve() method ahead of time, like in

    fCoeff.clear();
    int R__i, R__n;
    R__b >> R__n;
    fCoeff.reserve(R__n);
    for (R__i = 0; R__i < R__n; R__i++) {
    ... as before ...

This ensures that at most one reallocation is done when a vector is read.
Only vectors and strings provide capacity management, so in practice this
is only relevant for STL vectors and can't be applied to deque's ect.

It be nice if rootcint would generate code like this. I haven't checked
what the StreamerInfo based I/O does, but also there this might help.

		 Cheers, Walter

--
Walter F.J. Mueller   Mail:  W.F.J.Mueller@gsi.de
GSI,  Abteilung KP3   Phone: +49-6159-71-2766
D-64291 Darmstadt     FAX:   +49-6159-71-2989
WWW:   http://www-kp3.gsi.de/www/kp3/people/mueller.html
PGP:   http://www-kp3.gsi.de/~mueller/pgp.shtml



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:10 MET