Opimized version of str function:
(defn my-str
(^String [] "")
(^String [^Object x]
(if (nil? x) "" (. x (toString))))
(^String [^Object x & ys]
(let [sb (StringBuilder. (if (nil? x) "" (. x (toString))))]
(loop [ys (seq ys)]
(if-not (nil? ys)
(let [x (.first ys)]
(if-not (nil? x)
(.append sb (.toString ^Object x)))
(recur (.next ys)))))
(.toString sb))))
Benchmarks:
(let [xs (vec (range 1000))]
(criterium/bench
(apply my-str xs)))
Evaluation count : 2577840 in 60 samples of 42964 calls.
Execution time mean : 23.611394 µs
(let [xs (vec (range 1000))]
(criterium/bench
(apply str xs)))
Evaluation count : 1375200 in 60 samples of 22920 calls.
Execution time mean : 42.015320 µs