Files
neovim/runtime/doc
Yi Ming 558204d87b perf(lsp): clear table by table.clear() #39222
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.
2026-04-22 11:38:58 -04:00
..
2026-04-01 07:59:51 +08:00
2026-04-16 10:48:11 -04:00
2026-04-20 07:09:37 -04:00
2026-02-12 13:46:45 +01:00
2024-05-15 23:19:26 +02:00
2026-04-18 15:38:59 -04:00
2026-04-20 07:09:37 -04:00
2026-04-16 10:48:11 -04:00
2026-04-18 15:38:59 -04:00
2025-12-06 20:33:02 -05:00
2023-06-25 17:14:28 +02:00
2026-04-18 15:38:59 -04:00
2026-01-27 17:14:57 -05:00
2026-04-10 11:08:26 -05:00
2026-04-18 15:38:59 -04:00
2026-03-29 20:53:24 -04:00
2026-04-18 15:38:59 -04:00
2025-12-15 13:55:15 -05:00
2026-03-16 10:29:58 +01:00
2026-02-12 13:46:45 +01:00
2026-04-16 10:48:11 -04:00
2025-09-28 20:57:59 -07:00
2026-03-24 00:14:55 +01:00
2026-04-18 15:38:59 -04:00
2025-12-15 13:55:15 -05:00
2026-04-12 14:17:50 +02:00
2026-03-22 01:57:28 +01:00
2026-04-16 10:48:11 -04:00
2026-04-16 10:48:11 -04:00
2026-03-18 20:40:20 +01:00
2026-04-01 17:04:41 -04:00
2026-01-07 08:11:42 +08:00
2026-03-24 00:14:55 +01:00
2025-12-06 20:33:02 -05:00
2026-04-12 14:17:50 +02:00
2026-04-12 14:17:50 +02:00
2026-03-11 12:39:49 +01:00
2025-12-15 13:55:15 -05:00
2026-04-16 10:48:11 -04:00
2026-03-28 09:59:54 -04:00