From c6d757f1983d8f7c516b93882ba47b1c1c6fc40f Mon Sep 17 00:00:00 2001 From: mnussbaum Date: Sun, 10 Jun 2018 23:36:56 -0700 Subject: [PATCH] Decrease startup-time by avoiding iteration over maps 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. --- lib/nerdtree/key_map.vim | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/lib/nerdtree/key_map.vim b/lib/nerdtree/key_map.vim index b7d0c44..6e98459 100644 --- a/lib/nerdtree/key_map.vim +++ b/lib/nerdtree/key_map.vim @@ -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) @@ -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 @@ -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 @@ -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: