pickaxe -S: slightly optimize contains()
When the "log -S<pat>" switch counts occurrences of <pat> on the pre-image and post-image of a change. As soon as we know we had e.g. 1 before and 2 now we can stop, we don't need to keep counting past 2. With this change a diff between A and B may have different performance characteristics than between B and A. That's OK in this case, since we'll emit the same output, and the effect is to make one of them better. I'm picking a check of "one" first on the assumption that it's a more common case to have files grow over time than not. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Ævar Arnfjörð Bjarmason committed
Apr 12, 2021 at 19:15 UTC
5b0672a26e51387bc18adad89eaa3ebb131b2e33
1 file changed
+10
-3
diffcore-pickaxe.c
+10
-3
@@ -68,7 +68,8 @@ static int diff_grep(mmfile_t *one, mmfile_t *two,
68
return ecbdata.hit;
69
}
70
71
-static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
71
+static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws,
72
+ unsigned int limit)
73
{
74
unsigned int cnt = 0;
75
unsigned long sz = mf->size;
@@ -88,6 +89,9 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
89
sz--;
90
}
91
cnt++;
92
+
93
+ if (limit && cnt == limit)
94
+ return cnt;
95
}
96
97
} else { /* Classic exact string match */
@@ -99,6 +103,9 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
103
sz -= offset + kwsm.size[0];
104
data += offset + kwsm.size[0];
105
cnt++;
106
+
107
+ if (limit && cnt == limit)
108
+ return cnt;
109
}
110
}
111
return cnt;
@@ -108,8 +115,8 @@ static int has_changes(mmfile_t *one, mmfile_t *two,
115
struct diff_options *o,
116
regex_t *regexp, kwset_t kws)
117
{
111
- unsigned int c1 = one ? contains(one, regexp, kws) : 0;
112
- unsigned int c2 = two ? contains(two, regexp, kws) : 0;
118
+ unsigned int c1 = one ? contains(one, regexp, kws, 0) : 0;
119
+ unsigned int c2 = two ? contains(two, regexp, kws, c1 + 1) : 0;
120
return c1 != c2;
121
}
122