mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-26 10:43:47 +08:00
Add a one-item cache into the hash table. This reduces the number of hash computations by roughly 20%
darcs-hash:20070116163707-ac50b-214a16d4210d32fb50693e71a14b6b8f3fededfe.gz
This commit is contained in:
parent
f603b6ef68
commit
54e19b1efb
12
util.c
12
util.c
|
@ -208,6 +208,7 @@ void hash_init2( hash_table_t *h,
|
||||||
h->count=0;
|
h->count=0;
|
||||||
h->hash_func = hash_func;
|
h->hash_func = hash_func;
|
||||||
h->compare_func = compare_func;
|
h->compare_func = compare_func;
|
||||||
|
h->cache=-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hash_init( hash_table_t *h,
|
void hash_init( hash_table_t *h,
|
||||||
|
@ -219,6 +220,7 @@ void hash_init( hash_table_t *h,
|
||||||
h->count=0;
|
h->count=0;
|
||||||
h->hash_func = hash_func;
|
h->hash_func = hash_func;
|
||||||
h->compare_func = compare_func;
|
h->compare_func = compare_func;
|
||||||
|
h->cache=-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -237,6 +239,14 @@ static int hash_search( hash_table_t *h,
|
||||||
int hv;
|
int hv;
|
||||||
int pos;
|
int pos;
|
||||||
|
|
||||||
|
if( h->cache>=0 && h->arr[h->cache].key)
|
||||||
|
{
|
||||||
|
if( h->compare_func( h->arr[h->cache].key, key ) )
|
||||||
|
{
|
||||||
|
return h->cache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
hv = h->hash_func( key );
|
hv = h->hash_func( key );
|
||||||
pos = (hv & 0x7fffffff) % h->size;
|
pos = (hv & 0x7fffffff) % h->size;
|
||||||
while(1)
|
while(1)
|
||||||
|
@ -244,6 +254,7 @@ static int hash_search( hash_table_t *h,
|
||||||
if( (h->arr[pos].key == 0 ) ||
|
if( (h->arr[pos].key == 0 ) ||
|
||||||
( h->compare_func( h->arr[pos].key, key ) ) )
|
( h->compare_func( h->arr[pos].key, key ) ) )
|
||||||
{
|
{
|
||||||
|
h->cache = pos;
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
pos++;
|
pos++;
|
||||||
|
@ -268,6 +279,7 @@ static int hash_realloc( hash_table_t *h,
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
h->cache = -1;
|
||||||
h->arr = malloc( sizeof( hash_struct_t) * sz );
|
h->arr = malloc( sizeof( hash_struct_t) * sz );
|
||||||
if( h->arr == 0 )
|
if( h->arr == 0 )
|
||||||
{
|
{
|
||||||
|
|
2
util.h
2
util.h
|
@ -73,6 +73,8 @@ typedef struct hash_table
|
||||||
{
|
{
|
||||||
/** The array containing the data */
|
/** The array containing the data */
|
||||||
hash_struct_t *arr;
|
hash_struct_t *arr;
|
||||||
|
/** A simple one item cache. This should always point to the index of the last item to be used */
|
||||||
|
int cache;
|
||||||
/** Number of elements */
|
/** Number of elements */
|
||||||
int count;
|
int count;
|
||||||
/** Length of array */
|
/** Length of array */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user