* Don't recompute symbol hash values. The symbol holds them already.
authorDirk Herrmann <dirk@dirk-herrmanns-seiten.de>
Wed, 1 Nov 2000 16:59:45 +0000 (16:59 +0000)
committerDirk Herrmann <dirk@dirk-herrmanns-seiten.de>
Wed, 1 Nov 2000 16:59:45 +0000 (16:59 +0000)
* Speed up interning of symbols by comparing hash values.

libguile/ChangeLog
libguile/symbols.c

index ebe55ba..b16dbb7 100644 (file)
@@ -1,3 +1,12 @@
+2000-11-01  Dirk Herrmann  <D.Herrmann@tu-bs.de>
+
+       * symbols.c (scm_sym2vcell, scm_sym2ovcell_soft,
+       scm_intern_symbol, scm_unintern_symbol):  Symbol objects already
+       hold their hash values, no need to recompute them.
+
+       (scm_intern_obarray_soft):  Speed up search for a matching symbol
+       by comparing the hash values first.
+
 2000-10-30  Dirk Herrmann  <D.Herrmann@tu-bs.de>
 
        * unif.c (scm_make_uve, scm_dimensions_to_uniform_array):  Don't
index 56a4cd9..9dd80dd 100644 (file)
@@ -143,8 +143,7 @@ scm_sym2vcell (SCM sym, SCM thunk, SCM definep)
       SCM lsym;
       SCM * lsymp;
       SCM z;
-      scm_sizet hash
-       = scm_string_hash (SCM_SYMBOL_UCHARS (sym), SCM_SYMBOL_LENGTH (sym)) % scm_symhash_dim;
+      scm_sizet hash = SCM_SYMBOL_HASH (sym) % scm_symhash_dim;
 
       SCM_DEFER_INTS;
       for (lsym = SCM_VELTS (scm_symhash)[hash]; SCM_NIMP (lsym); lsym = SCM_CDR (lsym))
@@ -188,8 +187,7 @@ SCM
 scm_sym2ovcell_soft (SCM sym, SCM obarray)
 {
   SCM lsym, z;
-  scm_sizet hash 
-    = scm_string_hash (SCM_SYMBOL_UCHARS (sym), SCM_SYMBOL_LENGTH (sym)) % SCM_VECTOR_LENGTH (obarray);
+  scm_sizet hash = SCM_SYMBOL_HASH (sym) % SCM_VECTOR_LENGTH (obarray);
   SCM_REDEFER_INTS;
   for (lsym = SCM_VELTS (obarray)[hash];
        SCM_NIMP (lsym);
@@ -265,6 +263,8 @@ scm_intern_obarray_soft (const char *name,scm_sizet len,SCM obarray,unsigned int
       SCM a = SCM_CAR (lsym);
       SCM z = SCM_CAR (a);
       unsigned char *tmp = SCM_SYMBOL_UCHARS (z);
+      if (SCM_SYMBOL_HASH (z) != raw_hash)
+       goto trynext;
       if (SCM_SYMBOL_LENGTH (z) != len)
        goto trynext;
       for (i = len; i--;)
@@ -557,7 +557,7 @@ SCM_DEFINE (scm_intern_symbol, "intern-symbol", 2, 0, 0,
   if (SCM_FALSEP (o))
     o = scm_symhash;
   SCM_VALIDATE_VECTOR (1,o);
-  hval = scm_string_hash (SCM_SYMBOL_UCHARS (s), SCM_SYMBOL_LENGTH (s)) % SCM_VECTOR_LENGTH (o);
+  hval = SCM_SYMBOL_HASH (s) % SCM_VECTOR_LENGTH (o);
   /* If the symbol is already interned, simply return. */
   SCM_REDEFER_INTS;
   {
@@ -594,7 +594,7 @@ SCM_DEFINE (scm_unintern_symbol, "unintern-symbol", 2, 0, 0,
   if (SCM_FALSEP (o))
     o = scm_symhash;
   SCM_VALIDATE_VECTOR (1,o);
-  hval = scm_string_hash (SCM_SYMBOL_UCHARS (s), SCM_SYMBOL_LENGTH (s)) % SCM_VECTOR_LENGTH (o);
+  hval = SCM_SYMBOL_HASH (s) % SCM_VECTOR_LENGTH (o);
   SCM_DEFER_INTS;
   {
     SCM lsym_follow;