vim-easycomplete icon indicating copy to clipboard operation
vim-easycomplete copied to clipboard

fuzzymatch speed up

Open jayli opened this issue 3 years ago • 7 comments

  • [x] VIM 中用原生matchfuzzy函数代替自定义实现
  • [x] 所有插件的 completor 在确保 directory 正确返回 false 的情况下全部异步掉,确保 firstCompleteRender 等待的时间尽可能的短,副作用是 firstCompleteRender 出来后,哪个插件的 completor 快就先显示哪个,速度参差不齐时会明显感知到菜单在不断的刷新变化
  • [x] snip body 的获取和 sha256 函数优先不走 python
  • [x] 首次匹配的 easycomplete#util#GetVimCompletionItems() 函数耗时最久,造成可肉眼感知的卡顿,一个是函数本身的性能优化,另一个是要减少 lsp 返回的 result 的数量,nim 就给了全量返回,需要先做一层过滤。

比如 snip 的 completor 逻辑修改成:

function! easycomplete#sources#snips#completor(opt, ctx)
  if strlen(l:typing) == 0
    call easycomplete#complete(a:opt['name'], a:ctx, a:ctx['startcol'], [])
    return v:true
  endif
  call easycomplete#util#AsyncRun(function('s:CompleteHandler'),
        \ [l:typing, a:opt['name'], a:ctx, a:ctx['startcol']], 1)
+  call easycomplete#complete(a:opt['name'], a:ctx, a:ctx['startcol'], [])
  return v:true
endfunction

jayli avatar Jan 27 '22 02:01 jayli

优化前后的对比:

                          else
                             let local_menuitems = g:easycomplete_menuitems
 18              0.000014   endif
-18   0.599898   0.000676   let filtered_menu = easycomplete#util#CompleteMenuFilter(local_menuitems, word, 250)
+18   0.008779   0.000196   let filtered_menu = easycomplete#util#CompleteMenuFilter(local_menuitems, word, 250)
 18              0.000047   if len(filtered_menu) == 0
                             call s:CloseCompletionMenu()
                             let g:easycomplete_stunt_menuitems = []
                             return
 18              0.000014   endif

jayli avatar Jan 27 '22 07:01 jayli

https://github.com/jayli/vim-easycomplete/commit/5846bcd41045bd6f5c178831a27e83fe3a2643c4

nvim 0.5.0及以下版本不支持 fuzzymatch,保留原实现

jayli avatar Jan 27 '22 15:01 jayli

性能相关issue #20 , #59

jayli avatar Feb 17 '22 02:02 jayli

体验相关问题,nim 性能极差:

原因1是 uniq() 函数做全量item去重导致的,已经删掉了。原因2是nimlsp每次都是返回全量items,全部交给vimscript去过滤,这里需要提前先过滤一下,其他语言也存在类似的情况。

https://github.com/jayli/vim-easycomplete/issues/155#issuecomment-1041601917

#71

jayli avatar Feb 17 '22 02:02 jayli

优化完成后,firstcomplete 耗时最久的 easycomplete#util#GetVimCompletionItems() 优化在 0.08s 提速四倍。已经基本不影响跟指动作了。nim 和 vim 的 lsp 返回结果很多,也在进入处理前就做了一轮过滤。

FUNCTIONS SORTED ON SELF TIME
count  total (s)   self (s)  function
-   1   0.261271   0.192055  easycomplete#util#GetVimCompletionItems()
+   1   0.081271   0.042055  easycomplete#util#GetVimCompletionItems()
    2              0.035895  <SNR>107_PreparePythonEnvironment()
 1999              0.030477  easycomplete#util#SortTextComparatorByLength()
    2   0.024277   0.020418  <SNR>85_NormalizeMenulist()
  259              0.013673  <SNR>86_NormalizeLspInfo()
  926              0.013502  499()
    2   0.047732   0.011837  easycomplete#python#NormalizeSortPY()
   69   0.013464   0.009695  easycomplete#context()
    1   0.039441   0.008957  easycomplete#util#CompleteMenuFilter()
  529              0.007605  easycomplete#util#GetUserData()
    1   0.012328   0.006512  easycomplete#util#distinct()
  255              0.005268  <SNR>85_CompleteSourceReady()
  259              0.005143  easycomplete#util#LspType()
  259   0.005816   0.004312  <SNR>86_GetItemWord()
    1   0.178874   0.003935  <SNR>96_on_stdout()
    1   0.058718   0.003616  <SNR>85_FirstCompleteRendering()
    5   0.136756   0.003455  easycomplete#CompleteAdd()
   78              0.003403  easycomplete#util#GetTypingWord()
    4   0.013038   0.003321  <SNR>85_ResetCompleteTaskQueue()
    3   0.014328   0.003267  <SNR>85_flush()

jayli avatar Feb 17 '22 10:02 jayli

性能优化的bugfix

https://github.com/jayli/vim-easycomplete/commit/a854166dbca8c6f207984f64c9d906f905d6ca92

jayli avatar Feb 18 '22 06:02 jayli

2022-2-19 性能更新

https://github.com/jayli/vim-easycomplete/compare/master@%7B2022-02-18%7D...master@%7B2022-02-19%7D

jayli avatar Feb 19 '22 13:02 jayli