aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-07-12 10:38:53 +0800
committerGitHub <noreply@github.com>2023-07-12 10:38:53 +0800
commitef94fb69c65bc2e4c67826de6373c202b55b7d5a (patch)
tree8809b5a23866e60b1220e7a187c41f2119361bbf
parentbf52fb7193ca08ceca292cfca9156380a6661979 (diff)
downloadrneovim-ef94fb69c65bc2e4c67826de6373c202b55b7d5a.tar.gz
rneovim-ef94fb69c65bc2e4c67826de6373c202b55b7d5a.tar.bz2
rneovim-ef94fb69c65bc2e4c67826de6373c202b55b7d5a.zip
perf(extmarks): don't handle inline virt_text if there is none (#24322)
Extreme testcase: ```lua vim.fn.setline(1, 'foobar') local ns = vim.api.nvim_create_namespace('') for _ = 1, 100000 do vim.api.nvim_buf_set_extmark(0, ns, 0, 3, {}) end local start_time = vim.loop.hrtime() vim.fn.virtcol('$') local stop_time = vim.loop.hrtime() print(stop_time - start_time) ``` Before #20130: 31696 On master branch: 26191344 After this PR: 37692
-rw-r--r--src/nvim/drawline.c2
-rw-r--r--src/nvim/plines.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c
index 6bf9dc845d..5aa9a76222 100644
--- a/src/nvim/drawline.c
+++ b/src/nvim/drawline.c
@@ -1831,7 +1831,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool number_onl
&& wlv.vcol == wp->w_virtcol));
extmark_attr = decor_redraw_col(wp, (colnr_T)v, wlv.off, selected, &decor_state);
- if (!has_fold) {
+ if (!has_fold && wp->w_buffer->b_virt_text_inline > 0) {
handle_inline_virtual_text(wp, &wlv, v);
if (wlv.n_extra > 0 && wlv.virt_inline_hl_mode <= kHlModeReplace) {
// restore search_attr and area_attr when n_extra is down to zero
diff --git a/src/nvim/plines.c b/src/nvim/plines.c
index df1414bc8f..73b15edb27 100644
--- a/src/nvim/plines.c
+++ b/src/nvim/plines.c
@@ -329,7 +329,7 @@ void init_chartabsize_arg(chartabsize_T *cts, win_T *wp, linenr_T lnum, colnr_T
cts->cts_has_virt_text = false;
cts->cts_row = lnum - 1;
- if (cts->cts_row >= 0) {
+ if (cts->cts_row >= 0 && wp->w_buffer->b_virt_text_inline > 0) {
marktree_itr_get(wp->w_buffer->b_marktree, cts->cts_row, 0, cts->cts_iter);
mtkey_t mark = marktree_itr_current(cts->cts_iter);
if (mark.pos.row == cts->cts_row) {