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

Reply via email to