git/builtin
René Scharfe 30598ccc4d describe: use oidset in finish_depth_computation()
Depth computation can end early if all remaining commits are flagged.
The current code determines if that's the case by checking all queue
items each time it dequeues a flagged commit.  This can cause
quadratic complexity.

We could simply count the flagged items in the queue and then update
that number as we add and remove items.  That would provide a general
speedup, but leave one case where we have to scan the whole queue: When
we flag a previously seen, but unflagged commit.  It could be on the
queue and then we'd have to decrease our count.

We could dedicate an object flag to track queue membership, but that
would leave less for candidate tags, affecting the results.  So use a
hash table, specifically an oidset of commit hashes, to track that.
This avoids quadratic behaviour in all cases and provides a nice
performance boost over the previous commit, 08bb69d70f (describe: use
prio_queue_replace(), 2025-08-03):

Benchmark 1: ./git_08bb69d70f describe $(git rev-list v2.41.0..v2.47.0)
  Time (mean ± σ):     855.3 ms ±   1.3 ms    [User: 790.8 ms, System: 49.9 ms]
  Range (min … max):   853.7 ms … 857.8 ms    10 runs

Benchmark 2: ./git describe $(git rev-list v2.41.0..v2.47.0)
  Time (mean ± σ):     610.8 ms ±   1.7 ms    [User: 546.9 ms, System: 49.3 ms]
  Range (min … max):   608.9 ms … 613.3 ms    10 runs

Summary
  ./git describe $(git rev-list v2.41.0..v2.47.0) ran
    1.40 ± 0.00 times faster than ./git_08bb69d70f describe $(git rev-list v2.41.0..v2.47.0)

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-09-02 15:15:13 -07:00
..
add.c Merge branch 'ds/sparse-apply-add-p' 2025-05-27 13:59:09 -07:00
am.c Merge branch 'rs/parse-options-precision' 2025-07-16 09:42:28 -07:00
annotate.c Merge branch 'jc/a-commands-without-the-repo' 2024-10-25 14:02:36 -04:00
apply.c builtin: use default hash when outside a repository 2025-07-01 14:58:24 -07:00
archive.c archive: remove the_repository global variable 2024-10-11 09:37:18 -07:00
backfill.c odb: rename `has_object()` 2025-07-01 14:46:38 -07:00
bisect.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
blame.c odb: rename `oid_object_info()` 2025-07-01 14:46:37 -07:00
branch.c Merge branch 'rs/ref-fitler-used-atoms-value-fix' 2025-01-29 14:05:09 -08:00
bugreport.c object-file: move `safe_create_leading_directories()` into "path.c" 2025-04-15 08:24:35 -07:00
bundle.c Merge branch 'jt/bundle-fsck' 2024-12-13 07:33:36 -08:00
cat-file.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
check-attr.c builtin: remove USE_THE_REPOSITORY_VARIABLE from builtin.h 2024-09-13 14:32:24 -07:00
check-ignore.c builtin: remove USE_THE_REPOSITORY_VARIABLE from builtin.h 2024-09-13 14:32:24 -07:00
check-mailmap.c mailmap: fix check-mailmap with full mailmap line 2025-02-21 18:27:16 -08:00
check-ref-format.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
checkout--worker.c builtins: send usage_with_options() help text to standard output 2025-01-17 13:30:03 -08:00
checkout-index.c builtin/checkout-index: stop using `the_repository` 2025-03-07 16:52:02 -08:00
checkout.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
clean.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
clone.c odb: rename `has_object()` 2025-07-01 14:46:38 -07:00
column.c parse-options: detect mismatches in integer signedness 2025-04-17 08:15:16 -07:00
commit-graph.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
commit-tree.c odb: get rid of `the_repository` in `assert_oid_type()` 2025-07-01 14:46:35 -07:00
commit.c commit: avoid scanning trailing comments when 'core.commentChar' is "auto" 2025-07-16 08:25:17 -07:00
config.c config: mention --url in the synopsis 2025-07-01 10:28:48 -07:00
count-objects.c odb: get rid of `the_repository` in `for_each()` functions 2025-07-01 14:46:36 -07:00
credential-cache--daemon.c object-file: move `safe_create_leading_directories()` into "path.c" 2025-04-15 08:24:35 -07:00
credential-cache.c Merge branch 'rj/cygwin-exit' 2024-11-01 12:53:19 -04:00
credential-store.c builtin: remove USE_THE_REPOSITORY_VARIABLE from builtin.h 2024-09-13 14:32:24 -07:00
credential.c Merge branch 'jc/show-usage-help' 2025-01-28 13:02:22 -08:00
describe.c describe: use oidset in finish_depth_computation() 2025-09-02 15:15:13 -07:00
diagnose.c object-file: move `safe_create_leading_directories()` into "path.c" 2025-04-15 08:24:35 -07:00
diff-files.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
diff-index.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
diff-pairs.c builtin/diff-pairs: allow explicit diff queue flush 2025-03-03 08:17:47 -08:00
diff-tree.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
diff.c Merge branch 'bc/use-sha256-by-default-in-3.0' 2025-07-21 09:14:25 -07:00
difftool.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
fast-export.c Merge branch 'cc/fast-import-export-signature-names' 2025-07-23 15:45:16 -07:00
fast-import.c Merge branch 'cc/fast-import-export-signature-names' 2025-07-23 15:45:16 -07:00
fetch-pack.c builtin/fetch-pack: cleanup before return error 2025-06-04 08:52:25 -07:00
fetch.c Merge branch 'ph/fetch-prune-optim' 2025-07-16 09:42:27 -07:00
fmt-merge-msg.c parse-options: introduce precision handling for `OPTION_INTEGER` 2025-04-17 08:15:15 -07:00
for-each-ref.c builtin/for-each-ref: stop using `the_repository` 2025-03-07 16:52:02 -08:00
for-each-repo.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
fsck.c odb: rename `has_object()` 2025-07-01 14:46:38 -07:00
fsmonitor--daemon.c builtins: send usage_with_options() help text to standard output 2025-01-17 13:30:03 -08:00
gc.c Merge branch 'jk/unleak-reflog-expire-entry' 2025-08-01 11:27:11 -07:00
get-tar-commit-id.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
grep.c odb: rename `read_object_with_reference()` 2025-07-01 14:46:39 -07:00
hash-object.c Merge branch 'bc/use-sha256-by-default-in-3.0' 2025-07-21 09:14:25 -07:00
help.c pager: stop using `the_repository` 2024-12-18 10:44:30 -08:00
hook.c builtin: pass repository to sub commands 2024-11-26 10:36:08 +09:00
index-pack.c Merge branch 'bc/use-sha256-by-default-in-3.0' 2025-07-21 09:14:25 -07:00
init-db.c Merge branch 'ps/parse-options-integers' 2025-04-24 17:25:34 -07:00
interpret-trailers.c trailer: spread usage of "trailer_block" language 2024-10-14 12:33:02 -04:00
log.c Merge branch 'jk/revision-no-early-output' 2025-08-01 11:27:11 -07:00
ls-files.c odb: rename `oid_object_info()` 2025-07-01 14:46:37 -07:00
ls-remote.c builtin: use default hash when outside a repository 2025-07-01 14:58:24 -07:00
ls-tree.c odb: rename `oid_object_info()` 2025-07-01 14:46:37 -07:00
mailinfo.c mailinfo: stop using `the_repository` 2024-12-18 10:44:31 -08:00
mailsplit.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
merge-base.c commit-reach: use `size_t` to track indices when computing merge bases 2024-12-27 08:12:40 -08:00
merge-file.c object-store: rename files to "odb.{c,h}" 2025-07-01 14:46:34 -07:00
merge-index.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
merge-ours.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
merge-recursive.c builtin/merge-recursive: switch to using merge_ort_generic() 2025-04-08 13:59:11 -07:00
merge-tree.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
merge.c merge/pull: extend merge.stat configuration variable to cover --compact-summary 2025-06-13 11:54:14 -07:00
mktag.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
mktree.c odb: rename `oid_object_info()` 2025-07-01 14:46:37 -07:00
multi-pack-index.c object-store: rename files to "odb.{c,h}" 2025-07-01 14:46:34 -07:00
mv.c Merge branch 'ps/mv-contradiction-fix' 2025-05-08 12:36:32 -07:00
name-rev.c Merge branch 'ps/object-wo-the-repository' 2025-04-15 13:50:15 -07:00
notes.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
pack-objects.c Merge branch 'tb/midx-avoid-cruft-packs' 2025-07-21 09:14:26 -07:00
pack-redundant.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
pack-refs.c builtin/pack-refs: stop using `the_repository` 2025-03-07 16:52:01 -08:00
patch-id.c builtin: use default hash when outside a repository 2025-07-01 14:58:24 -07:00
prune-packed.c builtin: remove USE_THE_REPOSITORY for those without the_repository 2024-09-13 14:33:30 -07:00
prune.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
pull.c Merge branch 'ly/pull-autostash' 2025-08-01 11:27:14 -07:00
push.c remote: rename query_refspecs functions 2025-02-04 09:51:41 -08:00
range-diff.c Merge branch 'js/range-diff-diff-merges' 2024-12-23 09:32:17 -08:00
read-tree.c global: use designated initializers for options 2025-04-17 08:15:15 -07:00
rebase.c parse-options: add precision handling for OPTION_NEGBIT 2025-07-09 08:39:46 -07:00
receive-pack.c Merge branch 'bc/use-sha256-by-default-in-3.0' 2025-07-21 09:14:25 -07:00
reflog.c reflog: close leak of reflog expire entry 2025-07-22 16:34:11 -07:00
refs.c Merge branch 'sj/ref-consistency-checks-more' 2025-03-26 16:26:10 +09:00
remote-ext.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
remote-fd.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
remote.c Merge branch 'jk/remote-avoid-overlapping-names' 2025-07-21 09:14:26 -07:00
repack.c Merge branch 'tb/midx-avoid-cruft-packs' 2025-07-21 09:14:26 -07:00
replace.c odb: rename `oid_object_info()` 2025-07-01 14:46:37 -07:00
replay.c repo_logmsg_reencode: fix memory leak when use repo_logmsg_reencode () 2025-06-05 08:35:22 -07:00
rerere.c rerere: let `rerere_path()` write paths into a caller-provided buffer 2025-02-28 13:54:11 -08:00
reset.c reset: integrate sparse index with --patch 2025-05-16 12:02:47 -07:00
rev-list.c Merge branch 'jc/do-not-scan-argv-without-parsing' 2025-08-01 11:27:11 -07:00
rev-parse.c path: drop `git_path()` in favor of `repo_git_path()` 2025-02-28 13:54:11 -08:00
revert.c Merge branch 'ps/parse-options-integers' 2025-04-24 17:25:34 -07:00
rm.c rm: fix sign comparison warnings 2025-03-29 01:04:40 -07:00
send-pack.c Merge branch 'jk/fix-leak-send-pack' 2025-07-07 14:12:57 -07:00
shortlog.c Merge branch 'bc/use-sha256-by-default-in-3.0' 2025-07-21 09:14:25 -07:00
show-branch.c Merge branch 'az/tighten-string-array-constness' 2025-04-29 14:21:28 -07:00
show-index.c builtin: use default hash when outside a repository 2025-07-01 14:58:24 -07:00
show-ref.c odb: rename `has_object()` 2025-07-01 14:46:38 -07:00
sparse-checkout.c object-file: move `safe_create_leading_directories()` into "path.c" 2025-04-15 08:24:35 -07:00
stash.c Merge branch 'bc/stash-export-import' 2025-06-30 14:30:31 -07:00
stripspace.c builtin: remove USE_THE_REPOSITORY_VARIABLE from builtin.h 2024-09-13 14:32:24 -07:00
submodule--helper.c Merge branch 'ps/object-store' 2025-07-15 15:18:18 -07:00
symbolic-ref.c builtin: remove USE_THE_REPOSITORY_VARIABLE from builtin.h 2024-09-13 14:32:24 -07:00
tag.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
unpack-file.c odb: rename `repo_read_object_file()` 2025-07-01 14:46:38 -07:00
unpack-objects.c odb: rename `has_object()` 2025-07-01 14:46:38 -07:00
update-index.c parse-options: add precision handling for OPTION_SET_INT 2025-07-09 08:39:26 -07:00
update-ref.c refs: add function to translate errors to strings 2025-05-19 11:06:31 -07:00
update-server-info.c builtin/update-server-info: remove unnecessary if statement 2025-04-08 14:47:37 -07:00
upload-archive.c builtin: send usage() help text to standard output 2025-01-17 13:30:03 -08:00
upload-pack.c serve: stop using `the_repository` 2024-12-18 10:44:30 -08:00
var.c Merge branch 'jc/show-usage-help' 2025-01-28 13:02:22 -08:00
verify-commit.c builtin/verify-commit: stop using `the_repository` 2025-03-07 16:52:01 -08:00
verify-pack.c builtin: remove USE_THE_REPOSITORY_VARIABLE from builtin.h 2024-09-13 14:32:24 -07:00
verify-tag.c builtin/verify-tag: stop using `the_repository` 2025-03-07 16:52:01 -08:00
worktree.c Merge branch 'ly/do-not-localize-bug-messages' 2025-06-17 10:44:40 -07:00
write-tree.c parse-options: add precision handling for OPTION_BIT 2025-07-09 08:39:28 -07:00