Skip to content

Commit bc8fe12

Browse files
committed
perf: avoid repeated case conversions
This eeks out an improvement of about 0.8% in CPU time and 1.3% in wall time: Summary of cpu time and (wall time): best avg sd +/- p (best) (avg) (sd) +/- p pathological 0.20382 0.21317 0.06488 [-3.4%] 0.0005 (0.20383) (0.21318) (0.06485) [-3.4%] 0.0005 command-t 0.15238 0.15889 0.05256 [-0.8%] 0.005 (0.15238) (0.15890) (0.05256) [-0.8%] 0.005 chromium (subset) 1.17132 1.19209 0.03527 [-0.1%] 0.025 (0.26559) (0.27217) (0.01463) [-0.2%] chromium (whole) 0.91269 0.92064 0.06820 [-0.9%] 0.005 (0.10191) (0.10619) (0.02936) [-0.8%] 0.05 big (400k) 1.38361 1.39376 0.03947 [-0.8%] 0.005 (0.15141) (0.15477) (0.01254) [-0.9%] 0.05 total 3.84099 3.87856 0.18165 [-0.8%] 0.005 (0.88459) (0.90520) (0.13043) [-1.3%] 0.005
1 parent 7418634 commit bc8fe12

File tree

1 file changed

+5
-7
lines changed

1 file changed

+5
-7
lines changed

lua/wincent/commandt/lib/score.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ static float recursive_match(
4545
for (size_t j = haystack_idx; j <= m->rightmost_match_p[i]; j++) {
4646
char c = needle_char;
4747
char d = haystack_contents[j];
48+
char d_lower = d >= 'A' && d <= 'Z' ? d | 0x20 : d;
4849
if (d == '.') {
4950
if (j == 0 ||
5051
haystack_contents[j - 1] == '/') { // This is a dot-file.
@@ -58,11 +59,10 @@ static float recursive_match(
5859
return 0.0f;
5960
}
6061
}
61-
} else if (m->ignore_case && d >= 'A' && d <= 'Z') {
62-
d |= 0x20; // Lowercase (same as adding 32).
6362
}
6463

65-
if (c == d) {
64+
char match_char = m->ignore_case ? d_lower : d;
65+
if (c == match_char) {
6666
memoized = &m->memo[j * m->needle_length + i];
6767
if (*memoized != UNSET_SCORE) {
6868
return *memoized > seen_score ? *memoized : seen_score;
@@ -75,15 +75,13 @@ static float recursive_match(
7575
if (distance > 1) {
7676
float factor = 1.0f;
7777
char last = haystack_contents[j - 1];
78-
char curr =
79-
haystack_contents[j]; // Case matters, so get again.
8078
if (last == '/') {
8179
factor = 0.9f;
8280
} else if (last == '-' || last == '_' || last == ' ' ||
8381
(last >= '0' && last <= '9')) {
8482
factor = 0.8f;
85-
} else if (last >= 'a' && last <= 'z' && curr >= 'A' &&
86-
curr <= 'Z') {
83+
} else if (last >= 'a' && last <= 'z' && d >= 'A' &&
84+
d <= 'Z') {
8785
factor = 0.8f;
8886
} else if (last == '.') {
8987
factor = 0.7f;

0 commit comments

Comments
 (0)