[Ltrace-devel] [RFC 1/5] vect: Fix vect_reserve for large count

Edgar E. Iglesias edgar.iglesias at gmail.com
Mon Oct 8 08:52:39 UTC 2012


On Fri, Oct 05, 2012 at 06:38:17PM +0200, Petr Machata wrote:
> edgar.iglesias at gmail.com writes:
> 
> >  vect_reserve(struct vect *vec, size_t count)
> >  {
> >  	if (count > vec->allocated) {
> > -		size_t na = vec->allocated != 0 ? 2 * vec->allocated : 4;
> > +		/* Allocate 4 extra slots for growth.  */
> > +		size_t na = count + 4;
> >  		void *n = realloc(vec->data, na * vec->elt_size);
> >  		if (n == NULL)
> >  			return -1;
> 
> That changes performance characteristics of vect_pushback from O(1) to
> O(n).  What problem are you seeing that is fixed by this?
> 
> If we are that memory-tight, perhaps we could have a call like
> vect_done, which would allocate a new buffer with exact number of slots,
> copy stuff there, and release the old buffer (or keep it around for next
> vect_init?).  Or there could be a separate ctor taking slot count as an
> argument, which we would use to pre-allocate things like value arrays,
> where we have a guess on the number of elements.  It depends on what
> problem you are trying to solve.

Hi,

I traced a few large binaries and the largest count I've seen so far
is 6. Im mostly concerned with fixing the the bug when count ends up
beeing smaller than vec->allocated. If we change the base from 4 to
8, we'd probably not use the reallocation path very often.

Feel free to drop my patch and just edit in whatever fix you prefer.

Cheers



More information about the Ltrace-devel mailing list