vim.opt.runtimepath:prepend('scripts/benchmark.nvim') vim.opt.runtimepath:prepend('.') local bm = require('benchmark') bm.sandbox() ---@module 'canola' ---@type canola.SetupOpts local setup_opts = { -- columns = { "icon", "permissions", "size", "mtime" }, } local DIR_SIZE = tonumber(vim.env.DIR_SIZE) or 100000 local ITERATIONS = tonumber(vim.env.ITERATIONS) or 10 local WARM_UP = tonumber(vim.env.WARM_UP) or 1 local OUTLIERS = tonumber(vim.env.OUTLIERS) or math.floor(ITERATIONS / 10) local TEST_DIR = 'perf/tmp/test_' .. DIR_SIZE vim.fn.mkdir(TEST_DIR, 'p') require('benchmark.files').create_files(TEST_DIR, 'file %d.txt', DIR_SIZE) -- selene: allow(global_usage) function _G.jit_profile() require('canola').setup(setup_opts) local finish = bm.jit_profile({ filename = TEST_DIR .. '/profile.txt' }) bm.wait_for_user_event('CanolaEnter', function() finish() end) require('canola').open(TEST_DIR) end -- selene: allow(global_usage) function _G.flame_profile() local start, stop = bm.flame_profile({ pattern = 'canola*', filename = 'profile.json', }) require('canola').setup(setup_opts) start() bm.wait_for_user_event('CanolaEnter', function() stop(function() vim.cmd.qall({ mods = { silent = true } }) end) end) require('canola').open(TEST_DIR) end -- selene: allow(global_usage) function _G.benchmark() require('canola').setup(setup_opts) bm.run({ title = 'canola.nvim', iterations = ITERATIONS, warm_up = WARM_UP }, function(callback) bm.wait_for_user_event('CanolaEnter', callback) require('canola').open(TEST_DIR) end, function(times) local avg = bm.avg(times, { trim_outliers = OUTLIERS }) local std_dev = bm.std_dev(times, { trim_outliers = OUTLIERS }) local lines = { table.concat(vim.tbl_map(bm.format_time, times), ' '), string.format('Average: %s', bm.format_time(avg)), string.format('Std deviation: %s', bm.format_time(std_dev)), } vim.fn.writefile(lines, 'perf/tmp/benchmark.txt') vim.cmd.qall({ mods = { silent = true } }) end) end