【问题标题】:Profiling Vim startup time分析 Vim 启动时间
【发布时间】:2010-12-13 20:29:43
【问题描述】:

我在使用 Vim 时启用了很多插件——这些年来我一直在收集插件。我有点厌倦了 Vim 现在需要多长时间才能启动,所以我想分析一下它的启动情况,看看我拥有的众多插件中的哪一个负责。

有什么方法可以分析 Vim 的启动或脚本运行情况?理想情况下,我想知道 Vim 在它加载的每个 Vim 脚本中花费了多长时间。

【问题讨论】:

    标签: debugging optimization vim profiling


    【解决方案1】:

    如果您使用的是 Vim 7.2.269 或更高版本,则可以使用 --startuptime 选项。

    vim --startuptime vim.log
    

    来自帮助 (vim -h):

    --startuptime <file> Write startup timing messages to <file>
    

    【讨论】:

    • 从补丁 7.2.286 开始,不再需要等号。 "vim --startuptime vim.log"
    • 如果你想让它打印出来,试试vim --startuptime /dev/stdout +qall
    • @barraponto 如果你只想对 vim 的启动进行整体计时,还有 time vim +q
    • 在我的终端上,vim --startuptime /dev/stdout +qallvim --startuptime vim.log +qall; cat vim.log 之间存在显着差异。
    【解决方案2】:

    为了更好地回答您的问题,我创建了this Github 项目。基本上,它使用适当的标志和选项调用vim 的内置分析器,然后总结每个插件的每个函数调用的时间,这在原始vim --profile 输出中并不明显(但很重要)。支持 Bash、Python、R、Ruby 和 Perl(您不需要安装任何东西,因为您很可能已经拥有其中之一)来创建分析结果。

    你会得到这样的结果图:

    连同这样的文本输出:

    Generating vim startup profile...    
    Parsing vim startup profile...     
    Crunching data and generating profile plot ...    
    
    Your plugins startup profile graph is saved     
    as `profile.png` under current directory.    
    
    ==========================================    
    Top 10 Plugins That Slows Down Vim Startup    
    ==========================================    
       1    105.13  "vim-colorschemes"    
       2    42.661  "vim-easytags"    
       3    31.173  "vim-vendetta"    
       4    22.02   "syntastic"    
       5    13.362  "vim-online-thesaurus"    
       6    7.888   "vim-easymotion"    
       7    6.931   "vim-airline"    
       8    6.608   "YankRing.vim"    
       9    5.266   "nerdcommenter"    
      10    5.017   "delimitMate"    
    ==========================================    
    Done!    
    

    【讨论】:

    • 由于声誉低,我无法添加数字。只需在标记前添加! 即可在图中添加。
    • 非常好!也检查了我的 vim,> 60 ms ^.^ 这可以帮助您快速找到使您速度变慢的软件包(在我的情况下仍然没有:D)
    【解决方案3】:

    你可以使用vim自己的分析机制:

    vim --cmd 'profile start profile.log' \
        --cmd 'profile func *' \
        --cmd 'profile file *' \
        -c 'profdel func *' \
        -c 'profdel file *' \
        -c 'qa!'
    

    运行上述程序后,您将在当前目录中找到一个名为 profile.log 的文件,其中包含所有必需的信息。要获得类似于已经存在的 per-function 的 per-script 信息表,请使用(在 vim 中打开此文件后):

    " 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])'))
    

    它将是未排序的,但如果脚本数量过多,您始终可以使用内置的:sort 命令。

    【讨论】:

    • 我没有意识到 vim 有一个分析命令,感谢您指出这一点。
    • @Benj 可以禁用。根据文档,您要么需要具有大量功能的 vim,要么需要在未启用此集的情况下显式启用 +profile 的自编译。
    • 如果可以的话,我会+3。它帮助我追踪了dbext.vim 的签入,这花费了三秒以上github.com/johnsyweb/dotfiles/commit/09c3001
    • @ZyX,如何在 windows shell (gvim) 中执行此操作?它在 Windows gvim 中不起作用。我在 windows shell gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!' 中插入了这个命令,它确实在 vim 中创建了很多空文件。
    • @Remonn 使用双引号。或者来自 cygwin 的 bash。
    【解决方案4】:

    您可以运行vim -V,将输出通过一个添加时间戳的实用程序传输并分析输出。此命令行执行此操作,例如:

    vim -V 2>&1 | perl -MTime::HiRes=time -ne 'print time, ": ", $_' | tee vilog
    

    您可能必须盲目地输入 :q 才能返回提示。之后,您应该在当前目录中找到文件vilog,每行开头都有雇用时间戳。

    如果你可以做到一秒的粒度,你可以这样做:

    vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
    

    【讨论】:

    • 你知道“perl -n”会为你做while () {}。
    • 既然你提到了:是的,我做到了。我将编辑答案以获得更短的命令。谢谢。
    【解决方案5】:

    基于 @hyiltiz 所做的依赖于 R 的工作,我制作了一个分析器的 Python version,因为这在 R 的系统上更常见。

    它也更容易扩展,因此功能是:

    • 插件文件夹的自动检测,
    • 条形图感谢 matplotlib,
    • 对多次执行运行分析以获得平均/标准偏差
    • 同时支持 vimneovim
    • 可与完整的 vim 命令一起使用来测试延迟加载功能、打开具有特定文件类型的文件等,
    • 将结果导出到 csv 文件。

    输出类似于 vim-plugins-profile 提供的:

    $ vim-profiler.py -p nvim
    
    Running nvim to generate startup logs... done.
    Loading and processing logs... done.
    Plugin directory: /home/user/.config/nvim/plugged
    =====================================
    Top 10 plugins slowing nvim's startup
    =====================================
    1         3.326   vim-fugitive
    2         2.936   tcomment_vim
    3         2.315   vim-hybrid
    4         1.751   lightline.vim
    5         0.959   vim-sneak
    6         0.943   supertab
    7         0.542   vim-surround
    8         0.536   fzf.vim
    9         0.450   fzf
    10        0.434   auto-pairs
    =====================================
    

    【讨论】:

    • 这个插件不适用于neovim windows。错误消息是No plugin found
    【解决方案6】:

    我通过 innaM 改进了 vim -V solution 以显示增量时间:

    vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
    

    【讨论】:

      【解决方案7】:

      如果你从 .vimrc 文件加载你的插件,你可以做的是在文件中的某行放置一个 q 以使其退出,这样你就可以使用进程计时器,比如 unix @ 987654322@ 命令。更彻底地说,这看起来像:

      1. 备份现有的.vimrc文件
      2. 注释掉除选定数量的插件之外的所有插件
      3. 插入q
      4. 重复调用time vim 并进行平均
      5. 恢复备份

      这并不优雅,但我认为它可以完成工作。

      【讨论】:

      • 嗯,在紧要关头还不错。我已经将我的 vimrc 拆分成许多单独的文件,所以自动化应该不会太难。
      【解决方案8】:

      打开特定文件时可以很方便地追踪--startime

      gvim app/views/layouts/application.html.erb --startuptime time.log
      

      【讨论】:

        【解决方案9】:

        有一个插件可以分析 vim 的启动时间。

        http://www.vim.org/scripts/script.php?script_id=2915

        【讨论】:

          【解决方案10】:

          难道没有bash time 命令可以这样使用吗:

          time vim
          

          编辑:不包括脚本启动时间。请改用@jamessan 建议。

          【讨论】:

          • 是的,但它只会告诉你 vim 打开和关闭需要多长时间,而不是解析每个脚本需要多长时间。
          猜你喜欢
          • 1970-01-01
          • 2019-08-18
          • 2013-06-15
          • 1970-01-01
          • 1970-01-01
          • 2020-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多