Skip to content

Commit 43f70ea

Browse files
pks-tgitster
authored andcommitted
refs/reftable: precompute prefix length
We're recomputing the prefix length on every iteration of the ref iterator. Precompute it for another speedup when iterating over 1 million refs: Benchmark 1: show-ref: single matching ref (revision = HEAD~) Time (mean ± σ): 100.3 ms ± 3.7 ms [User: 97.3 ms, System: 2.8 ms] Range (min … max): 97.5 ms … 139.7 ms 1000 runs Benchmark 2: show-ref: single matching ref (revision = HEAD) Time (mean ± σ): 95.8 ms ± 3.4 ms [User: 92.9 ms, System: 2.8 ms] Range (min … max): 93.0 ms … 121.9 ms 1000 runs Summary show-ref: single matching ref (revision = HEAD) ran 1.05 ± 0.05 times faster than show-ref: single matching ref (revision = HEAD~) Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent f1bf54a commit 43f70ea

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

refs/reftable-backend.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ struct reftable_ref_iterator {
346346
struct object_id oid;
347347

348348
const char *prefix;
349+
size_t prefix_len;
349350
unsigned int flags;
350351
int err;
351352
};
@@ -371,8 +372,8 @@ static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator)
371372
if (!starts_with(iter->ref.refname, "refs/"))
372373
continue;
373374

374-
if (iter->prefix &&
375-
strncmp(iter->prefix, iter->ref.refname, strlen(iter->prefix))) {
375+
if (iter->prefix_len &&
376+
strncmp(iter->prefix, iter->ref.refname, iter->prefix_len)) {
376377
iter->err = 1;
377378
break;
378379
}
@@ -481,6 +482,7 @@ static struct reftable_ref_iterator *ref_iterator_for_stack(struct reftable_ref_
481482
iter = xcalloc(1, sizeof(*iter));
482483
base_ref_iterator_init(&iter->base, &reftable_ref_iterator_vtable, 1);
483484
iter->prefix = prefix;
485+
iter->prefix_len = prefix ? strlen(prefix) : 0;
484486
iter->base.oid = &iter->oid;
485487
iter->flags = flags;
486488
iter->refs = refs;

0 commit comments

Comments
 (0)