Jeff King <peff@xxxxxxxx> writes: > This tradeoff probably makes sense in the context of > pack-objects, where we have set revs->edge_hint to have the > traversal feed us the set of boundary objects. For a > regular rev-list, though, it is probably not a good > tradeoff. It is true that it makes our list slightly closer > to a true set difference, but it is a rare case where this > is important. And because we do not have revs->edge_hint > set, we do nothing useful with the larger set of boundary > objects. > > This patch therefore ties the extra tree examination to the > revs->edge_hint flag; it is the presence of that flag that > makes the tradeoff worthwhile. Makes sense. Thanks. Will queue. > > Here is output from the p0001-rev-list showing the > improvement in performance: > > Test HEAD^ HEAD > ----------------------------------------------------------------------------------------- > 0001.1: rev-list --all 0.69(0.65+0.02) 0.69(0.66+0.02) +0.0% > 0001.2: rev-list --all --objects 3.22(3.19+0.03) 3.23(3.20+0.03) +0.3% > 0001.4: rev-list $commit --not --all 0.04(0.04+0.00) 0.04(0.04+0.00) +0.0% > 0001.5: rev-list --objects $commit --not --all 0.27(0.26+0.01) 0.04(0.04+0.00) -85.2% > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > list-objects.c | 20 +++++++++++--------- > 1 file changed, 11 insertions(+), 9 deletions(-) > > diff --git a/list-objects.c b/list-objects.c > index 6cbedf0..206816f 100644 > --- a/list-objects.c > +++ b/list-objects.c > @@ -162,15 +162,17 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge) > } > mark_edge_parents_uninteresting(commit, revs, show_edge); > } > - for (i = 0; i < revs->cmdline.nr; i++) { > - struct object *obj = revs->cmdline.rev[i].item; > - struct commit *commit = (struct commit *)obj; > - if (obj->type != OBJ_COMMIT || !(obj->flags & UNINTERESTING)) > - continue; > - mark_tree_uninteresting(commit->tree); > - if (revs->edge_hint && !(obj->flags & SHOWN)) { > - obj->flags |= SHOWN; > - show_edge(commit); > + if (revs->edge_hint) { > + for (i = 0; i < revs->cmdline.nr; i++) { > + struct object *obj = revs->cmdline.rev[i].item; > + struct commit *commit = (struct commit *)obj; > + if (obj->type != OBJ_COMMIT || !(obj->flags & UNINTERESTING)) > + continue; > + mark_tree_uninteresting(commit->tree); > + if (!(obj->flags & SHOWN)) { > + obj->flags |= SHOWN; > + show_edge(commit); > + } > } > } > } -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html