diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2023-11-30 20:35:25 +0000 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2023-11-30 20:35:25 +0000 |
commit | 1b7b916b7631ddf73c38e3a0070d64e4636cb2f3 (patch) | |
tree | cd08258054db80bb9a11b1061bb091c70b76926a /test/benchmark/iter_spec.lua | |
parent | eaa89c11d0f8aefbb512de769c6c82f61a8baca3 (diff) | |
parent | 4a8bf24ac690004aedf5540fa440e788459e5e34 (diff) | |
download | rneovim-1b7b916b7631ddf73c38e3a0070d64e4636cb2f3.tar.gz rneovim-1b7b916b7631ddf73c38e3a0070d64e4636cb2f3.tar.bz2 rneovim-1b7b916b7631ddf73c38e3a0070d64e4636cb2f3.zip |
Merge remote-tracking branch 'upstream/master' into aucmd_textputpostaucmd_textputpost
Diffstat (limited to 'test/benchmark/iter_spec.lua')
-rw-r--r-- | test/benchmark/iter_spec.lua | 215 |
1 files changed, 215 insertions, 0 deletions
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) |