jayli / vim-easycomplete

杭州市余杭区最好用的 VIM/NVIM 代码补全插件
MIT License
408 stars 26 forks source link

fuzzymatch speed up #133

Open jayli opened 2 years ago

jayli commented 2 years ago

比如 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 commented 2 years ago

优化前后的对比:

                          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 commented 2 years ago

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

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

jayli commented 2 years ago

性能相关issue #20 , #59

jayli commented 2 years ago

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

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

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

71

jayli commented 2 years ago

优化完成后,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 commented 2 years ago

性能优化的bugfix

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

jayli commented 2 years ago

2022-2-19 性能更新

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