123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- local n = require('test.functional.testnvim')()
- local Screen = require('test.functional.ui.screen')
- local exec_lua = n.exec_lua
- describe('decor perf', function()
- before_each(n.clear)
- it('can handle long lines', function()
- local screen = Screen.new(100, 101)
- screen:attach()
- local result = exec_lua [==[
- local ephemeral_pattern = {
- { 0, 4, 'Comment', 11 },
- { 0, 3, 'Keyword', 12 },
- { 1, 2, 'Label', 12 },
- { 0, 1, 'String', 21 },
- { 1, 3, 'Function', 21 },
- { 2, 10, 'Label', 8 },
- }
- local regular_pattern = {
- { 4, 5, 'String', 12 },
- { 1, 4, 'Function', 2 },
- }
- for _, list in ipairs({ ephemeral_pattern, regular_pattern }) do
- for _, p in ipairs(list) do
- p[3] = vim.api.nvim_get_hl_id_by_name(p[3])
- end
- end
- local text = ('abcdefghijklmnopqrstuvwxyz0123'):rep(333)
- local line_len = #text
- vim.api.nvim_buf_set_lines(0, 0, 0, false, { text })
- local ns = vim.api.nvim_create_namespace('decor_spec.lua')
- vim.api.nvim_buf_clear_namespace(0, ns, 0, -1)
- vim.api.nvim_win_set_cursor(0, { 1, 0 })
- local ps, pe
- local function add_pattern(pattern, ephemeral)
- ps = vim.uv.hrtime()
- local i = 0
- while i < line_len - 10 do
- for _, p in ipairs(pattern) do
- vim.api.nvim_buf_set_extmark(0, ns, 0, i + p[1], {
- end_row = 0,
- end_col = i + p[2],
- hl_group = p[3],
- priority = p[4],
- ephemeral = ephemeral,
- })
- end
- i = i + 5
- end
- pe = vim.uv.hrtime()
- end
- vim.api.nvim_set_decoration_provider(ns, {
- on_win = function()
- return true
- end,
- on_line = function()
- add_pattern(ephemeral_pattern, true)
- end,
- })
- add_pattern(regular_pattern, false)
- local total = {}
- local provider = {}
- for i = 1, 100 do
- local tic = vim.uv.hrtime()
- vim.cmd'redraw!'
- local toc = vim.uv.hrtime()
- table.insert(total, toc - tic)
- table.insert(provider, pe - ps)
- end
- return { total, provider }
- ]==]
- local total, provider = unpack(result)
- table.sort(total)
- table.sort(provider)
- local ms = 1 / 1000000
- local function fmt(stats)
- return string.format(
- 'min, 25%%, median, 75%%, max:\n\t%0.1fms,\t%0.1fms,\t%0.1fms,\t%0.1fms,\t%0.1fms',
- stats[1] * ms,
- stats[1 + math.floor(#stats * 0.25)] * ms,
- stats[1 + math.floor(#stats * 0.5)] * ms,
- stats[1 + math.floor(#stats * 0.75)] * ms,
- stats[#stats] * ms
- )
- end
- print('\nTotal ' .. fmt(total) .. '\nDecoration provider: ' .. fmt(provider))
- end)
- end)
|