From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Markus Trippelsdorf <markus@trippelsdorf.de>, git@vger.kernel.org
Subject: Re: git pull takes ~8 seconds on up-to-date Linux git tree
Date: Fri, 5 Oct 2012 19:21:08 -0400 [thread overview]
Message-ID: <20121005232108.GA7996@sigill.intra.peff.net> (raw)
In-Reply-To: <7vehlcu091.fsf@alter.siamese.dyndns.org>
On Fri, Oct 05, 2012 at 01:34:02PM -0700, Junio C Hamano wrote:
> OK, I think I am convinced myself that this patch is the right fix.
>
> The performance regression Markus saw is in fmt-merge-message, and
> it is caused by the updated remove_redundant() that is used by
> get_merge_bases_many() and reduce_heads(). On the topic branch, all
> callers of reduce_heads() were passing commits that are already
> parsed, but before the topic was merged to 'master', we added one
> more caller to reduce_heads() on the 'master' front that passed an
> unparsed commit, which is why the problem surfaced at that merge.
Thanks for tracking it down. That makes a lot of sense with the results
we are seeing.
> It might make sense to assert or die in commit_list_insert_by_date()
> when a caller mistakenly pass an unparsed commit object to prevent
> this kind of breakages in the future.
I wonder if it would be too much to just have commit_list_insert_by_date
call parse_commit. It is, after all, the exact moment when we need to
have the date valid (and by waiting until the last minute, we can
potentially avoid parses that would not otherwise need to happen). The
overhead in the common case should basically be the same as an assert:
checking that commit->object.parsed is true (we can always inline that
bit of parse_commit if we have to).
Of course, in this case it is not just commit_list_insert_by_date that
cares. paint_down_to_common also want commit->parents to be valid; I'm
surprised that dealing with unparsed commits did not also reveal an
error there.
In an object-oriented world, we would always get the attributes of a
commit through accessors that made sure the object was parsed. That
would be nicer, but it would also mean paying for the "if (parsed)"
conditional a lot more frequently.
> > @@ -617,6 +618,8 @@ static struct commit_list *paint_down_to_common(struct commit *one, int n, struc
> >
> > one->object.flags |= PARENT1;
> > commit_list_insert_by_date(one, &list);
> > + if (!n)
> > + return list;
> > for (i = 0; i < n; i++) {
> > twos[i]->object.flags |= PARENT2;
> > commit_list_insert_by_date(twos[i], &list);
This seems like an obvious optimization, but does it really have
anything to do with the patch at hand?
-Peff
next prev parent reply other threads:[~2012-10-05 23:21 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-04 14:14 git pull takes ~8 seconds on up-to-date Linux git tree Markus Trippelsdorf
2012-10-04 18:43 ` Jeff King
2012-10-04 19:26 ` Markus Trippelsdorf
2012-10-04 19:36 ` Junio C Hamano
2012-10-04 20:03 ` Junio C Hamano
2012-10-04 20:44 ` Junio C Hamano
2012-10-04 21:16 ` Junio C Hamano
2012-10-04 21:28 ` Junio C Hamano
2012-10-04 22:37 ` Junio C Hamano
2012-10-05 20:34 ` Junio C Hamano
2012-10-05 23:21 ` Jeff King [this message]
2012-10-06 5:20 ` Junio C Hamano
2012-10-06 12:57 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121005232108.GA7996@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=markus@trippelsdorf.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).