From: Sebastian Gniazdowski <psprint@zdharma.org>
To: zsh-workers@zsh.org
Subject: A patch with hashtable optimization, which doesn't work
Date: Thu, 18 May 2017 12:14:38 +0200 [thread overview]
Message-ID: <etPan.591d740e.515f007c.6b4c@MacMini.local> (raw)
[-- Attachment #1: Type: text/plain, Size: 1217 bytes --]
Hello,
it is really simple to keep collision lists sorted. However, I get error about typeset not being found. Debugged that typeset is inserted into builtintab. I am pretty exhausted, maybe someone will have a revelation on this. Debugged that typeset is being searched in:
exec.c:729 if ((cn = (Cmdnam) cmdnamtab->getnode(cmdnamtab, arg0))) {
at final stage, so it apparently misses builtintab search before. Below is the main idea, attached is full patch.
- if (ht->cmpnodes(hp->nam, hn->nam) == 0) {
+ cres = ht->cmpnodes(hp->nam, hn->nam);
+ if ( cres == 0 ) {
hq->next = hn;
goto replacing;
- }
+ } else if ( cres > 0 ) {
+ /* Pointer `hp` is at 'right' position - it points
+ * to a greater element than `hn`, so we should
+ * insert at one-before, that is after `hq` */
+ hq->next = hn;
+ hn->next = hp;
+ if (++ht->ct >= ht->hsize * 2 && !ht->scan)
+ expandhashtable(ht);
+ return NULL;
+ }
--
Sebastian Gniazdowski
psprint /at/ zdharma.org
[-- Attachment #2: hashopt.diff.txt --]
[-- Type: text/plain, Size: 3148 bytes --]
diff --git a/Src/hashtable.c b/Src/hashtable.c
index ba5faad..d820efd 100644
--- a/Src/hashtable.c
+++ b/Src/hashtable.c
@@ -162,6 +162,7 @@ addhashnode(HashTable ht, char *nam, void *nodeptr)
HashNode
addhashnode2(HashTable ht, char *nam, void *nodeptr)
{
+ int cres;
unsigned hashval;
HashNode hn, hp, hq;
@@ -181,7 +182,8 @@ addhashnode2(HashTable ht, char *nam, void *nodeptr)
}
/* else check if the first node contains the same key */
- if (ht->cmpnodes(hp->nam, hn->nam) == 0) {
+ cres = ht->cmpnodes(hp->nam, hn->nam);
+ if ( cres == 0 ) {
ht->nodes[hashval] = hn;
replacing:
hn->next = hp->next;
@@ -196,21 +198,39 @@ addhashnode2(HashTable ht, char *nam, void *nodeptr)
ht->scan->u.u = hn;
}
return hp;
+ } else if ( cres > 0 ) {
+ /* Insert in front of the list, because first
+ * element, nodes[hashval], is larger, so new
+ * element has to be before it */
+ hn->next = hp;
+ ht->nodes[hashval] = hn;
+ if (++ht->ct >= ht->hsize * 2 && !ht->scan)
+ expandhashtable(ht);
}
/* else run through the list and check all the keys */
hq = hp;
hp = hp->next;
for (; hp; hq = hp, hp = hp->next) {
- if (ht->cmpnodes(hp->nam, hn->nam) == 0) {
+ cres = ht->cmpnodes(hp->nam, hn->nam);
+ if ( cres == 0 ) {
hq->next = hn;
goto replacing;
- }
+ } else if ( cres > 0 ) {
+ /* Pointer `hp` is at 'right' position - it points
+ * to a greater element than `hn`, so we should
+ * insert at one-before, that is after `hq` */
+ hq->next = hn;
+ hn->next = hp;
+ if (++ht->ct >= ht->hsize * 2 && !ht->scan)
+ expandhashtable(ht);
+ return NULL;
+ }
}
- /* else just add it at the front of the list */
- hn->next = ht->nodes[hashval];
- ht->nodes[hashval] = hn;
+ /* else just add it at the end of the list */
+ hq->next = hn;
+ hn->next = NULL;
if (++ht->ct >= ht->hsize * 2 && !ht->scan)
expandhashtable(ht);
return NULL;
@@ -225,17 +245,20 @@ addhashnode2(HashTable ht, char *nam, void *nodeptr)
mod_export HashNode
gethashnode(HashTable ht, const char *nam)
{
+ int cres;
unsigned hashval;
HashNode hp;
hashval = ht->hash(nam) % ht->hsize;
for (hp = ht->nodes[hashval]; hp; hp = hp->next) {
- if (ht->cmpnodes(hp->nam, nam) == 0) {
+ cres = ht->cmpnodes(hp->nam, nam);
+ if (cres == 0) {
if (hp->flags & DISABLED)
return NULL;
else
return hp;
- }
+ } else if (cres > 0)
+ return NULL;
}
return NULL;
}
@@ -249,13 +272,17 @@ gethashnode(HashTable ht, const char *nam)
mod_export HashNode
gethashnode2(HashTable ht, const char *nam)
{
+ int cres;
unsigned hashval;
HashNode hp;
hashval = ht->hash(nam) % ht->hsize;
for (hp = ht->nodes[hashval]; hp; hp = hp->next) {
- if (ht->cmpnodes(hp->nam, nam) == 0)
+ cres = ht->cmpnodes(hp->nam, nam);
+ if (cres == 0)
return hp;
+ else if (cres > 0)
+ return NULL;
}
return NULL;
}
next reply other threads:[~2017-05-18 10:14 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-18 10:14 Sebastian Gniazdowski [this message]
2017-05-18 12:16 ` Sebastian Gniazdowski
2017-05-20 5:06 ` Sebastian Gniazdowski
2017-05-20 17:08 ` Improving zcompdump (Re: A patch with hashtable optimization, which doesn't work) Bart Schaefer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=etPan.591d740e.515f007c.6b4c@MacMini.local \
--to=psprint@zdharma.org \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).