From: Nikodemus Siivola Date: Thu, 10 Aug 2006 10:11:39 +0000 (+0000) Subject: 0.9.15.21: better hashing of general arrays X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=a8674581f11d7c105500c7c24d4d6d167739745a;p=sbcl.git 0.9.15.21: better hashing of general arrays * Use the same algorithm as SB-INT:PSXHASH uses for general arrays. * Performance problem reported by Andy Fingerhut. --- diff --git a/NEWS b/NEWS index d1912e8..cff3727 100644 --- 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) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 635bf491..2db0559 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -143,6 +143,20 @@ (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 @@ -201,7 +215,8 @@ ;; 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 @@ -266,18 +281,8 @@ ;;(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)) diff --git a/version.lisp-expr b/version.lisp-expr index d747eb3..88dfe28 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -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"