git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 09/10] name-rev: generate name strings only if they are better

From
René Scharfe <l.s.r@web.de>
Date
Feb 5, 2020, 15:50 UTC
Message-ID
<1e9251b2-4bbf-48b8-b7f7-e0835fefeeb0@web.de>
In-Reply-To
<3a59d8b4-3c3d-3812-9b7e-ac7e331ccd1c@gmail.com>
Am 05.02.20 um 16:11 schrieb Derrick Stolee:
Show 13 quoted lines
> On 2/4/2020 4:25 PM, René Scharfe wrote:
>> -			if (create_or_update_name(parent, new_name, taggerdate,
>> -						  generation, distance,
>> -						  from_tag)) {
>> +			parent_name = create_or_update_name(parent, taggerdate,
>> +							    generation,
>> +							    distance, from_tag);
>> +			if (parent_name) {
>
> As someone unfamiliar with the name-rev code, it took me a while to see why
> the algorithm isn't exponential in complexity. It technically _is_, but it
> is of the form 2^{N / MERGE_TRAVERSAL_WEIGHT} = 2^{N / 65535} and only if
> we create a particularly nasty commit history that would never appear in the wild.

As I understand it, name_rev() attaches a name (a tag or other reference) to a commit, and then goes through all its ancestors, depth first, and attaches a name based on that to all of them as well. It stops traversal if the name is not better than a previously attached name. Each commit has at most one name.

If we have N commits and M tags then we could traverse N * M commits and set their names in the worst case, if the M tags are all for the very latest commit and if the tags are ordered from worst to best. Right?

Which implies that ordering names before attaching them one by one should yield another speedup. Older tags are preferred and should be tried first, followed by younger tags and non-tags. Hmm.. :)

> But, the critical section is the block above. The confusing part was that
> create_or_update_name() returns NULL if the name is updated, but non-NULL if
> a better name is created. That makes it clear that this change is saving
> allocations.

create_or_update_name() returns NULL if the new name is not better than an existing one, and the old name is left untouched. It returns a pointer to the name record if there either was no old name or if that name was worse. In that case it updates the name.

After this patch it doesn't set the name string (tip_name) anymore, which is left for the caller. And the benefit is that the caller only needs to prepare said name string if the new name is better.

René
Previous: Derrick StoleeNext: René Scharfe
Message 19 of 27 in “name-rev: improve memory usage”
  1. 00/10 name-rev: improve memory usageRené Scharfe, Feb 4, 2020
  2. 01/10 name-rev: rewrite create_or_update_name()René Scharfe, Feb 4, 2020
  3. Derrick StoleeFeb 5, 2020
  4. Taylor BlauFeb 5, 2020
  5. Andrei RybakFeb 5, 2020
  6. René ScharfeFeb 5, 2020
  7. 02/10 name-rev: remove unused typedefRené Scharfe, Feb 4, 2020
  8. 03/10 name-rev: respect const qualifierRené Scharfe, Feb 4, 2020
  9. 04/10 name-rev: don't leak path copy in name_ref()René Scharfe, Feb 4, 2020
  10. Derrick StoleeFeb 5, 2020
  11. 05/10 name-rev: don't _peek() in create_or_update_name()René Scharfe, Feb 4, 2020
  12. 06/10 name-rev: put struct rev_name into commit slabRené Scharfe, Feb 4, 2020
  13. 07/10 name-rev: factor out get_parent_name()René Scharfe, Feb 4, 2020
  14. 08/10 name-rev: pre-size buffer in get_parent_name()René Scharfe, Feb 4, 2020
  15. Derrick StoleeFeb 5, 2020
  16. René ScharfeFeb 5, 2020
  17. 09/10 name-rev: generate name strings only if they are betterRené Scharfe, Feb 4, 2020
  18. Derrick StoleeFeb 5, 2020
  19. René ScharfeFeb 5, 2020
  20. 10/10 name-rev: release unused name stringsRené Scharfe, Feb 4, 2020
  21. Derrick StoleeFeb 5, 2020
  22. Derrick StoleeFeb 5, 2020
  23. Derrick StoleeFeb 5, 2020
  24. 01/10 name-rev: rewrite create_or_update_name()René Scharfe, Feb 5, 2020
  25. 11/10 name-rev: sort tip names before applyingRené Scharfe, Feb 5, 2020
  26. Junio C HamanoFeb 5, 2020
  27. René ScharfeFeb 5, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.