Skip to content

Commit

Permalink
Decrease startup-time by avoiding iteration over maps
Browse files Browse the repository at this point in the history
This commit makes adding, removing and finding key maps an O(1)
operation instead of O(n), where n is the number of pre-existing maps.

In my testing, averaged over 100 iterations, this reduces the time spent
initializing NERDTree at Vim startup from ~73ms to ~9.7ms. That's with
only the default included key maps.
  • Loading branch information
mnussbaum committed Jun 11, 2018
1 parent 9af083a commit c6d757f
Showing 1 changed file with 16 additions and 22 deletions.
38 changes: 16 additions & 22 deletions lib/nerdtree/key_map.vim
Expand Up @@ -3,18 +3,23 @@
let s:KeyMap = {}
let g:NERDTreeKeyMap = s:KeyMap

"FUNCTION: KeyMap.All() {{{1
function! s:KeyMap.All()

if !exists('s:keyMaps')
let s:keyMaps = []
"FUNCTION: KeyMap.all() {{{1
function! s:KeyMap.all()
if !exists("s:keyMaps")
let s:keyMaps = {}
endif

call sort(s:keyMaps, s:KeyMap.Compare, s:KeyMap)

return s:keyMaps
endfunction

"FUNCTION: KeyMap.All() {{{1
function! s:KeyMap.All()
let sortedKeyMaps = values(s:KeyMap.all())
call sort(sortedKeyMaps, s:KeyMap.Compare, s:KeyMap)

return sortedKeyMaps
endfunction

"FUNCTION: KeyMap.Compare(keyMap1, keyMap2) {{{1
function! s:KeyMap.Compare(keyMap1, keyMap2)

Expand All @@ -31,17 +36,12 @@ endfunction

"FUNCTION: KeyMap.FindFor(key, scope) {{{1
function! s:KeyMap.FindFor(key, scope)
for i in s:KeyMap.All()
if i.key ==# a:key && i.scope ==# a:scope
return i
endif
endfor
return {}
return get(s:KeyMap.all(), a:key . a:scope, {})
endfunction

"FUNCTION: KeyMap.BindAll() {{{1
function! s:KeyMap.BindAll()
for i in s:KeyMap.All()
for i in values(s:KeyMap.all())
call i.bind()
endfor
endfunction
Expand All @@ -67,12 +67,7 @@ endfunction

"FUNCTION: KeyMap.Remove(key, scope) {{{1
function! s:KeyMap.Remove(key, scope)
let maps = s:KeyMap.All()
for i in range(len(maps))
if maps[i].key ==# a:key && maps[i].scope ==# a:scope
return remove(maps, i)
endif
endfor
return remove(s:keyMaps, a:key . a:scope)
endfunction

"FUNCTION: KeyMap.invoke() {{{1
Expand Down Expand Up @@ -170,8 +165,7 @@ endfunction

"FUNCTION: KeyMap.Add(keymap) {{{1
function! s:KeyMap.Add(keymap)
call s:KeyMap.Remove(a:keymap.key, a:keymap.scope)
call add(s:KeyMap.All(), a:keymap)
let s:keyMaps[a:keymap.key . a:keymap.scope] = a:keymap
endfunction

" vim: set sw=4 sts=4 et fdm=marker:

0 comments on commit c6d757f

Please sign in to comment.