aboutsummaryrefslogtreecommitdiff
path: root/test/benchmark/extmark_spec.lua
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-05-03 18:02:25 +0800
committerGitHub <noreply@github.com>2024-05-03 18:02:25 +0800
commitd44ed3a885e163df33cce8180ca9f72fb5c0661a (patch)
tree48c5c793cc69a1bf35c712885bf123e7654e37d7 /test/benchmark/extmark_spec.lua
parentcf9f002f31c8b4d9d42912a3f45f5d3db4462fd9 (diff)
downloadrneovim-d44ed3a885e163df33cce8180ca9f72fb5c0661a.tar.gz
rneovim-d44ed3a885e163df33cce8180ca9f72fb5c0661a.tar.bz2
rneovim-d44ed3a885e163df33cce8180ca9f72fb5c0661a.zip
perf(extmarks): better track whether namespace has extmarks (#28615)
This avoids redraw when adding/removing an empty namespace for a window. This also avoids marktree traversal when clearing a namespace that has already been cleared, which is added as a benchmark.
Diffstat (limited to 'test/benchmark/extmark_spec.lua')
-rw-r--r--test/benchmark/extmark_spec.lua45
1 files changed, 45 insertions, 0 deletions
diff --git a/test/benchmark/extmark_spec.lua b/test/benchmark/extmark_spec.lua
new file mode 100644
index 0000000000..0d284b363c
--- /dev/null
+++ b/test/benchmark/extmark_spec.lua
@@ -0,0 +1,45 @@
+local n = require('test.functional.testnvim')()
+
+local clear = n.clear
+local exec_lua = n.exec_lua
+
+describe('extmark perf', function()
+ before_each(function()
+ clear()
+
+ exec_lua([[
+ out = {}
+ function start()
+ ts = vim.uv.hrtime()
+ end
+ function stop(name)
+ out[#out+1] = ('%14.6f ms - %s'):format((vim.uv.hrtime() - ts) / 1000000, name)
+ end
+ ]])
+ end)
+
+ after_each(function()
+ for _, line in ipairs(exec_lua([[return out]])) do
+ print(line)
+ end
+ end)
+
+ it('repeatedly calling nvim_buf_clear_namespace #28615', function()
+ exec_lua([[
+ vim.api.nvim_buf_set_lines(0, 0, -1, true, { 'foo', 'bar' })
+ local ns0 = vim.api.nvim_create_namespace('ns0')
+ local ns1 = vim.api.nvim_create_namespace('ns1')
+
+ for _ = 1, 10000 do
+ vim.api.nvim_buf_set_extmark(0, ns0, 0, 0, {})
+ end
+ vim.api.nvim_buf_set_extmark(0, ns1, 1, 0, {})
+
+ start()
+ for _ = 1, 10000 do
+ vim.api.nvim_buf_clear_namespace(0, ns1, 0, -1)
+ end
+ stop('nvim_buf_clear_namespace')
+ ]])
+ end)
+end)