Am 12.05.2018 um 10:45 schrieb René Scharfe: > Or we could roll our own custom hash map, as I mused in an earlier post. > That would duplicate quite a bit of code; are there reusable pieces > hidden within that could be extracted into common functions? At least it would allow us to save four bytes of padding per object on x64 by using a separate array for the hash map values; not sure how that would impact performance, though. --- builtin/fast-export.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 627b0032f3..086fcaf9ea 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -72,13 +72,13 @@ static int parse_opt_tag_of_filtered_mode(const struct option *opt, struct object_mark_entry { const struct object *base; - uint32_t mark; }; struct object_marks { unsigned int size; unsigned int nr; struct object_mark_entry *entries; + uint32_t *marks; }; static struct object_marks idnums; @@ -98,14 +98,14 @@ static void set_object_mark(struct object_marks *n, const struct object *base, while (entries[j].base) { if (entries[j].base == base) { - entries[j].mark = mark; + n->marks[j] = mark; return; } if (++j >= size) j = 0; } entries[j].base = base; - entries[j].mark = mark; + n->marks[j] = mark; n->nr++; } @@ -114,19 +114,22 @@ static void grow_object_marks(struct object_marks *n) unsigned int i; unsigned int old_size = n->size; struct object_mark_entry *old_entries = n->entries; + uint32_t *old_marks = n->marks; n->size = (old_size + 1000) * 3 / 2; n->entries = xcalloc(n->size, sizeof(n->entries[0])); + n->marks = xcalloc(n->size, sizeof(n->marks[0])); n->nr = 0; for (i = 0; i < old_size; i++) { const struct object *base = old_entries[i].base; - uint32_t mark = old_entries[i].mark; + uint32_t mark = old_marks[i]; if (mark) set_object_mark(n, base, mark); } free(old_entries); + free(old_marks); } static int has_unshown_parent(struct commit *commit) @@ -236,7 +239,7 @@ static int get_object_mark(struct object *object) for (;;) { struct object_mark_entry *ref = idnums.entries + j; if (ref->base == object) - return ref->mark; + return idnums.marks[j]; if (!ref->base) return 0; if (++j == idnums.size) @@ -966,7 +969,7 @@ static void export_marks(char *file) for (i = 0; i < idnums.size; i++) { if (entry->base && entry->base->type == 1) { - if (fprintf(f, ":%"PRIu32" %s\n", entry->mark, + if (fprintf(f, ":%"PRIu32" %s\n", idnums.marks[i], oid_to_hex(&entry->base->oid)) < 0) { e = 1; break; -- 2.17.0