mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
oidset: use khash
Reimplement oidset using khash.h in order to reduce its memory footprint and make it faster. Performance of a command that mainly checks for duplicate objects using an oidset, with master and Clang 6.0.1: $ cmd="./git-cat-file --batch-all-objects --unordered --buffer --batch-check='%(objectname)'" $ /usr/bin/time $cmd >/dev/null 0.22user 0.03system 0:00.25elapsed 99%CPU (0avgtext+0avgdata 48484maxresident)k 0inputs+0outputs (0major+11204minor)pagefaults 0swaps $ hyperfine "$cmd" Benchmark #1: ./git-cat-file --batch-all-objects --unordered --buffer --batch-check='%(objectname)' Time (mean ± σ): 250.0 ms ± 6.0 ms [User: 225.9 ms, System: 23.6 ms] Range (min … max): 242.0 ms … 261.1 ms And with this patch: $ /usr/bin/time $cmd >/dev/null 0.14user 0.00system 0:00.15elapsed 100%CPU (0avgtext+0avgdata 41396maxresident)k 0inputs+0outputs (0major+8318minor)pagefaults 0swaps $ hyperfine "$cmd" Benchmark #1: ./git-cat-file --batch-all-objects --unordered --buffer --batch-check='%(objectname)' Time (mean ± σ): 151.9 ms ± 4.9 ms [User: 130.5 ms, System: 21.2 ms] Range (min … max): 148.2 ms … 170.4 ms Initial-patch-by: Jeff King <peff@peff.net> Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
9249ca26ac
commit
8b2f8cbcb1
34
oidset.c
34
oidset.c
@@ -3,38 +3,28 @@
|
||||
|
||||
int oidset_contains(const struct oidset *set, const struct object_id *oid)
|
||||
{
|
||||
if (!set->map.map.tablesize)
|
||||
return 0;
|
||||
return !!oidmap_get(&set->map, oid);
|
||||
khiter_t pos = kh_get_oid(&set->set, *oid);
|
||||
return pos != kh_end(&set->set);
|
||||
}
|
||||
|
||||
int oidset_insert(struct oidset *set, const struct object_id *oid)
|
||||
{
|
||||
struct oidmap_entry *entry;
|
||||
|
||||
if (!set->map.map.tablesize)
|
||||
oidmap_init(&set->map, 0);
|
||||
else if (oidset_contains(set, oid))
|
||||
return 1;
|
||||
|
||||
entry = xmalloc(sizeof(*entry));
|
||||
oidcpy(&entry->oid, oid);
|
||||
|
||||
oidmap_put(&set->map, entry);
|
||||
return 0;
|
||||
int added;
|
||||
kh_put_oid(&set->set, *oid, &added);
|
||||
return !added;
|
||||
}
|
||||
|
||||
int oidset_remove(struct oidset *set, const struct object_id *oid)
|
||||
{
|
||||
struct oidmap_entry *entry;
|
||||
|
||||
entry = oidmap_remove(&set->map, oid);
|
||||
free(entry);
|
||||
|
||||
return (entry != NULL);
|
||||
khiter_t pos = kh_get_oid(&set->set, *oid);
|
||||
if (pos == kh_end(&set->set))
|
||||
return 0;
|
||||
kh_del_oid(&set->set, pos);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void oidset_clear(struct oidset *set)
|
||||
{
|
||||
oidmap_free(&set->map, 1);
|
||||
kh_release_oid(&set->set);
|
||||
oidset_init(set, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user