diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-07-26 21:26:34 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-07-26 21:26:34 +0200 |
commit | 7b73d7ebf71c9148c90a500116f25ec2314c7273 (patch) | |
tree | 1138f7122f2bb85454e2bdef9d9edfde06e4e6d4 | |
parent | 9d5ffceb3fea247a88d4d3936e97b7f488aab6ff (diff) | |
download | vim-git-7b73d7ebf71c9148c90a500116f25ec2314c7273.tar.gz |
patch 8.1.1752: resizing hashtable is inefficientv8.1.1752
Problem: Resizing hashtable is inefficient.
Solution: Avoid resizing when the final size is predictable.
-rw-r--r-- | src/hashtab.c | 8 | ||||
-rw-r--r-- | src/popupwin.c | 4 | ||||
-rw-r--r-- | src/proto/hashtab.pro | 1 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 10 insertions, 5 deletions
diff --git a/src/hashtab.c b/src/hashtab.c index ad018578b..450cf98f5 100644 --- a/src/hashtab.c +++ b/src/hashtab.c @@ -286,7 +286,6 @@ hash_lock(hashtab_T *ht) ++ht->ht_locked; } -#if 0 /* currently not used */ /* * Lock a hashtable at the specified number of entries. * Caller must make sure no more than "size" entries will be added. @@ -298,7 +297,6 @@ hash_lock_size(hashtab_T *ht, int size) (void)hash_may_resize(ht, size); ++ht->ht_locked; } -#endif /* * Unlock a hashtable: allow ht_array changes again. @@ -368,10 +366,10 @@ hash_may_resize( } else { - /* Use specified size. */ - if ((long_u)minitems < ht->ht_used) /* just in case... */ + // Use specified size. + if ((long_u)minitems < ht->ht_used) // just in case... minitems = (int)ht->ht_used; - minsize = minitems * 3 / 2; /* array is up to 2/3 full */ + minsize = (minitems * 3 + 1) / 2; // array is up to 2/3 full } newsize = HT_INIT_SIZE; diff --git a/src/popupwin.c b/src/popupwin.c index d0f6156ad..4750adf21 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -2032,7 +2032,9 @@ f_popup_getpos(typval_T *argvars, typval_T *rettv) top_extra = popup_top_extra(wp); left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3]; + // we know how much space we need, avoid resizing halfway dict = rettv->vval.v_dict; + hash_lock_size(&dict->dv_hashtab, 11); dict_add_number(dict, "line", wp->w_winrow + 1); dict_add_number(dict, "col", wp->w_wincol + 1); @@ -2050,6 +2052,8 @@ f_popup_getpos(typval_T *argvars, typval_T *rettv) dict_add_number(dict, "firstline", wp->w_topline); dict_add_number(dict, "visible", win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0); + + hash_unlock(&dict->dv_hashtab); } } /* diff --git a/src/proto/hashtab.pro b/src/proto/hashtab.pro index 96907147d..21794ed6f 100644 --- a/src/proto/hashtab.pro +++ b/src/proto/hashtab.pro @@ -9,6 +9,7 @@ int hash_add(hashtab_T *ht, char_u *key); int hash_add_item(hashtab_T *ht, hashitem_T *hi, char_u *key, hash_T hash); void hash_remove(hashtab_T *ht, hashitem_T *hi); void hash_lock(hashtab_T *ht); +void hash_lock_size(hashtab_T *ht, int size); void hash_unlock(hashtab_T *ht); hash_T hash_hash(char_u *key); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c index 5104f6a99..25bfd1679 100644 --- a/src/version.c +++ b/src/version.c @@ -778,6 +778,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1752, +/**/ 1751, /**/ 1750, |