Skip to content

Commit 977dc19

Browse files
rscharfegitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 1c56fc2 commit 977dc19

File tree

1 file changed

+18
-17
lines changed

1 file changed

+18
-17
lines changed

builtin/name-rev.c

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ static int is_better_name(struct rev_name *name,
8181
}
8282

8383
static struct rev_name *create_or_update_name(struct commit *commit,
84-
const char *tip_name,
8584
timestamp_t taggerdate,
8685
int generation, int distance,
8786
int from_tag)
@@ -92,7 +91,6 @@ static struct rev_name *create_or_update_name(struct commit *commit,
9291
!is_better_name(name, taggerdate, distance, from_tag))
9392
return NULL;
9493

95-
name->tip_name = tip_name;
9694
name->taggerdate = taggerdate;
9795
name->generation = generation;
9896
name->distance = distance;
@@ -130,22 +128,20 @@ static void name_rev(struct commit *start_commit,
130128
struct commit *commit;
131129
struct commit **parents_to_queue = NULL;
132130
size_t parents_to_queue_nr, parents_to_queue_alloc = 0;
133-
char *to_free = NULL;
131+
struct rev_name *start_name;
134132

135133
parse_commit(start_commit);
136134
if (start_commit->date < cutoff)
137135
return;
138136

137+
start_name = create_or_update_name(start_commit, taggerdate, 0, 0,
138+
from_tag);
139+
if (!start_name)
140+
return;
139141
if (deref)
140-
tip_name = to_free = xstrfmt("%s^0", tip_name);
142+
start_name->tip_name = xstrfmt("%s^0", tip_name);
141143
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);
149145

150146
memset(&queue, 0, sizeof(queue)); /* Use the prio_queue as LIFO */
151147
prio_queue_put(&queue, start_commit);
@@ -161,26 +157,31 @@ static void name_rev(struct commit *start_commit,
161157
parents;
162158
parents = parents->next, parent_number++) {
163159
struct commit *parent = parents->item;
164-
const char *new_name;
160+
struct rev_name *parent_name;
165161
int generation, distance;
166162

167163
parse_commit(parent);
168164
if (parent->date < cutoff)
169165
continue;
170166

171167
if (parent_number > 1) {
172-
new_name = get_parent_name(name, parent_number);
173168
generation = 0;
174169
distance = name->distance + MERGE_TRAVERSAL_WEIGHT;
175170
} else {
176-
new_name = name->tip_name;
177171
generation = name->generation + 1;
178172
distance = name->distance + 1;
179173
}
180174

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;
184185
ALLOC_GROW(parents_to_queue,
185186
parents_to_queue_nr + 1,
186187
parents_to_queue_alloc);

0 commit comments

Comments
 (0)