[cmucl] #81: Reversing a string is slow
cmucl
cmucl-devel at common-lisp.net
Wed May 15 03:41:00 UTC 2013
#81: Reversing a string is slow
--------------------+-------------------------------------------------------
Reporter: rtoy | Owner: somebody
Type: defect | Status: new
Priority: major | Milestone:
Component: Core | Version: 2013-05
Keywords: |
--------------------+-------------------------------------------------------
Consider this:
{{{
(defparameter *s* (make-string 1000000))
(defun time-rev (s)
(dotimes (k 100 nil)
(declare (fixnum k))
(setf s (reverse s)))
s)
(compile 'time-rev)
(time (prog1 t (time-rev *s*)))
; Evaluation took:
; 10.23 seconds of real time
; 10.151641 seconds of user run time
; 0.079628 seconds of system run time
; 31,310,669,055 CPU cycles
; [Run times include 0.08 seconds GC run time]
; 0 page faults and
; 200,114,224 bytes consed.
}}}
Since strings are basically arrays of unsigned 16-bit integers, compare
the time when reversing an array:
{{{
(defparameter *v* (make-array 1000000 :element-type '(unsigned-byte 16)))
(time (prog1 t (time-rev *v*)))
; Evaluation took:
; 3.62 seconds of real time
; 3.581727 seconds of user run time
; 0.039302 seconds of system run time
; 11,089,005,122 CPU cycles
; [Run times include 0.05 seconds GC run time]
; 0 page faults and
; 200,116,120 bytes consed.
}}}
Reversing a string is 3 times slower. There is some cost since strings
are utf-16 encoded, but we shouldn't be 3 times slower.
--
Ticket URL: <http://trac.common-lisp.net/cmucl/ticket/81>
cmucl <http://common-lisp.net/project/cmucl>
Cmucl is a high-performance, free Common Lisp implementation.
More information about the cmucl-ticket
mailing list