mirror of
https://github.com/LunarVim/LunarVim.git
synced 2024-09-21 11:05:08 +02:00
145 lines
3.9 KiB
Lua
145 lines
3.9 KiB
Lua
local M = {}
|
|
|
|
local api = vim.api
|
|
|
|
function M.print_profile(profile)
|
|
if not profile then
|
|
print "Error: profiling was not enabled"
|
|
return
|
|
end
|
|
|
|
local total_resolve = 0
|
|
local total_load = 0
|
|
local name_pad = 0
|
|
local modules = {}
|
|
local plugins = {}
|
|
|
|
for module, p in pairs(profile) do
|
|
p.resolve = p.resolve / 1000000
|
|
p.load = p.load / 1000000
|
|
p.total = p.resolve + p.load
|
|
p.module = module:gsub("/", ".")
|
|
|
|
local plugin = p.module:match "([^.]+)"
|
|
if plugin then
|
|
if not plugins[plugin] then
|
|
plugins[plugin] = {
|
|
module = plugin,
|
|
resolve = 0,
|
|
load = 0,
|
|
total = 0,
|
|
}
|
|
end
|
|
local r = plugins[plugin]
|
|
|
|
r.resolve = r.resolve + p.resolve
|
|
r.load = r.load + p.load
|
|
r.total = r.total + p.total
|
|
|
|
if not r.loader then
|
|
r.loader = p.loader
|
|
elseif r.loader ~= p.loader then
|
|
r.loader = "mixed"
|
|
end
|
|
end
|
|
|
|
total_resolve = total_resolve + p.resolve
|
|
total_load = total_load + p.load
|
|
|
|
if #module > name_pad then
|
|
name_pad = #module
|
|
end
|
|
|
|
modules[#modules + 1] = p
|
|
end
|
|
|
|
table.sort(modules, function(a, b)
|
|
return a.module > b.module
|
|
end)
|
|
|
|
do
|
|
local plugins_a = {}
|
|
for _, v in pairs(plugins) do
|
|
plugins_a[#plugins_a + 1] = v
|
|
end
|
|
plugins = plugins_a
|
|
end
|
|
|
|
table.sort(plugins, function(a, b)
|
|
return a.total > b.total
|
|
end)
|
|
|
|
local lines = {}
|
|
local function add(...)
|
|
lines[#lines + 1] = string.format(...)
|
|
end
|
|
|
|
local l = string.rep("─", name_pad + 1)
|
|
|
|
add(
|
|
"%s┬───────────┬────────────┬────────────┬────────────┐",
|
|
l
|
|
)
|
|
add("%-" .. name_pad .. "s │ Loader │ Resolve │ Load │ Total │", "")
|
|
add(
|
|
"%s┼───────────┼────────────┼────────────┼────────────┤",
|
|
l
|
|
)
|
|
add(
|
|
"%-" .. name_pad .. "s │ │ %8.4fms │ %8.4fms │ %8.4fms │",
|
|
"Total",
|
|
total_resolve,
|
|
total_load,
|
|
total_resolve + total_load
|
|
)
|
|
add(
|
|
"%s┴───────────┴────────────┴────────────┴────────────┤",
|
|
l
|
|
)
|
|
add("%-" .. name_pad .. "s │", "By Plugin")
|
|
add(
|
|
"%s┬───────────┬────────────┬────────────┬────────────┤",
|
|
l
|
|
)
|
|
for _, p in ipairs(plugins) do
|
|
add(
|
|
"%-" .. name_pad .. "s │ %9s │ %8.4fms │ %8.4fms │ %8.4fms │",
|
|
p.module,
|
|
p.loader,
|
|
p.resolve,
|
|
p.load,
|
|
p.total
|
|
)
|
|
end
|
|
add(
|
|
"%s┴───────────┴────────────┴────────────┴────────────┤",
|
|
l
|
|
)
|
|
add("%-" .. name_pad .. "s │", "By Module")
|
|
add(
|
|
"%s┬───────────┬────────────┬────────────┬────────────┤",
|
|
l
|
|
)
|
|
for _, p in pairs(modules) do
|
|
add(
|
|
"%-" .. name_pad .. "s │ %9s │ %8.4fms │ %8.4fms │ %8.4fms │",
|
|
p.module,
|
|
p.loader,
|
|
p.resolve,
|
|
p.load,
|
|
p.total
|
|
)
|
|
end
|
|
add(
|
|
"%s┴───────────┴────────────┴────────────┴────────────┘",
|
|
l
|
|
)
|
|
|
|
local bufnr = api.nvim_create_buf(false, false)
|
|
api.nvim_buf_set_lines(bufnr, 0, 0, false, lines)
|
|
api.nvim_buf_set_option(bufnr, "buftype", "nofile")
|
|
api.nvim_buf_set_name(bufnr, "Impatient Profile Report")
|
|
api.nvim_set_current_buf(bufnr)
|
|
end
|
|
|
|
return M
|