Mercurial > hg
comparison mercurial/bdiff.c @ 9534:8e202431d620
bdiff: gradually enable the popularity hack
Patch from Jason Orendorff
The lower the threshold, the stronger the popularity hack's
influence. So at 3999 lines, the hack is disabled; and at 4000 lines,
the hack is enabled at maximum strength (t=4).
No source file in mercurial/crew is over 4000 lines. But there are, oh,
a few such files in Mozilla. I can testify that this hack causes hg to
generate some correct but eyebrow-raising patches.
I think the hack should phase in gradually. The threshold should be high
for small files where we don't need it so much. Like this:
t = (bn < 31000) ? 1000000 / bn : bn / 1000;
That would leave the popularity hack disabled for small files, then
gradually phase it in:
bn < 1000 -- t > bn (popularity hack is completely disabled)
bn == 1000 -- t = 1000 (still effectively disabled)
bn == 2000 -- t = 500 (only hits unusual files)
bn == 10000 -- t = 100 (only hits especially common lines)
bn == 31000 -- t = 31 (hack is at maximum power)
bn == 32000 -- t = 32 (hack could backfire, ease off)
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Sat, 03 Oct 2009 23:36:08 +0200 |
parents | 16f6c13706df |
children | 08a0f04b56bd |
comparison
equal
deleted
inserted
replaced
9490:67df9f46f907 | 9534:8e202431d620 |
---|---|
149 h[j].pos = i; | 149 h[j].pos = i; |
150 h[j].len++; /* keep track of popularity */ | 150 h[j].len++; /* keep track of popularity */ |
151 } | 151 } |
152 | 152 |
153 /* compute popularity threshold */ | 153 /* compute popularity threshold */ |
154 t = (bn >= 4000) ? bn / 1000 : bn + 1; | 154 t = (bn >= 31000) ? bn / 1000 : 1000000 / (bn + 1); |
155 | 155 |
156 /* match items in a to their equivalence class in b */ | 156 /* match items in a to their equivalence class in b */ |
157 for (i = 0; i < an; i++) { | 157 for (i = 0; i < an; i++) { |
158 /* find the equivalence class */ | 158 /* find the equivalence class */ |
159 for (j = a[i].h & buckets; h[j].pos != INT_MAX; | 159 for (j = a[i].h & buckets; h[j].pos != INT_MAX; |