From e556f9c78d0216c2a543035586bc3a7cd1918d73 Mon Sep 17 00:00:00 2001 From: Sebastian Gniazdowski Date: Wed, 5 Jul 2017 09:35:57 +0200 Subject: 41402: Add hasher to ecstrcode to reduce string comparisons --- ChangeLog | 5 +++++ Src/parse.c | 6 +++++- Src/zsh.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index d5ff3f5e7..b3e702cd1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-07-09 Peter Stephenson + + * Sebastian: 41402: Src/parse.c, Src/zsh.h: Add hasher to + ecstrcode() to reduce string comparisons. + 2017-07-04 Peter Stephenson * 41391: Doc/Zsh/jobs.yo, Src/jobs.c, Src/zsh.h: delay disown diff --git a/Src/parse.c b/Src/parse.c index 8769baae4..00a8f6a5a 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -396,6 +396,8 @@ ecstrcode(char *s) { int l, t = has_token(s); + unsigned val = hasher(s); + if ((l = strlen(s) + 1) && l <= 4) { wordcode c = (t ? 3 : 2); switch (l) { @@ -410,8 +412,9 @@ ecstrcode(char *s) int cmp; for (pp = &ecstrs; (p = *pp); ) { - if (!(cmp = p->nfunc - ecnfunc) && !(cmp = strcmp(p->str, s))) + if (!(cmp = p->nfunc - ecnfunc) && !(cmp = (((signed)p->hashval) - ((signed)val))) && !(cmp = strcmp(p->str, s))) { return p->offs; + } pp = (cmp < 0 ? &(p->left) : &(p->right)); } p = *pp = (Eccstr) zhalloc(sizeof(*p)); @@ -420,6 +423,7 @@ ecstrcode(char *s) p->aoffs = ecsoffs; p->str = s; p->nfunc = ecnfunc; + p->hashval = val; ecsoffs += l; return p->offs; diff --git a/Src/zsh.h b/Src/zsh.h index a5b4d8fc4..ccd11db3d 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -813,6 +813,7 @@ struct eccstr { char *str; wordcode offs, aoffs; int nfunc; + int hashval; }; #define EC_NODUP 0 -- cgit 1.4.1