vim-patch:9.0.0622: matchaddpos() can get slow when adding many matches

Problem:    matchaddpos() can get slow when adding many matches.
Solution:   Update the next available match ID when manually picking an ID and
            remove check if the available ID can be used. (idea by Rick Howe)
9f573a8df0
This commit is contained in:
zeertzjq
2022-10-01 21:59:53 +08:00
parent 85c7d4f7a9
commit cb310d2901
5 changed files with 25 additions and 126 deletions

View File

@@ -58,16 +58,26 @@ static int match_add(win_T *wp, const char *const grp, const char *const pat, in
(int64_t)id);
return -1;
}
if (id != -1) {
cur = wp->w_match_head;
while (cur != NULL) {
if (id == -1) {
// use the next available match ID
id = wp->w_next_match_id++;
} else {
// check the given ID is not already in use
for (cur = wp->w_match_head; cur != NULL; cur = cur->mit_next) {
if (cur->mit_id == id) {
semsg(_("E801: ID already taken: %" PRId64), (int64_t)id);
return -1;
}
cur = cur->mit_next;
}
// Make sure the next match ID is always higher than the highest
// manually selected ID. Add some extra in case a few more IDs are
// added soon.
if (wp->w_next_match_id < id + 100) {
wp->w_next_match_id = id + 100;
}
}
if ((hlg_id = syn_check_group(grp, strlen(grp))) == 0) {
return -1;
}
@@ -76,18 +86,6 @@ static int match_add(win_T *wp, const char *const grp, const char *const pat, in
return -1;
}
// Find available match ID.
while (id == -1) {
cur = wp->w_match_head;
while (cur != NULL && cur->mit_id != wp->w_next_match_id) {
cur = cur->mit_next;
}
if (cur == NULL) {
id = wp->w_next_match_id;
}
wp->w_next_match_id++;
}
// Build new match.
m = xcalloc(1, sizeof(matchitem_T));
if (pos_list != NULL) {