diff options
author | Eric Wong <e@80x24.org> | 2021-07-08 01:10:15 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-07-08 02:21:12 +0200 |
commit | cf2dc1c238c6fd5f93c315a3045ccf95459701cd (patch) | |
tree | bd576b3137f6943082e9b49f1eb1cc6c86e321f5 /dir.h | |
parent | The second batch (diff) | |
download | git-cf2dc1c238c6fd5f93c315a3045ccf95459701cd.tar.xz git-cf2dc1c238c6fd5f93c315a3045ccf95459701cd.zip |
speed up alt_odb_usable() with many alternates
With many alternates, the duplicate check in alt_odb_usable()
wastes many cycles doing repeated fspathcmp() on every existing
alternate. Use a khash to speed up lookups by odb->path.
Since the kh_put_* API uses the supplied key without
duplicating it, we also take advantage of it to replace both
xstrdup() and strbuf_release() in link_alt_odb_entry() with
strbuf_detach() to avoid the allocation and copy.
In a test repository with 50K alternates and each of those 50K
alternates having one alternate each (for a total of 100K total
alternates); this speeds up lookup of a non-existent blob from
over 16 minutes to roughly 2.7 seconds on my busy workstation.
Note: all underlying git object directories were small and
unpacked with only loose objects and no packs. Having to load
packs increases times significantly.
Signed-off-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'dir.h')
-rw-r--r-- | dir.h | 2 |
1 files changed, 2 insertions, 0 deletions
@@ -489,7 +489,9 @@ int remove_dir_recursively(struct strbuf *path, int flag); int remove_path(const char *path); int fspathcmp(const char *a, const char *b); +int fspatheq(const char *a, const char *b); int fspathncmp(const char *a, const char *b, size_t count); +unsigned int fspathhash(const char *str); /* * The prefix part of pattern must not contains wildcards. |