It will output something like this: $ GIT_TRACE_BLOOM_FILTER=2 GIT_USE_POC_BLOOM_FILTER=y git rev-list --count --full-history HEAD -- t/valgrind/valgrind.sh 886 17:24:42.915053 revision.c:484 bloom filter total queries: 66095 definitely not: 64953 maybe: 1142 false positives: 256 fp ratio: 0.003873 --- revision.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/revision.c b/revision.c index 3565785ca6..2f3f73b4dd 100644 --- a/revision.c +++ b/revision.c @@ -467,6 +467,25 @@ static void file_change(struct diff_options *options, /* Another static... */ static struct bloom_filter bf; +static struct trace_key trace_bloom_filter = TRACE_KEY_INIT(BLOOM_FILTER); +static int trace_bloom_filter_atexit_registered; +static unsigned int bloom_filter_count_maybe; +static unsigned int bloom_filter_count_definitely_not; +static unsigned int bloom_filter_count_false_positive; + +static void print_bloom_filter_stats_atexit(void) +{ + unsigned int total = bloom_filter_count_maybe + + bloom_filter_count_definitely_not; + trace_printf_key(&trace_bloom_filter, + "bloom filter total queries: %d definitely not: %d maybe: %d false positives: %d fp ratio: %f\n", + total, + bloom_filter_count_definitely_not, + bloom_filter_count_maybe, + bloom_filter_count_false_positive, + (1.0 * bloom_filter_count_false_positive) / total); +} + static int check_maybe_different_in_bloom_filter(struct rev_info *revs, struct commit *parent, struct commit *commit) @@ -513,10 +532,12 @@ static int check_maybe_different_in_bloom_filter(struct rev_info *revs, * at those paths that the Bloom filter have found * unchanged. */ + bloom_filter_count_maybe++; return 1; } } + bloom_filter_count_definitely_not++; return 0; } @@ -525,6 +546,7 @@ static int rev_compare_tree(struct rev_info *revs, { struct tree *t1 = get_commit_tree(parent); struct tree *t2 = get_commit_tree(commit); + int bloom_ret; if (!t1) return REV_TREE_NEW; @@ -549,7 +571,8 @@ static int rev_compare_tree(struct rev_info *revs, return REV_TREE_SAME; } - if (!check_maybe_different_in_bloom_filter(revs, parent, commit)) + bloom_ret = check_maybe_different_in_bloom_filter(revs, parent, commit); + if (bloom_ret == 0) return REV_TREE_SAME; tree_difference = REV_TREE_SAME; @@ -557,6 +580,8 @@ static int rev_compare_tree(struct rev_info *revs, if (diff_tree_oid(&t1->object.oid, &t2->object.oid, "", &revs->pruning) < 0) return REV_TREE_DIFFERENT; + if (bloom_ret == 1 && tree_difference == REV_TREE_SAME) + bloom_filter_count_false_positive++; return tree_difference; } @@ -3198,6 +3223,13 @@ void prepare_to_use_bloom_filter(struct rev_info *revs) warning("you wanted to use the Bloom filter, but it couldn't be loaded"); return; } + + if (trace_want(&trace_bloom_filter)) { + if (!trace_bloom_filter_atexit_registered) { + atexit(print_bloom_filter_stats_atexit); + trace_bloom_filter_atexit_registered = 1; + } + } } int prepare_revision_walk(struct rev_info *revs) -- 2.19.1.409.g0a0ee5eb6b