1
Fork 0
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:
Ludovic Courtès 2015-01-11 22:40:07 +01:00
parent 87a8b56f8c
commit 01a301d1b6

View file

@ -63,15 +63,30 @@ scm_string_hash (const unsigned char *str, size_t len)
#endif #endif
unsigned long unsigned long
scm_i_string_hash (SCM str) 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;