mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Optimize 'string-hash'.
This yields a 50% improvement on the "narrow string" benchmark of 'hash.bm', 41% on "wide string", and 76% on "long string". * libguile/hash.c (scm_i_string_hash): Rewrite to avoid 'scm_i_string_ref' calls.
This commit is contained in:
parent
87a8b56f8c
commit
01a301d1b6
1 changed files with 19 additions and 4 deletions
|
@ -68,10 +68,25 @@ scm_i_string_hash (SCM str)
|
||||||
{
|
{
|
||||||
size_t len = scm_i_string_length (str);
|
size_t len = scm_i_string_length (str);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
unsigned long h = 0;
|
unsigned long h = 0;
|
||||||
while (len-- > 0)
|
const void *data;
|
||||||
h = (unsigned long) scm_i_string_ref (str, i++) + h * 37;
|
|
||||||
|
data = scm_i_string_data (str);
|
||||||
|
|
||||||
|
if (scm_i_is_narrow_string (str))
|
||||||
|
{
|
||||||
|
const unsigned char *ndata = data;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
h = (unsigned long) ndata[i] + h * 37;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const scm_t_wchar *wdata = data;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
h = (unsigned long) wdata[i] + h * 37;
|
||||||
|
}
|
||||||
|
|
||||||
scm_remember_upto_here_1 (str);
|
scm_remember_upto_here_1 (str);
|
||||||
return h;
|
return h;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue