0.9.15.21: better hashing of general arrays
authorNikodemus Siivola <nikodemus@random-state.net>
Thu, 10 Aug 2006 10:11:39 +0000 (10:11 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Thu, 10 Aug 2006 10:11:39 +0000 (10:11 +0000)
 * Use the same algorithm as SB-INT:PSXHASH uses for general arrays.
 * Performance problem reported by Andy Fingerhut.

NEWS
src/code/target-sxhash.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index d1912e8..cff3727 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@ changes in sbcl-0.9.16 relative to sbcl-0.9.15:
     as specified by AMOP.
   * optimization: faster LOGCOUNT implementation on x86 and x86-64
     (thanks to Lutz Euler)
+  * optimization: hashing of general arrays and vectors has been
+    improved. (reported by Any Fingerhut)
   * fixed bug #337: use of MAKE-METHOD in method combination now works
     even in the presence of user-defined method classes.  (reported by
     Bruno Haible and Pascal Costanza)
index 635bf49..2db0559 100644 (file)
 (declaim (ftype (sfunction (t) (integer 0 #.sb!xc:most-positive-fixnum))
                 sxhash-instance))
 
+(defmacro hash-array-using (recurse array depthoid)
+  ;; Any other array can be hashed by working with its underlying
+  ;; one-dimensional physical representation. Used by both SXHASH and
+  ;; PSXHASH.
+  (once-only ((array array) (depthoid depthoid))
+    `(let ((result 60828123))
+       (declare (type fixnum result))
+       (dotimes (i (min ,depthoid (array-rank ,array)))
+         (mixf result (array-dimension ,array i)))
+       (dotimes (i (min ,depthoid (array-total-size ,array)))
+         (mixf result
+               (,recurse (row-major-aref ,array i) (- ,depthoid 1 i))))
+       result)))
+
 (defun sxhash (x)
   ;; profiling SXHASH is hard, but we might as well try to make it go
   ;; fast, in case it is the bottleneck somwhere.  -- CSR, 2003-03-14
                    ;; work needs to be done using the %RAW-BITS
                    ;; approach.  This will probably do for now.
                    (sxhash-recurse (copy-seq x) depthoid))
-                  (t (logxor 191020317 (sxhash (array-rank x))))))
+                  (t
+                   (hash-array-using sxhash-recurse x depthoid))))
                (character
                 (logxor 72185131
                         (sxhash (char-code x)))) ; through DEFTRANSFORM
           ;;(format t "~&SIMPLE-VECTOR special case~%")
           (frob))
          (t (frob)))))
-    ;; Any other array can be hashed by working with its underlying
-    ;; one-dimensional physical representation.
     (t
-     (let ((result 60828))
-       (declare (type fixnum result))
-       (dotimes (i (min depthoid (array-rank key)))
-         (mixf result (array-dimension key i)))
-       (dotimes (i (min depthoid (array-total-size key)))
-         (mixf result
-               (psxhash (row-major-aref key i)
-                        (- depthoid 1 i))))
-       result))))
+     (hash-array-using psxhash key depthoid))))
 
 (defun structure-object-psxhash (key depthoid)
   (declare (optimize speed))
index d747eb3..88dfe28 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.15.20"
+"0.9.15.21"