profile.lua 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. local M = {}
  2. local api = vim.api
  3. function M.print_profile(profile)
  4. if not profile then
  5. print "Error: profiling was not enabled"
  6. return
  7. end
  8. local total_resolve = 0
  9. local total_load = 0
  10. local name_pad = 0
  11. local modules = {}
  12. local plugins = {}
  13. for module, p in pairs(profile) do
  14. p.resolve = p.resolve / 1000000
  15. p.load = p.load / 1000000
  16. p.total = p.resolve + p.load
  17. p.module = module:gsub("/", ".")
  18. local plugin = p.module:match "([^.]+)"
  19. if plugin then
  20. if not plugins[plugin] then
  21. plugins[plugin] = {
  22. module = plugin,
  23. resolve = 0,
  24. load = 0,
  25. total = 0,
  26. }
  27. end
  28. local r = plugins[plugin]
  29. r.resolve = r.resolve + p.resolve
  30. r.load = r.load + p.load
  31. r.total = r.total + p.total
  32. if not r.loader then
  33. r.loader = p.loader
  34. elseif r.loader ~= p.loader then
  35. r.loader = "mixed"
  36. end
  37. end
  38. total_resolve = total_resolve + p.resolve
  39. total_load = total_load + p.load
  40. if #module > name_pad then
  41. name_pad = #module
  42. end
  43. modules[#modules + 1] = p
  44. end
  45. table.sort(modules, function(a, b)
  46. return a.module > b.module
  47. end)
  48. do
  49. local plugins_a = {}
  50. for _, v in pairs(plugins) do
  51. plugins_a[#plugins_a + 1] = v
  52. end
  53. plugins = plugins_a
  54. end
  55. table.sort(plugins, function(a, b)
  56. return a.total > b.total
  57. end)
  58. local lines = {}
  59. local function add(...)
  60. lines[#lines + 1] = string.format(...)
  61. end
  62. local l = string.rep("─", name_pad + 1)
  63. add(
  64. "%s┬───────────┬────────────┬────────────┬────────────┐",
  65. l
  66. )
  67. add("%-" .. name_pad .. "s │ Loader │ Resolve │ Load │ Total │", "")
  68. add(
  69. "%s┼───────────┼────────────┼────────────┼────────────┤",
  70. l
  71. )
  72. add(
  73. "%-" .. name_pad .. "s │ │ %8.4fms │ %8.4fms │ %8.4fms │",
  74. "Total",
  75. total_resolve,
  76. total_load,
  77. total_resolve + total_load
  78. )
  79. add(
  80. "%s┴───────────┴────────────┴────────────┴────────────┤",
  81. l
  82. )
  83. add("%-" .. name_pad .. "s │", "By Plugin")
  84. add(
  85. "%s┬───────────┬────────────┬────────────┬────────────┤",
  86. l
  87. )
  88. for _, p in ipairs(plugins) do
  89. add(
  90. "%-" .. name_pad .. "s │ %9s │ %8.4fms │ %8.4fms │ %8.4fms │",
  91. p.module,
  92. p.loader,
  93. p.resolve,
  94. p.load,
  95. p.total
  96. )
  97. end
  98. add(
  99. "%s┴───────────┴────────────┴────────────┴────────────┤",
  100. l
  101. )
  102. add("%-" .. name_pad .. "s │", "By Module")
  103. add(
  104. "%s┬───────────┬────────────┬────────────┬────────────┤",
  105. l
  106. )
  107. for _, p in pairs(modules) do
  108. add(
  109. "%-" .. name_pad .. "s │ %9s │ %8.4fms │ %8.4fms │ %8.4fms │",
  110. p.module,
  111. p.loader,
  112. p.resolve,
  113. p.load,
  114. p.total
  115. )
  116. end
  117. add(
  118. "%s┴───────────┴────────────┴────────────┴────────────┘",
  119. l
  120. )
  121. local bufnr = api.nvim_create_buf(false, false)
  122. api.nvim_buf_set_lines(bufnr, 0, 0, false, lines)
  123. api.nvim_buf_set_option(bufnr, "buftype", "nofile")
  124. api.nvim_buf_set_name(bufnr, "Impatient Profile Report")
  125. api.nvim_set_current_buf(bufnr)
  126. end
  127. return M