Skip to content

Commit a4b6d20

Browse files
derrickstoleegitster
authored andcommitted
cache-tree: speed up consecutive path comparisons
The previous change reduced time spent in strlen() while comparing consecutive paths in verify_cache(), but we can do better. The conditional checks the existence of a directory separator at the correct location, but only after doing a string comparison. Swap the order to be logically equivalent but perform fewer string comparisons. To test the effect on performance, I used a repository with over three million paths in the index. I then ran the following command on repeat: git -c index.threads=1 commit --amend --allow-empty --no-edit Here are the measurements over 10 runs after a 5-run warmup: Benchmark #1: v2.30.0 Time (mean ± σ): 854.5 ms ± 18.2 ms Range (min … max): 825.0 ms … 892.8 ms Benchmark #2: Previous change Time (mean ± σ): 833.2 ms ± 10.3 ms Range (min … max): 815.8 ms … 849.7 ms Benchmark #3: This change Time (mean ± σ): 815.5 ms ± 18.1 ms Range (min … max): 795.4 ms … 849.5 ms This change is 2% faster than the previous change and 5% faster than v2.30.0. Signed-off-by: Derrick Stolee <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 0b72536 commit a4b6d20

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

cache-tree.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ static int verify_cache(struct cache_entry **cache,
191191
const char *next_name = next_ce->name;
192192
int this_len = ce_namelen(this_ce);
193193
if (this_len < ce_namelen(next_ce) &&
194-
strncmp(this_name, next_name, this_len) == 0 &&
195-
next_name[this_len] == '/') {
194+
next_name[this_len] == '/' &&
195+
strncmp(this_name, next_name, this_len) == 0) {
196196
if (10 < ++funny) {
197197
fprintf(stderr, "...\n");
198198
break;

0 commit comments

Comments
 (0)