Speed up arrays concatenating a litte bit
authorDavid Vázquez <davazp@gmail.com>
Tue, 4 Jun 2013 02:19:49 +0000 (03:19 +0100)
committerDavid Vázquez <davazp@gmail.com>
Tue, 4 Jun 2013 02:19:49 +0000 (03:19 +0100)
src/boot.lisp
src/compat.lisp
src/compiler.lisp
src/sequence.lisp
src/string.lisp

index dc9b45f..59b97a0 100644 (file)
@@ -87,7 +87,7 @@
 (defvar *gensym-counter* 0)
 (defun gensym (&optional (prefix "G"))
   (setq *gensym-counter* (+ *gensym-counter* 1))
-  (make-symbol (concat-two prefix (integer-to-string *gensym-counter*))))
+  (make-symbol (concat prefix (integer-to-string *gensym-counter*))))
 
 (defun boundp (x)
   (boundp x))
     ((listp seq)
      (list-length seq))))
 
-(defun concat-two (s1 s2)
-  (concat-two s1 s2))
-
 (defmacro with-collect (&body body)
   (let ((head (gensym))
         (tail (gensym)))
index a11aa5d..3eaf4ff 100644 (file)
@@ -38,9 +38,6 @@
   `(eval-when (:compile-toplevel :load-toplevel :execute)
      ,@body))
 
-(defun concat-two (s1 s2)
-  (concatenate 'string s1 s2))
-
 (defun aset (array idx value)
   (setf (aref array idx) value))
 
index 1fb6305..449bb3e 100644 (file)
     "if (i < 0 || i >= x.length) throw 'Out of range';" *newline*
     "return x[i] = " value ";" *newline*))
 
-
+(define-builtin concatenate-storage-vector (sv1 sv2)
+  (js!selfcall
+    "var sv1 = " sv1 ";" *newline*
+    "var r = sv1.concat(" sv2 ");" *newline*
+    "r.type = sv1.type;" *newline*
+    "r.stringp = sv1.stringp;" *newline*
+    "return r;" *newline*))
 
 (define-builtin get-internal-real-time ()
   "(new Date()).getTime()")
index 7e96df0..85d5276 100644 (file)
            ((= j b) new)
          (aset new i (aref seq j)))))
     (t (not-seq-error seq))))
+
+
+
index 7026cb3..411c638 100644 (file)
             `(char ,g!string ,g!index))))
 
 
-(defun concat-two (string1 string2)
-  (let* ((len1 (length string1))
-         (len2 (length string2))
-         (string (make-array (+ len1 len2) :element-type 'character))
-         (i 0))
-    (dotimes (j len1)
-      (aset string i (char string1 j))
-      (incf i))
-    (dotimes (j len2)
-      (aset string i (char string2 j))
-      (incf i))
-    string))
-
 (defun concat (&rest strs)
-  (!reduce #'concat-two strs ""))
+  (flet ((concat-two (str1 str2)
+           (concatenate-storage-vector str1 str2)))
+    (!reduce #'concat-two strs "")))
 
 
 (defun string-upcase (string)