summaryrefslogtreecommitdiff
path: root/.config/nvim/lua/impatient/profile.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/lua/impatient/profile.lua')
-rw-r--r--.config/nvim/lua/impatient/profile.lua156
1 files changed, 156 insertions, 0 deletions
diff --git a/.config/nvim/lua/impatient/profile.lua b/.config/nvim/lua/impatient/profile.lua
new file mode 100644
index 0000000..d057386
--- /dev/null
+++ b/.config/nvim/lua/impatient/profile.lua
@@ -0,0 +1,156 @@
+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