Jeff King <p...@peff.net> writes:

> +static inline int *slab_at(struct commit_slab *s, const struct commit *c)
> +{
> +     if (s->alloc <= c->index) {
> +             int new_alloc = alloc_nr(s->alloc);
> +             if (new_alloc <= c->index)
> +                     new_alloc = c->index + 1;
> +
> +             s->buf = xrealloc(s->buf, new_alloc * sizeof(*s->buf));
> +             memset(s->buf + s->alloc, 0, new_alloc - s->alloc);
> +             s->alloc = new_alloc;
> +     }
> +     return s->buf + c->index;
> +}

This will hurt more as the number of objects we deal with grows (our
ALLOC_GROW() shares the same).

I wonder if it might be a good idea to do

        struct commit_slab {
                int piece_size;
                int piece_count;
                struct commit_slab_piece {
                        int *buf;
                } *piece;
        };

and then make the look-up logic like this:

        int nth_piece, nth_slot;

        nth_piece = c->index / s->piece_size;
        nth_slot = c->index % s->piece_size;
        if (s->piece_count <= nth_piece) {
                /* xrealloc s->piece to grow, update s->piece_count */
        }
        if (!s->piece[nth_piece]) {
                /* xcalloc s->piece[nth_piece] to allocate */
        }
        return s->piece[nth_piece]->buf + nth_slot;

Other than that, looks like a good technology demonstration.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to