guile-commits
[Top][All Lists]
Advanced

[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;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]