diff options
Diffstat (limited to 'lua/impatient/profile.lua')
| -rw-r--r-- | lua/impatient/profile.lua | 145 | 
1 files changed, 145 insertions, 0 deletions
| diff --git a/lua/impatient/profile.lua b/lua/impatient/profile.lua new file mode 100644 index 00000000..0f4f8236 --- /dev/null +++ b/lua/impatient/profile.lua @@ -0,0 +1,145 @@ +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 | 
