Files
git/builtin
Patrick Steinhardt 16c4fa26b9 builtin/remote: only iterate through refs that are to be renamed
When renaming a remote we also need to rename all references
accordingly. But while we only need to rename references that are
contained in the "refs/remotes/$OLDNAME/" namespace, we end up using
`refs_for_each_rawref()` that iterates through _all_ references. We know
to exit early in the callback in case we see an irrelevant reference,
but ultimately this is still a waste of compute as we knowingly iterate
through references that we won't ever care about.

Improve this by using `refs_for_each_rawref_in()`, which knows to only
iterate through (potentially broken) references in a given prefix.

The following benchmark renames a remote with a single reference in a
repository that has 100k unrelated references. This shows a sizeable
improvement with the "files" backend:

    Benchmark 1: rename remote (refformat = files, revision = HEAD~)
      Time (mean ± σ):      42.6 ms ±   0.9 ms    [User: 29.1 ms, System: 8.4 ms]
      Range (min … max):    40.1 ms …  43.3 ms    10 runs

    Benchmark 2: rename remote (refformat = files, revision = HEAD)
      Time (mean ± σ):      31.7 ms ±   4.0 ms    [User: 19.6 ms, System: 6.9 ms]
      Range (min … max):    27.1 ms …  36.0 ms    10 runs

    Summary
      rename remote (refformat = files, revision = HEAD) ran
        1.35 ± 0.17 times faster than rename remote (refformat = files, revision = HEAD~)

The "reftable" backend shows roughly the same absolute improvement, but
given that it's already significantly faster than the "files" backend
this translates to a much larger relative improvement:

    Benchmark 1: rename remote (refformat = reftable, revision = HEAD~)
      Time (mean ± σ):      18.2 ms ±   0.5 ms    [User: 12.7 ms, System: 3.0 ms]
      Range (min … max):    17.3 ms …  21.4 ms    110 runs

    Benchmark 2: rename remote (refformat = reftable, revision = HEAD)
      Time (mean ± σ):       8.8 ms ±   0.5 ms    [User: 3.8 ms, System: 2.9 ms]
      Range (min … max):     7.5 ms …   9.9 ms    167 runs

    Summary
      rename remote (refformat = reftable, revision = HEAD) ran
        2.07 ± 0.12 times faster than rename remote (refformat = reftable, revision = HEAD~)

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-08-06 14:19:30 -07:00
..
2025-05-27 13:59:09 -07:00
2025-07-16 09:42:28 -07:00
2025-07-01 14:46:38 -07:00
2025-07-01 14:46:37 -07:00
2024-12-13 07:33:36 -08:00
2025-07-15 15:18:18 -07:00
2025-07-15 15:18:18 -07:00
2025-07-01 14:46:38 -07:00
2025-07-15 15:18:18 -07:00
2025-05-15 13:46:44 -07:00
2025-07-01 10:28:48 -07:00
2025-01-28 13:02:22 -08:00
2025-07-01 14:46:37 -07:00
2025-07-01 14:46:38 -07:00
2025-07-16 09:42:27 -07:00
2024-12-18 10:44:30 -08:00
2025-07-15 15:18:18 -07:00
2025-07-01 14:46:37 -07:00
2025-07-01 14:46:37 -07:00
2024-12-18 10:44:31 -08:00
2025-07-15 15:18:18 -07:00
2025-07-01 14:46:37 -07:00
2025-05-08 12:36:32 -07:00
2025-07-01 14:46:38 -07:00
2025-07-15 15:18:18 -07:00
2025-02-04 09:51:41 -08:00
2025-07-01 14:46:37 -07:00
2025-07-01 14:46:37 -07:00
2025-03-29 01:04:40 -07:00
2025-07-01 14:46:38 -07:00
2025-07-01 14:46:38 -07:00
2025-07-01 14:46:38 -07:00
2024-12-18 10:44:30 -08:00
2025-01-28 13:02:22 -08:00