fetch-pack: avoid quadratic list insertion in mark_complete
commit16445242edd7e90dc564b657043d2a5efca68cb0
authorJeff King <peff@peff.net>
Tue, 2 Jul 2013 06:16:23 +0000 (2 02:16 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 2 Jul 2013 19:03:34 +0000 (2 12:03 -0700)
tree09c8c2ffe659d4c0776891fb2938b48f6982160d
parent534f0e0996c0a5a0bea5bae8ae088a80a929932b
fetch-pack: avoid quadratic list insertion in mark_complete

We insert the commit pointed to by each ref one-by-one into
the "complete" commit_list using insert_by_date. Because
each insertion is O(n), we end up with O(n^2) behavior.

This typically doesn't matter, because the number of refs is
reasonably small. And even if there are a lot of refs, they
often point to a smaller set of objects (in which case the
optimization in commit ea5f220 keeps our "n" small).

However, in pathological repositories (hundreds of thousands
of refs, each pointing to a unique commit), this quadratic
behavior can make a difference. Since we do not care about
the list order until we have finished building it, we can
simply keep it unsorted during the insertion phase, then
sort it afterwards.

On a repository like the one described above, this dropped
the time to do a no-op fetch from 2.0s to 1.7s. On normal
repositories, it probably does not matter at all, but it
does not hurt to protect ourselves from pathological cases.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
fetch-pack.c