我有许多非常复杂的Vim配置文件,但这些似乎导致了一些不可预测的性能下降。
是否有办法生成Vim内部活动的日志文件(格式为verbosefile
),其中还包含每个函数调用的时间戳,以便我调试这些问题。或者,还有其他工具可以帮助我完成这项任务吗?
非常感谢。
答案 0 :(得分:2)
您可以尝试的一件事是使用--startuptime some_file
调用vim。这将转储启动期间执行的步骤以及时间戳。请尝试:help --startuptime
获取更多信息。
不幸的是,这会显示文件的时间戳,而不是函数。如果要查看特定函数需要多长时间,可以在plugin
目录下的文件中调用它,以便在引导时执行。这在所有情况下都是不可能的,它不会给你很多粒度,但它可能会帮助你缩小问题的范围。其他人可能有更好的想法,但我会先尝试这样的事情。
修改强>:
我刚发现两件可能有助于解决这个问题的事情。其中一个是reltime()
。以下是vim帮助的一个例子:
let start = reltime()
call MyFunction()
echo reltimestr(reltime(start))
它只是显示一个函数执行的时间。结合例如Decho,这可以提供所述函数的简单日志。
第二个应该是更多的powerfule,:profile
命令。它允许您分析一段vimscript并将结果放在一个文件中。 :help profile应该告诉你所有你需要知道的事情。遗憾的是,它仅适用于+profile
功能,该功能似乎仅在“巨大”功能集中启用。如果你的vim没有它,你需要重新编译。如果这是一个问题,或者你不想打扰,你可能只用reltime
就能取得好成绩。
答案 1 :(得分:0)
如果--startuptime不符合您的需要,您可以使用以下命令:
vim --cmd 'profile start profile.log' \
--cmd 'profile func *' \
--cmd 'profile file *' \
-c 'profile pause' \
-c 'qa!'
(将--cmd
替换为-c
,如果在启动时没有出现问题,则添加-c 'Command that causes slowdown'
。您将获得profile.log中的所有计时。具有功能计时的表将出现在文件的末尾,以获得每个脚本的计时,使用以下内容
脚本:
" Open profile.log file in vim first
let timings=[]
g/^SCRIPT/call add(timings, [getline('.')[len('SCRIPT '):], matchstr(getline(line('.')+1), '^Sourced \zs\d\+')]+map(getline(line('.')+2, line('.')+3), 'matchstr(v:val, ''\d\+\.\d\+$'')'))
enew
call setline('.', ['count total (s) self (s) script']+map(copy(timings), 'printf("%5u %9s %8s %s", v:val[1], v:val[2], v:val[3], v:val[0])'))
这将打开一个新文件,其中包含与profile.log末尾相同的表,但是1)用于脚本,而不是用于函数,2)未排序。
答案 2 :(得分:0)
迟到总比没有好?我正在搜索是否可以让vim在&verbosefile
中包含一些时间戳,因为它会导致vim附加到文件中,而不会显示附加的开始时间。
我调整了ZyX's answer here的解决方案,在尝试了一些事情之后,发现一个简单的echo "foo\n"
会追加foo
和一个换行符&verbosefile
:
let s:VerboseLS = ' **** V'.'E'.'RB'.'OSE LO'.'GG'.'ING S'.'TA'.'RTED ****'
let s:VerboseLE = ' **** V'.'E'.'RB'.'OSE LO'.'GG'.'ING E'.'ND'.'ED ****'
function! ToggleVerbose()
let l:timestamp = strftime("%c")
if !&verbose
let l:msg = "\n\n" . l:timestamp . s:VerboseLS . "\n\n"
set verbosefile=~/.vim/log/verbose.log
set verbose=100
echo l:msg
else
let l:msg = "\n" . l:timestamp . s:VerboseLE . "\n"
echo l:msg
set verbose=0
set verbosefile=
endif
endfunction
nnoremap <silent> <Leader>vl :call ToggleVerbose()<CR>
现在我在日志中得到了很好的横幅:
Sun Feb 17 14:18:02 2013 **** VERBOSE LOGGING STARTED ****
...[snip]...
Sun Feb 17 14:18:08 2013 **** VERBOSE LOGGING ENDED ****
我按照我的方式定义了那些横幅,这样如果我在详细日志记录打开的时候获取该脚本文件,那么如果我在日志中搜索“VERBOSE LOGGING”或类似内容,我将无法匹配它们。
因此,如果您的vim reltime
具有亚秒级精度,您可以调整此方法以使用has('reltime')
,并且可以使call
的计时包装器回显开始/结束时间函数调用(虽然在没有call
命令的情况下调用内联函数时必须重构。)
哦,我刚才有一个想法...我想知道&verbosefile
是否可以设置为一个命名管道,该管道转到带有时间戳的util ...让我们看看......