Skip to content

Commit 8dfda23

Browse files
committed
perf: avoid some more pointer traversals
Supposedly another 0.5% improvement (in CPU time and wall time): Summary of cpu time and (wall time): best avg sd +/- p (best) (avg) (sd) +/- p pathological 0.20431 0.21386 0.07042 [-0.0%] (0.20430) (0.21387) (0.07068) [-0.1%] command-t 0.15179 0.15869 0.05864 [-0.2%] (0.15179) (0.15869) (0.05864) [-0.2%] chromium (subset) 1.17116 1.18059 0.02638 [-0.1%] (0.26531) (0.26952) (0.01104) [-0.4%] 0.05 chromium (whole) 0.90236 0.90775 0.02628 [-1.0%] 0.005 (0.09984) (0.10367) (0.01333) [-1.3%] big (400k) 1.36681 1.37599 0.05667 [-0.7%] 0.005 (0.14929) (0.15182) (0.01614) [-1.0%] 0.005 total 3.80028 3.83688 0.13189 [-0.5%] 0.01 (0.87682) (0.89757) (0.11003) [-0.5%] 0.05
1 parent 8338f98 commit 8dfda23

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

lua/wincent/commandt/lib/score.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
// Use a struct to make passing params during recursion easier.
1515
typedef struct {
1616
haystack_t *haystack;
17+
const char *haystack_p;
1718
const char *needle_p;
1819
size_t needle_length;
1920
size_t *rightmost_match_p; // Rightmost match for each char in needle.
@@ -35,7 +36,7 @@ static float recursive_match(
3536
) {
3637
float *memoized = NULL;
3738
float seen_score = 0.0f;
38-
const char *haystack_contents = m->haystack->candidate->contents;
39+
const char *haystack_contents = m->haystack_p;
3940

4041
// Iterate over needle.
4142
for (size_t i = needle_idx; i < m->needle_length; i++) {
@@ -118,6 +119,7 @@ float commandt_score(haystack_t *haystack, matcher_t *matcher, bool ignore_case)
118119
matchinfo_t m;
119120
bool compute_bitmasks = haystack->bitmask == UNSET_BITMASK;
120121
m.haystack = haystack;
122+
m.haystack_p = m.haystack->candidate->contents;
121123
m.needle_p = matcher->needle;
122124
m.needle_length = matcher->needle_length;
123125
m.rightmost_match_p = NULL;
@@ -132,9 +134,8 @@ float commandt_score(haystack_t *haystack, matcher_t *matcher, bool ignore_case)
132134
// Filter out dot files.
133135
if (m.never_show_dot_files || !m.always_show_dot_files) {
134136
for (size_t i = 0; i < m.haystack->candidate->length; i++) {
135-
char c = m.haystack->candidate->contents[i];
136-
if (c == '.' &&
137-
(i == 0 || m.haystack->candidate->contents[i - 1] == '/')) {
137+
char c = m.haystack_p[i];
138+
if (c == '.' && (i == 0 || m.haystack_p[i - 1] == '/')) {
138139
return -1.0f;
139140
}
140141
}
@@ -158,7 +159,7 @@ float commandt_score(haystack_t *haystack, matcher_t *matcher, bool ignore_case)
158159
size_t haystack_idx = haystack_len ? haystack_len - 1 : 0;
159160
long mask = 0;
160161
bool found_needle = false;
161-
const char *haystack_contents = m.haystack->candidate->contents;
162+
const char *haystack_contents = m.haystack_p;
162163
if (haystack_len) {
163164
while (haystack_idx >= needle_idx) {
164165
char c = haystack_contents[haystack_idx];
@@ -222,9 +223,7 @@ float commandt_score(haystack_t *haystack, matcher_t *matcher, bool ignore_case)
222223
char formatted[8];
223224
if (i % m.needle_length == 0) {
224225
long haystack_idx = i / m.needle_length;
225-
fprintf(
226-
stdout, "%c: ", m.haystack->candidate->contents[haystack_idx]
227-
);
226+
fprintf(stdout, "%c: ", m.haystack_p[haystack_idx]);
228227
}
229228
if (memo[i] == UNSET_SCORE) {
230229
snprintf(formatted, sizeof(formatted), " - ");

0 commit comments

Comments
 (0)