Как профилировать плагин vim, написанный на python - PullRequest
0 голосов
/ 13 декабря 2018

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, так как намекает здесь , что он работает только в основном потоке.

Я думаю, должен быть более простой способ сделать это.

1 Ответ

0 голосов
/ 13 декабря 2018

Профилировщик Python работает, заключая в себе весь код,

cProfile.run("""
(...)
""", '/path/to/log/file')

, но это не так полезно.Может быть, это все, что возможно.

...