Vim предлагает команду :profile
, которая очень удобна.Но он ограничен сценарием Vim - когда дело доходит до плагинов, реализованных на python, это не так полезно.
В настоящее время я пытаюсь понять, что вызывает большую задержку на Denite .Поскольку это не происходит в vanilla Vim, но только при определенных условиях, которые я не знаю, как воспроизвести, я не смог найти, какой параметр / плагин мешает.
Поэтому я перешел к профилированию,и это то, что я получил от :profile
:
FUNCTION denite#vim#_start()
Defined: ~/.vim/bundle/denite.nvim/autoload/denite/vim.vim line 33
Called 1 time
Total time: 5.343388
Self time: 4.571928
count total (s) self (s)
1 0.000006 python3 << EOF
def _temporary_scope():
nvim = denite.rplugin.Neovim(vim)
try:
buffer_name = nvim.eval('a:context')['buffer_name']
if nvim.eval('a:context')['buffer_name'] not in denite__uis:
denite__uis[buffer_name] = denite.ui.default.Default(nvim)
denite__uis[buffer_name].start(
denite.rplugin.reform_bytes(nvim.eval('a:sources')),
denite.rplugin.reform_bytes(nvim.eval('a:context')),
)
except Exception as e:
import traceback
for line in traceback.format_exc().splitlines():
denite.util.error(nvim, line)
denite.util.error(nvim, 'Please execute :messages command.')
_temporary_scope()
if _temporary_scope in dir():
del _temporary_scope
EOF
1 0.000017 return []
(...)
FUNCTIONS SORTED ON TOTAL TIME
count total (s) self (s) function
1 5.446612 0.010563 denite#helper#call_denite()
1 5.396337 0.000189 denite#start()
1 5.396148 0.000195 <SNR>237_start()
1 5.343388 4.571928 denite#vim#_start()
(...)
Я попытался использовать непосредственно в профилировщике python , обернув основную строку:
import cProfile
cProfile.run(_temporary_scope(), '/path/to/log/file')
, но не повезло - просто куча ошибок из cProfile.Возможно, это потому, что Python запускается из Vim, так как намекает здесь , что он работает только в основном потоке.
Я думаю, должен быть более простой способ сделать это.