aboutsummaryrefslogtreecommitdiff
path: root/test/benchmark
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2023-11-29 21:52:58 +0000
committerJosh Rahm <joshuarahm@gmail.com>2023-11-29 21:52:58 +0000
commit931bffbda3668ddc609fc1da8f9eb576b170aa52 (patch)
treed8c1843a95da5ea0bb4acc09f7e37843d9995c86 /test/benchmark
parent142d9041391780ac15b89886a54015fdc5c73995 (diff)
parent4a8bf24ac690004aedf5540fa440e788459e5e34 (diff)
downloadrneovim-userreg.tar.gz
rneovim-userreg.tar.bz2
rneovim-userreg.zip
Merge remote-tracking branch 'upstream/master' into userreguserreg
Diffstat (limited to 'test/benchmark')
-rw-r--r--test/benchmark/autocmd_spec.lua175
-rw-r--r--test/benchmark/bench_regexp_spec.lua2
-rw-r--r--test/benchmark/iter_spec.lua215
-rw-r--r--test/benchmark/treesitter_spec.lua4
4 files changed, 393 insertions, 3 deletions
diff --git a/test/benchmark/autocmd_spec.lua b/test/benchmark/autocmd_spec.lua
new file mode 100644
index 0000000000..cd1af23640
--- /dev/null
+++ b/test/benchmark/autocmd_spec.lua
@@ -0,0 +1,175 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local exec_lua = helpers.exec_lua
+
+local N = 7500
+
+describe('autocmd 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('nvim_create_autocmd, nvim_del_autocmd (same pattern)', function()
+ exec_lua([[
+ local N = ...
+ local ids = {}
+
+ start()
+ for i = 1, N do
+ ids[i] = vim.api.nvim_create_autocmd('User', {
+ pattern = 'Benchmark',
+ command = 'eval 0', -- noop
+ })
+ end
+ stop('nvim_create_autocmd')
+
+ start()
+ for i = 1, N do
+ vim.api.nvim_del_autocmd(ids[i])
+ end
+ stop('nvim_del_autocmd')
+ ]], N)
+ end)
+
+ it('nvim_create_autocmd, nvim_del_autocmd (unique patterns)', function()
+ exec_lua([[
+ local N = ...
+ local ids = {}
+
+ start()
+ for i = 1, N do
+ ids[i] = vim.api.nvim_create_autocmd('User', {
+ pattern = 'Benchmark' .. i,
+ command = 'eval 0', -- noop
+ })
+ end
+ stop('nvim_create_autocmd')
+
+ start()
+ for i = 1, N do
+ vim.api.nvim_del_autocmd(ids[i])
+ end
+ stop('nvim_del_autocmd')
+ ]], N)
+ end)
+
+ it('nvim_create_autocmd + nvim_del_autocmd', function()
+ exec_lua([[
+ local N = ...
+
+ start()
+ for _ = 1, N do
+ local id = vim.api.nvim_create_autocmd('User', {
+ pattern = 'Benchmark',
+ command = 'eval 0', -- noop
+ })
+ vim.api.nvim_del_autocmd(id)
+ end
+ stop('nvim_create_autocmd + nvim_del_autocmd')
+ ]], N)
+ end)
+
+ it('nvim_exec_autocmds (same pattern)', function()
+ exec_lua([[
+ local N = ...
+
+ for i = 1, N do
+ vim.api.nvim_create_autocmd('User', {
+ pattern = 'Benchmark',
+ command = 'eval 0', -- noop
+ })
+ end
+
+ start()
+ vim.api.nvim_exec_autocmds('User', { pattern = 'Benchmark', modeline = false })
+ stop('nvim_exec_autocmds')
+ ]], N)
+ end)
+
+ it('nvim_del_augroup_by_id', function()
+ exec_lua([[
+ local N = ...
+ local group = vim.api.nvim_create_augroup('Benchmark', {})
+
+ for i = 1, N do
+ vim.api.nvim_create_autocmd('User', {
+ pattern = 'Benchmark',
+ command = 'eval 0', -- noop
+ group = group,
+ })
+ end
+
+ start()
+ vim.api.nvim_del_augroup_by_id(group)
+ stop('nvim_del_augroup_by_id')
+ ]], N)
+ end)
+
+ it('nvim_del_augroup_by_name', function()
+ exec_lua([[
+ local N = ...
+ local group = vim.api.nvim_create_augroup('Benchmark', {})
+
+ for i = 1, N do
+ vim.api.nvim_create_autocmd('User', {
+ pattern = 'Benchmark',
+ command = 'eval 0', -- noop
+ group = group,
+ })
+ end
+
+ start()
+ vim.api.nvim_del_augroup_by_name('Benchmark')
+ stop('nvim_del_augroup_by_id')
+ ]], N)
+ end)
+
+ it(':autocmd, :autocmd! (same pattern)', function()
+ exec_lua([[
+ local N = ...
+
+ start()
+ for i = 1, N do
+ vim.cmd('autocmd User Benchmark eval 0')
+ end
+ stop(':autocmd')
+
+ start()
+ vim.cmd('autocmd! User Benchmark')
+ stop(':autocmd!')
+ ]], N)
+ end)
+
+ it(':autocmd, :autocmd! (unique patterns)', function()
+ exec_lua([[
+ local N = ...
+
+ start()
+ for i = 1, N do
+ vim.cmd(('autocmd User Benchmark%d eval 0'):format(i))
+ end
+ stop(':autocmd')
+
+ start()
+ vim.cmd('autocmd! User')
+ stop(':autocmd!')
+ ]], N)
+ end)
+end)
diff --git a/test/benchmark/bench_regexp_spec.lua b/test/benchmark/bench_regexp_spec.lua
index 903af5f574..6128549f0f 100644
--- a/test/benchmark/bench_regexp_spec.lua
+++ b/test/benchmark/bench_regexp_spec.lua
@@ -7,7 +7,7 @@ local clear, command = helpers.clear, helpers.command
-- Temporary file for gathering benchmarking results for each regexp engine.
local result_file = 'benchmark.out'
-- Fixture containing an HTML fragment that can make a search appear to freeze.
-local sample_file = 'src/nvim/testdir/samples/re.freeze.txt'
+local sample_file = 'test/old/testdir/samples/re.freeze.txt'
-- Vim script code that does both the work and the benchmarking of that work.
local measure_cmd =
diff --git a/test/benchmark/iter_spec.lua b/test/benchmark/iter_spec.lua
new file mode 100644
index 0000000000..d176079997
--- /dev/null
+++ b/test/benchmark/iter_spec.lua
@@ -0,0 +1,215 @@
+local N = 500
+local test_table_size = 100000
+
+describe('vim.iter perf', function()
+ local function mean(t)
+ assert(#t > 0)
+ local sum = 0
+ for _, v in ipairs(t) do
+ sum = sum + v
+ end
+ return sum / #t
+ end
+
+ local function median(t)
+ local len = #t
+ if len % 2 == 0 then
+ return t[len / 2]
+ end
+ return t[(len + 1) / 2]
+ end
+
+ -- Assert that results are equal between each benchmark
+ local last = nil
+
+ local function reset()
+ last = nil
+ end
+
+ local input = {}
+ for i = 1, test_table_size do
+ input[#input + 1] = i
+ end
+
+ local function measure(f)
+ local stats = {}
+ local result
+ for _ = 1, N do
+ local tic = vim.uv.hrtime()
+ result = f(input)
+ local toc = vim.uv.hrtime()
+ stats[#stats + 1] = (toc - tic) / 1000000
+ end
+ table.sort(stats)
+ print(
+ string.format(
+ '\nMin: %0.6f ms, Max: %0.6f ms, Median: %0.6f ms, Mean: %0.6f ms',
+ math.min(unpack(stats)),
+ math.max(unpack(stats)),
+ median(stats),
+ mean(stats)
+ )
+ )
+
+ if last ~= nil then
+ assert(#result == #last)
+ for i, v in ipairs(result) do
+ if type(v) == 'string' or type(v) == 'number' then
+ assert(last[i] == v)
+ elseif type(v) == 'table' then
+ for k, vv in pairs(v) do
+ assert(last[i][k] == vv)
+ end
+ end
+ end
+ end
+
+ last = result
+ end
+
+ describe('list like table', function()
+ describe('simple map', function()
+ reset()
+
+ it('vim.iter', function()
+ local function f(t)
+ return vim
+ .iter(t)
+ :map(function(v)
+ return v * 2
+ end)
+ :totable()
+ end
+ measure(f)
+ end)
+
+ it('for loop', function()
+ local function f(t)
+ local res = {}
+ for i = 1, #t do
+ res[#res + 1] = t[i] * 2
+ end
+ return res
+ end
+ measure(f)
+ end)
+ end)
+
+ describe('filter, map, skip, reverse', function()
+ reset()
+
+ it('vim.iter', function()
+ local function f(t)
+ local i = 0
+ return vim
+ .iter(t)
+ :map(function(v)
+ i = i + 1
+ if i % 2 == 0 then
+ return v * 2
+ end
+ end)
+ :skip(1000)
+ :rev()
+ :totable()
+ end
+ measure(f)
+ end)
+
+ it('tables', function()
+ local function f(t)
+ local a = {}
+ for i = 1, #t do
+ if i % 2 == 0 then
+ a[#a + 1] = t[i] * 2
+ end
+ end
+
+ local b = {}
+ for i = 1001, #a do
+ b[#b + 1] = a[i]
+ end
+
+ local c = {}
+ for i = 1, #b do
+ c[#c + 1] = b[#b - i + 1]
+ end
+ return c
+ end
+ measure(f)
+ end)
+ end)
+ end)
+
+ describe('iterator', function()
+ describe('simple map', function()
+ reset()
+ it('vim.iter', function()
+ local function f(t)
+ return vim
+ .iter(ipairs(t))
+ :map(function(i, v)
+ return i + v
+ end)
+ :totable()
+ end
+ measure(f)
+ end)
+
+ it('ipairs', function()
+ local function f(t)
+ local res = {}
+ for i, v in ipairs(t) do
+ res[#res + 1] = i + v
+ end
+ return res
+ end
+ measure(f)
+ end)
+ end)
+
+ describe('multiple stages', function()
+ reset()
+ it('vim.iter', function()
+ local function f(t)
+ return vim
+ .iter(ipairs(t))
+ :map(function(i, v)
+ if i % 2 ~= 0 then
+ return v
+ end
+ end)
+ :map(function(v)
+ return v * 3
+ end)
+ :skip(50)
+ :totable()
+ end
+ measure(f)
+ end)
+
+ it('ipairs', function()
+ local function f(t)
+ local a = {}
+ for i, v in ipairs(t) do
+ if i % 2 ~= 0 then
+ a[#a + 1] = v
+ end
+ end
+ local b = {}
+ for _, v in ipairs(a) do
+ b[#b + 1] = v * 3
+ end
+ local c = {}
+ for i, v in ipairs(b) do
+ if i > 50 then
+ c[#c + 1] = v
+ end
+ end
+ return c
+ end
+ measure(f)
+ end)
+ end)
+ end)
+end)
diff --git a/test/benchmark/treesitter_spec.lua b/test/benchmark/treesitter_spec.lua
index 5ce128c54a..6d82f5de8d 100644
--- a/test/benchmark/treesitter_spec.lua
+++ b/test/benchmark/treesitter_spec.lua
@@ -37,7 +37,7 @@ describe('treesitter perf', function()
return "qq" .. acc .. "q"
end
- local start = vim.loop.hrtime()
+ local start = vim.uv.hrtime()
keys(mk_keys(10))
for _ = 1, 100 do
@@ -45,7 +45,7 @@ describe('treesitter perf', function()
vim.cmd'redraw!'
end
- return vim.loop.hrtime() - start
+ return vim.uv.hrtime() - start
]]
end)