Hi Walter and Rene, Instead of the for() loop for reading/writing the std::vector, I've been using ReadFastArray/WriteFastArray, like so: if (R__b.IsReading()) { int n; R__b >> n; fCoeff.resize(n); R__b.ReadFastArray(&fCoeff[0],n); } else { R__b.WriteVersion(MyClass::IsA()); R__b << fCoeff.size(); R__b.WriteFastArray(&fCoeff[0],fCoeff.size()); } I'm pretty sure that this is ok since I believe that std::vectors are supposed to be contiguous in memory from beginning to end. At least this is working for us at CDF with ROOT v3.01/06a, KCC v4.0f or gcc v3. And we've always had great success speeding up streamers with Read/WriteFastArray. Cheers, Aaron. Rene Brun wrote: > Hi Walter, > > I have implemented your suggestion in rootcint. Now in CVS. > > > Walter F.J. Mueller wrote: > > > > 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 > >
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:10 MET