diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2023-11-29 22:39:54 +0000 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2023-11-29 22:39:54 +0000 |
commit | 21cb7d04c387e4198ca8098a884c78b56ffcf4c2 (patch) | |
tree | 84fe5690df1551f0bb2bdfe1a13aacd29ebc1de7 /test/benchmark | |
parent | d9c904f85a23a496df4eb6be42aa43f007b22d50 (diff) | |
parent | 4a8bf24ac690004aedf5540fa440e788459e5e34 (diff) | |
download | rneovim-colorcolchar.tar.gz rneovim-colorcolchar.tar.bz2 rneovim-colorcolchar.zip |
Merge remote-tracking branch 'upstream/master' into colorcolcharcolorcolchar
Diffstat (limited to 'test/benchmark')
-rw-r--r-- | test/benchmark/autocmd_spec.lua | 175 | ||||
-rw-r--r-- | test/benchmark/bench_regexp_spec.lua | 2 | ||||
-rw-r--r-- | test/benchmark/iter_spec.lua | 215 | ||||
-rw-r--r-- | test/benchmark/treesitter_spec.lua | 4 |
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) |