prio-queue: make output stable with respect to insertion
authorJeff King <peff@peff.net>
Mon, 14 Jul 2014 05:51:59 +0000 (01:51 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 15 Jul 2014 18:02:54 +0000 (11:02 -0700)
commite8f91e3df82a33b7e0b59c935cc4af892068baa2
tree04b0e1db2529fb471f5e51822d348b526d757664
parent6d63baa47883315033474fc06196330e3a5ca4e0
prio-queue: make output stable with respect to insertion

If two items are added to a prio_queue and compare equal,
they currently come out in an apparently random order (this
order is deterministic for a particular sequence of
insertions and removals, but does not necessarily match the
insertion order). This makes it unlike using a date-ordered
commit_list, which is one of the main types we would like to
replace with it (because prio_queue does not suffer from
O(n) insertions).

We can make the priority queue stable by keeping an
insertion counter for each element, and using it to break
ties. This does increase the memory usage of the structure
(one int per element), but in practice it does not seem to
affect runtime. A best-of-five "git rev-list --topo-order"
on linux.git showed less than 1% difference (well within the
run-to-run noise).

In an ideal world, we would offer both stable and unstable
priority queues (the latter to try to maximize performance).
However, given the lack of a measurable performance
difference, it is not worth the extra code.

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