summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-07-26 21:26:34 +0200
committerBram Moolenaar <Bram@vim.org>2019-07-26 21:26:34 +0200
commit7b73d7ebf71c9148c90a500116f25ec2314c7273 (patch)
tree1138f7122f2bb85454e2bdef9d9edfde06e4e6d4
parent9d5ffceb3fea247a88d4d3936e97b7f488aab6ff (diff)
downloadvim-git-8.1.1752.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.c8
-rw-r--r--src/popupwin.c4
-rw-r--r--src/proto/hashtab.pro1
-rw-r--r--src/version.c2
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,