1

Vim offers the :profile command, which is really handy. But it is limited to Vim script -- when it comes to plugins implemented in python it isn't that helpful.

Currently I'm trying to understand what is causing a large delay on Denite. As it doesn't happen in vanilla Vim, but only on some specific conditions which I'm not sure how to reproduce, I couldn't find which setting/plugin is interfering.

So I turned to profiling, and this is what I got from :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()
(...)

I tried to use the python profiler directly by wrapping the main line:

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

, but no luck -- just a bunch of errors from cProfile. Perhaps it is because the way python is started from Vim, as it is hinted here that it only works on the main thread.

I guess there should be an easier way of doing this.

mMontu
  • 8,983
  • 4
  • 38
  • 53

1 Answers1

0

The python profiler does work by enclosing the whole code,

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

, but it is not that helpful. Maybe it is all that is possible.

mMontu
  • 8,983
  • 4
  • 38
  • 53