[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 06/06: Optimize 'string-hash'.
From: |
Ludovic Courtès |
Subject: |
[Guile-commits] 06/06: Optimize 'string-hash'. |
Date: |
Sun, 11 Jan 2015 21:54:26 +0000 |
civodul pushed a commit to branch stable-2.0
in repository guile.
commit 01a301d1b606b84d986b735049e7155d2f4cd6aa
Author: Ludovic Courtès <address@hidden>
Date: Sun Jan 11 22:40:07 2015 +0100
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.
---
libguile/hash.c | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/libguile/hash.c b/libguile/hash.c
index e5568ee..d51c661 100644
--- a/libguile/hash.c
+++ b/libguile/hash.c
@@ -63,15 +63,30 @@ scm_string_hash (const unsigned char *str, size_t len)
#endif
-unsigned long
+unsigned long
scm_i_string_hash (SCM str)
{
size_t len = scm_i_string_length (str);
size_t i = 0;
-
unsigned long h = 0;
- while (len-- > 0)
- h = (unsigned long) scm_i_string_ref (str, i++) + h * 37;
+ const void *data;
+
+ 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);
return h;
- [Guile-commits] branch stable-2.0 updated (5d971db -> 01a301d), Ludovic Courtès, 2015/01/11
- [Guile-commits] 01/06: statprof: 'statprof' and 'with-statprof' return the code's return values., Ludovic Courtès, 2015/01/11
- [Guile-commits] 04/06: Deprecate 'scm_string_hash'., Ludovic Courtès, 2015/01/11
- [Guile-commits] 03/06: Optimize 'write' for strings., Ludovic Courtès, 2015/01/11
- [Guile-commits] 02/06: Avoid converting the 'mode' argument of 'open-file'., Ludovic Courtès, 2015/01/11
- [Guile-commits] 05/06: Add 'string-hash' benchmarks., Ludovic Courtès, 2015/01/11
- [Guile-commits] 06/06: Optimize 'string-hash'.,
Ludovic Courtès <=