tree-walk: report recursion counts
The traverse_trees() method recursively walks through trees, but also
prunes the tree-walk based on a callback. Some callers, such as
unpack_trees(), are quite complicated and can have wildly different
performance between two different commands.
Create constants that count these values and then report the results at
the end of a process. These counts are cumulative across multiple "root"
instances of traverse_trees(), but they provide reproducible values for
demonstrating improvements to the pruning algorithm when possible.
This change is modeled after a similar statistics reporting in 42e50e78
(revision.c: add trace2 stats around Bloom filter usage, 2020-04-06).
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
71ca53e812
commit
da8be8ced6
33
tree-walk.c
33
tree-walk.c
@ -4,6 +4,7 @@
|
||||
#include "object-store.h"
|
||||
#include "tree.h"
|
||||
#include "pathspec.h"
|
||||
#include "json-writer.h"
|
||||
|
||||
static const char *get_mode(const char *str, unsigned int *modep)
|
||||
{
|
||||
@ -167,6 +168,25 @@ int tree_entry_gently(struct tree_desc *desc, struct name_entry *entry)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int traverse_trees_atexit_registered;
|
||||
static int traverse_trees_count;
|
||||
static int traverse_trees_cur_depth;
|
||||
static int traverse_trees_max_depth;
|
||||
|
||||
static void trace2_traverse_trees_statistics_atexit(void)
|
||||
{
|
||||
struct json_writer jw = JSON_WRITER_INIT;
|
||||
|
||||
jw_object_begin(&jw, 0);
|
||||
jw_object_intmax(&jw, "traverse_trees_count", traverse_trees_count);
|
||||
jw_object_intmax(&jw, "traverse_trees_max_depth", traverse_trees_max_depth);
|
||||
jw_end(&jw);
|
||||
|
||||
trace2_data_json("traverse_trees", the_repository, "statistics", &jw);
|
||||
|
||||
jw_release(&jw);
|
||||
}
|
||||
|
||||
void setup_traverse_info(struct traverse_info *info, const char *base)
|
||||
{
|
||||
size_t pathlen = strlen(base);
|
||||
@ -180,6 +200,11 @@ void setup_traverse_info(struct traverse_info *info, const char *base)
|
||||
info->namelen = pathlen;
|
||||
if (pathlen)
|
||||
info->prev = &dummy;
|
||||
|
||||
if (trace2_is_enabled() && !traverse_trees_atexit_registered) {
|
||||
atexit(trace2_traverse_trees_statistics_atexit);
|
||||
traverse_trees_atexit_registered = 1;
|
||||
}
|
||||
}
|
||||
|
||||
char *make_traverse_path(char *path, size_t pathlen,
|
||||
@ -416,6 +441,12 @@ int traverse_trees(struct index_state *istate,
|
||||
int interesting = 1;
|
||||
char *traverse_path;
|
||||
|
||||
traverse_trees_count++;
|
||||
traverse_trees_cur_depth++;
|
||||
|
||||
if (traverse_trees_cur_depth > traverse_trees_max_depth)
|
||||
traverse_trees_max_depth = traverse_trees_cur_depth;
|
||||
|
||||
if (n >= ARRAY_SIZE(entry))
|
||||
BUG("traverse_trees() called with too many trees (%d)", n);
|
||||
|
||||
@ -515,6 +546,8 @@ int traverse_trees(struct index_state *istate,
|
||||
free(traverse_path);
|
||||
info->traverse_path = NULL;
|
||||
strbuf_release(&base);
|
||||
|
||||
traverse_trees_cur_depth--;
|
||||
return error;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user