diff options
| author | monkoose <pythonproof@gmail.com> | 2025-05-22 13:00:22 +0300 |
|---|---|---|
| committer | Lewis Russell <me@lewisr.dev> | 2025-05-26 22:41:12 +0100 |
| commit | 5e64d92411737a8fe0ea44faebf986944bfea8ea (patch) | |
| tree | 8c0b72b85adba8951a7bc542225ef690905201cf /test/benchmark | |
| parent | ba1cc9e10c67e9cf8873ba67b2c0d6b8d5ecd6dd (diff) | |
perf(runtime): vim.trim for long only whitespace strings
Diffstat (limited to 'test/benchmark')
| -rw-r--r-- | test/benchmark/trim_spec.lua | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/test/benchmark/trim_spec.lua b/test/benchmark/trim_spec.lua new file mode 100644 index 0000000000..29b7793c36 --- /dev/null +++ b/test/benchmark/trim_spec.lua @@ -0,0 +1,70 @@ +describe('vim.trim()', function() + --- @param t number[] + local function mean(t) + assert(#t > 0) + local sum = 0 + for _, v in ipairs(t) do + sum = sum + v + end + return sum / #t + end + + --- @param t number[] + local function median(t) + local len = #t + if len % 2 == 0 then + return t[len / 2] + end + return t[(len + 1) / 2] + end + + --- @param f fun(t: number[]): table<number, number|string|table> + local function measure(f, input, N) + local stats = {} ---@type number[] + for _ = 1, N do + local tic = vim.uv.hrtime() + f(input) + local toc = vim.uv.hrtime() + stats[#stats + 1] = (toc - tic) / 1000000 + end + table.sort(stats) + print( + string.format( + '\nN: %d, Min: %0.6f ms, Max: %0.6f ms, Median: %0.6f ms, Mean: %0.6f ms', + N, + math.min(unpack(stats)), + math.max(unpack(stats)), + median(stats), + mean(stats) + ) + ) + end + + local strings = { + ['10000 whitespace characters'] = string.rep(' ', 10000), + ['10000 whitespace characters and one non-whitespace at the end'] = string.rep(' ', 10000) + .. '0', + ['10000 whitespace characters and one non-whitespace at the start'] = '0' + .. string.rep(' ', 10000), + ['10000 non-whitespace characters'] = string.rep('0', 10000), + ['10000 whitespace and one non-whitespace in the middle'] = string.rep(' ', 5000) + .. 'a' + .. string.rep(' ', 5000), + ['10000 whitespace characters surrounded by non-whitespace'] = '0' + .. string.rep(' ', 10000) + .. '0', + ['10000 non-whitespace characters surrounded by whitespace'] = ' ' + .. string.rep('0', 10000) + .. ' ', + } + + --- @type string[] + local string_names = vim.tbl_keys(strings) + table.sort(string_names) + + for _, name in ipairs(string_names) do + it(name, function() + measure(vim.trim, strings[name], 100) + end) + end +end) |
