@matheusbsbs / matheus-bagliano / commits / 977dc1912b
Fork 0

name-rev: generate name strings only if they are better

Leave setting the tip_name member of struct rev_name to callers of create_or_update_name(). This avoids allocations for names that are rejected by that function. Here's how this affects the runtime when working with a fresh clone of Git's own repository; performance numbers by hyperfine before: Benchmark #1: ./git -C ../git-pristine/ name-rev --all Time (mean ± σ): 437.8 ms ± 4.0 ms [User: 422.5 ms, System: 15.2 ms] Range (min … max): 432.8 ms … 446.3 ms 10 runs ... and with this patch: Benchmark #1: ./git -C ../git-pristine/ name-rev --all Time (mean ± σ): 408.5 ms ± 1.4 ms [User: 387.2 ms, System: 21.2 ms] Range (min … max): 407.1 ms … 411.7 ms 10 runs Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Feb 4, 2020 at 22:25 UTC 977dc1912bd74dbc7f94581f36b7e78eae49a8c3
1 file changed +18 -17
builtin/name-rev.c
+18 -17
@@ -81,7 +81,6 @@ static int is_better_name(struct rev_name *name,
81 }
82
83 static struct rev_name *create_or_update_name(struct commit *commit,
84 - const char *tip_name,
84 timestamp_t taggerdate,
85 int generation, int distance,
86 int from_tag)
@@ -92,7 +91,6 @@ static struct rev_name *create_or_update_name(struct commit *commit,
91 !is_better_name(name, taggerdate, distance, from_tag))
92 return NULL;
93
95 - name->tip_name = tip_name;
94 name->taggerdate = taggerdate;
95 name->generation = generation;
96 name->distance = distance;
@@ -130,22 +128,20 @@ static void name_rev(struct commit *start_commit,
128 struct commit *commit;
129 struct commit **parents_to_queue = NULL;
130 size_t parents_to_queue_nr, parents_to_queue_alloc = 0;
133 - char *to_free = NULL;
131 + struct rev_name *start_name;
132
133 parse_commit(start_commit);
134 if (start_commit->date < cutoff)
135 return;
136
137 + start_name = create_or_update_name(start_commit, taggerdate, 0, 0,
138 + from_tag);
139 + if (!start_name)
140 + return;
141 if (deref)
140 - tip_name = to_free = xstrfmt("%s^0", tip_name);
142 + start_name->tip_name = xstrfmt("%s^0", tip_name);
143 else
142 - tip_name = to_free = xstrdup(tip_name);
143 -
144 - if (!create_or_update_name(start_commit, tip_name, taggerdate, 0, 0,
145 - from_tag)) {
146 - free(to_free);
147 - return;
148 - }
144 + start_name->tip_name = xstrdup(tip_name);
145
146 memset(&queue, 0, sizeof(queue)); /* Use the prio_queue as LIFO */
147 prio_queue_put(&queue, start_commit);
@@ -161,7 +157,7 @@ static void name_rev(struct commit *start_commit,
157 parents;
158 parents = parents->next, parent_number++) {
159 struct commit *parent = parents->item;
164 - const char *new_name;
160 + struct rev_name *parent_name;
161 int generation, distance;
162
163 parse_commit(parent);
@@ -169,18 +165,23 @@ static void name_rev(struct commit *start_commit,
165 continue;
166
167 if (parent_number > 1) {
172 - new_name = get_parent_name(name, parent_number);
168 generation = 0;
169 distance = name->distance + MERGE_TRAVERSAL_WEIGHT;
170 } else {
176 - new_name = name->tip_name;
171 generation = name->generation + 1;
172 distance = name->distance + 1;
173 }
174
181 - if (create_or_update_name(parent, new_name, taggerdate,
182 - generation, distance,
183 - from_tag)) {
175 + parent_name = create_or_update_name(parent, taggerdate,
176 + generation,
177 + distance, from_tag);
178 + if (parent_name) {
179 + if (parent_number > 1)
180 + parent_name->tip_name =
181 + get_parent_name(name,
182 + parent_number);
183 + else
184 + parent_name->tip_name = name->tip_name;
185 ALLOC_GROW(parents_to_queue,
186 parents_to_queue_nr + 1,
187 parents_to_queue_alloc);