3 (declaim (optimize (speed 3) (safety 0) (space 0) (debug 0)))
5 (defun sse-seq= (seq1 seq2
)
6 (= (sb-sys:%primitive sb-vm
::%sse-seq
= seq1 seq2
) 0))
8 (defun seq= (seq1 seq2
)
9 (declare (type (simple-array (unsigned-byte 8) (*)) seq1 seq2
))
10 (and (= (length seq1
) (length seq2
))
12 for s1 of-type unsigned-byte across seq1
13 for s2 of-type unsigned-byte across seq2
14 when
(/= s1 s2
) do
(setq equal nil
) (return nil
)
15 finally
(return equal
))))
18 (defun test-seq (&optional
(test-count 50000))
19 (let ((arr1 (make-array #.
(* 255 1025) :element-type
'(unsigned-byte 8) :initial-element
0))
20 (arr2 (make-array #.
(* 255 1025) :element-type
'(unsigned-byte 8) :initial-element
0))
21 (arr3 (make-array #.
(* 255 1025) :element-type
'(unsigned-byte 8) :initial-element
0))
22 (arr4 (make-array #.
(* 255 1025) :element-type
'(unsigned-byte 8) :initial-element
0))
25 (loop for i from
0 below
(length arr1
)
26 do
(setf (aref arr1 i
) (mod (* (1+ i
) 10) 256)
27 (aref arr2 i
) (aref arr1 i
)
28 (aref arr3 i
) (aref arr1 i
)
29 (aref arr4 i
) (aref arr1 i
)
32 (setf (aref arr3
1200) (mod (1+ (aref arr3
1200)) 256)
33 (aref arr4
(- (length arr4
) 2)) (mod (1+ (aref arr4
(- (length arr4
) 2))) 256))
35 ;; (time (dotimes (i 100000) (sse-seq= arr1 arr2)))
36 ;; (time (dotimes (i #.(/ 100000 30)) (seq= arr1 arr2)))
38 (format t
"; seq= a1 a2~%")
39 (time-sample-form #'(lambda () (dotimes (i (truncate test-count
15)) (setf res
(seq= arr1 arr2
)))))
41 (format t
"; seq= a1 a3~%")
42 (time-sample-form #'(lambda () (dotimes (i (truncate test-count
15)) (setf res
(seq= arr1 arr3
)))))
44 (format t
"; seq= a2 a4~%")
45 (time-sample-form #'(lambda () (dotimes (i (truncate test-count
15)) (setf res
(seq= arr2 arr4
)))))
48 (format t
"; sse-seq= a1 a2~%")
49 (time-sample-form #'(lambda () (dotimes (i test-count
) (setf res
(sse-seq= arr1 arr2
)))))
51 (format t
"; sse-seq= a1 a3~%")
52 (time-sample-form #'(lambda () (dotimes (i test-count
) (setf res
(sse-seq= arr1 arr3
)))))
54 (format t
"; sse-seq= a2 a4~%")
55 (time-sample-form #'(lambda () (dotimes (i test-count
) (setf res
(sse-seq= arr2 arr4
)))))