threads / patch / 37394

patchwalker: avoid quadratic list insertion in mark_complete

Subject: [PATCH] walker: avoid quadratic list insertion in mark_complete

## tl;dr

2 messages between Aug 21, 2014 and Aug 22, 2014. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

René Scharfe· Aug 21, 2014, 18:30 UTC · lore

Similar to 16445242 (fetch-pack: avoid quadratic list insertion in mark_complete), sort only after all refs are collected instead of while inserting. The result is the same, but it's more efficient that way. The difference will only be measurable in repositories with a large number of refs.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
 walker.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
Show changes to walker.c +4 −2
diff --git a/walker.c b/walker.c
index 0148264..0596e99 100644
--- a/walker.c
+++ b/walker.c
@@ -205,7 +205,7 @@ static int mark_complete(const char *path, const unsigned char *sha1, int flag,
 	struct commit *commit = lookup_commit_reference_gently(sha1, 1);
 	if (commit) {
 		commit->object.flags |= COMPLETE;
-		commit_list_insert_by_date(commit, &complete);
+		commit_list_insert(commit, &complete);
 	}
 	return 0;
 }
@@ -271,8 +271,10 @@ int walker_fetch(struct walker *walker, int targets, char **target,
 		}
 	}
 
-	if (!walker->get_recover)
+	if (!walker->get_recover) {
 		for_each_ref(mark_complete, NULL);
+		commit_list_sort_by_date(&complete);
+	}
 
 	for (i = 0; i < targets; i++) {
 		if (interpret_target(walker, target[i], &sha1[20 * i])) {
-- 
2.1.0
Jeff King· Aug 22, 2014, 04:01 UTC · re: René Scharfe · lore

Re: [PATCH] walker: avoid quadratic list insertion in mark_complete

On Thu, Aug 21, 2014 at 08:30:24PM +0200, René Scharfe wrote:
Show 5 quoted lines
> Similar to 16445242 (fetch-pack: avoid quadratic list insertion in
> mark_complete), sort only after all refs are collected instead of while
> inserting.  The result is the same, but it's more efficient that way.
> The difference will only be measurable in repositories with a large
> number of refs.
Thanks, this looks obviously correct.
I wonder if we should do this on top:
Show changes to walker.c +1 −2
diff --git a/walker.c b/walker.c
index 0148264..70088b8 100644
--- a/walker.c
+++ b/walker.c
@@ -203,7 +203,7 @@ static int interpret_target(struct walker *walker, char *target, unsigned char *
 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
 {
 	struct commit *commit = lookup_commit_reference_gently(sha1, 1);
-	if (commit) {
+	if (commit && !(commit->object.flags & COMPLETE)) {
 		commit->object.flags |= COMPLETE;
 		commit_list_insert_by_date(commit, &complete);
 	}

It's not as big a deal with your patch since you've made it O(n log n),
but reducing n further does not hurt.

-Peff

← back to recent threads