Run this example code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(in-ns 'clojure.pprint)
(println "Basic output using raw str.")
(time
(doseq [i (range 1000)]
(apply str (interpose "," [1 2 3]))))
(println "Test 1 - raw cl-format")
(time
(doseq [i (range 1000)]
(clojure.pprint/cl-format nil "~{~D~^,~}" [1 2 3])))
;; ==> "Elapsed time: 231.345 msecs"
(println "Test 2 - call on the compiled format")
(def myx
(compile-format "~{~D~^,~}"))
(time
(doseq [i (range 1000)]
(clojure.pprint/cl-format nil myx [1 2 3])))
(println "Test 3 - using a formatter")
(def myy
(formatter "~{~D~^,~}"))
(time
(doseq [i (range 1000)]
(myy nil myx [1 2 3])))
(time
(dotimes (i 100000)
(format nil "~{~D~^,~}" '(1 2 3))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
It will print something like this:
Basic output using raw str.
"Elapsed time: 2.402 msecs"
Test 1 - raw cl-format
"Elapsed time: 194.405 msecs"
Test 2 - call on the compiled format
"Elapsed time: 87.271 msecs"
Test 3 - using a formatter
"Elapsed time: 199.318 msecs"
So raw `str' is ~ 100X faster.
For reference, on the same hardware, using
SBCL Common Lisp, this test runs in < 1 ms.
There are (at least) 2 problems here:
1. cl-format function begins with a line like:
let [compiled-format (if (string? format-in) (compile-format format-in) format-in)
But there is no api to pass in a compiled-format into it; (as compile-format
is a private function, so can't be used at large) so this is kind of useless.
2. Even using a precompiled formatter is way too slow.
Suggested fix: none, except perhaps warning unwary users that this
function is simply not suitable for tight loops, and should only be
used to pretty print user input strings, etc.
Thank you