mirror of
https://github.com/neovim/neovim.git
synced 2026-05-06 16:29:57 -04:00
558204d87b
benchmark: https://gist.github.com/ofseed/6224529d77c016c36f7ab2f977059848 local rounds = tonumber(arg[1]) or 1000 local count = tonumber(arg[2]) or 1000 -- Load the table.clear function. local clear = require("table.clear") local function fill(t, n) for i = 1, n do t[i] = i end end local function bench_reassign(n_rounds, n_items) local t = {} local start = os.clock() for _ = 1, n_rounds do t = {} collectgarbage("collect") fill(t, n_items) end return os.clock() - start end local function bench_reassign_no_gc(n_rounds, n_items) local t = {} local start = os.clock() for _ = 1, n_rounds do t = {} fill(t, n_items) end return os.clock() - start end local function bench_clear(n_rounds, n_items) local t = {} local start = os.clock() for _ = 1, n_rounds do clear(t) fill(t, n_items) end return os.clock() - start end -- Warm up LuaJIT before the real benchmark. do local t = {} for _ = 1, 2000 do clear(t) fill(t, count) end end collectgarbage("collect") local reassign_time = bench_reassign(rounds, count) collectgarbage("collect") local reassign_no_gc_time = bench_reassign_no_gc(rounds, count) collectgarbage("collect") local clear_time = bench_clear(rounds, count) print(string.format("rounds=%d count=%d", rounds, count)) print(string.format("t = {} + GC : %.6f s", reassign_time)) print(string.format("t = {} : %.6f s", reassign_no_gc_time)) print(string.format("table.clear : %.6f s", clear_time)) print(string.format("vs + GC : %.2fx", reassign_time / clear_time)) print(string.format("vs no GC : %.2fx", reassign_no_gc_time / clear_time)) benchmark result: rounds=1000 count=1000 t = {} + GC : 0.022469 s t = {} : 0.002570 s table.clear : 0.000387 s vs + GC : 58.06x vs no GC : 6.64x `count` is how many items the table has, and `round` is how many rounds we fill the table, clear, and then refill it. `table = {}` is clear the table by resigning a new empty one, because this script does not run persistently like nvim so GC is not triggered, so I added another extreme control group that manually triggers GC.
28 lines
545 B
Lua
28 lines
545 B
Lua
-- Basic shim for LuaJIT's table.new and table.clear.
|
|
local has_new, new = pcall(require, 'table.new')
|
|
local has_clear, clear = pcall(require, 'table.clear')
|
|
|
|
local M = {}
|
|
|
|
if not has_new then
|
|
---@diagnostic disable-next-line: unused-local
|
|
new = function(narr, nrec)
|
|
return {}
|
|
end
|
|
end
|
|
|
|
if not has_clear then
|
|
clear = function(tab)
|
|
---@diagnostic disable-next-line: no-unknown
|
|
for k in pairs(tab) do
|
|
---@diagnostic disable-next-line: no-unknown
|
|
tab[k] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
M.new = new
|
|
M.clear = clear
|
|
|
|
return M
|