[postmodern-devel] Performance patch

Ivan Boldyrev lispnik at gmail.com
Mon Jan 7 17:36:01 UTC 2008


My application uses quite long and complex query, and profiling showed
that slowest function is SQL-COMPILE.  First I reimplemented it with
S-SQL::STRCAT, but then I thought: what if it will hit
CALL-ARGUMENTS-LIMIT (it is only 4096 on GNU Clisp!)?  So I changed
implementation of S-SQL:STRCAT to get list as the only argument, not as
&rest.

SQL-COMPILE is much faster and consumes on my query 10 times less
memory.  As SQL-COMPILE is usually called on run time, not compilation
time, I think it is very important.

--- old/s-sql/s-sql.lisp~	2008-01-07 20:05:17.000000000 +0600
+++ new/s-sql/s-sql.lisp	2008-01-07 23:26:03.000000000 +0600
@@ -25,7 +25,7 @@
 
 ;; Utils
 
-(defun strcat (&rest args)
+(defun strcat (args)
   "Concatenate a list of strings into a single one."
   (let ((result (make-string (reduce #'+ args :initial-value 0 :key 'length))))
     (loop :for pos = 0 :then (+ pos (length arg))
@@ -36,11 +36,11 @@
 (defun implode (sep list)
   "Reduce a list of strings to a single string, inserting a separator
 between them."
-  (apply 'strcat
-         (loop :for element :on list
-               :collect (car element)
-               :if (cdr element)
-               :collect sep)))
+  (strcat
+   (loop :for element :on list
+      :collect (car element)
+      :if (cdr element)
+      :collect sep)))
 
 (defun split-on-keywords% (shape list)
   "Helper function for split-on-keywords. Extracts the values
@@ -338,11 +338,11 @@
   (let ((list (reduce-strings (sql-expand form))))
     (if (= 1 (length list))
         (car list)
-        `(strcat , at list))))
+        `(strcat (list , at list)))))
   
 (defun sql-compile (form)
   (let ((*expand-runtime* t))
-    (car (reduce-strings (sql-expand form)))))
+    (strcat (sql-expand form))))
 
 ;; The reader syntax.
 
@@ -378,7 +378,7 @@
   (declare (type (member t :both nil) class))
   (cond
     ((cdr args)
-     `("(" ,@(sql-expand-list args (strcat " " operator " ")) ")"))
+     `("(" ,@(sql-expand-list args (strcat (list " " operator " "))) ")"))
     ((eq class t)
      (sql-expand (first args)))
     ((eq class :both)


-- 
Ivan Boldyrev

                                      Life!  Don't talk to me about life.



More information about the postmodern-devel mailing list