运行此示例代码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(in-ns 'clojure.pprint)
(println "使用raw str的基本输出.")
(time
(doseq [i (range 1000)]
(apply str (interpose "," [1 2 3]))))
(println "测试 1 - 原始 cl-format")
(time
(doseq [i (range 1000)]
(clojure.pprint/cl-format nil "~{~D~^,~}" [1 2 3])))
;; ==> "elapsed time: 231.345 msecs"
(println "测试 2 - 调用编译格式")
(def myx
(compile-format "~{~D~^,~}"))
(time
(doseq [i (range 1000)]
(clojure.pprint/cl-format nil myx [1 2 3])))
(println "测试 3 - 使用格式化器")
(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))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
它将打印类似的内容
使用raw str的基本输出。
"elapsed time: 2.402 msecs"
测试 1 - 原始 cl-format
"elapsed time: 194.405 msecs"
测试 2 - 调用编译格式
"elapsed time: 87.271 msecs"
测试 3 - 使用格式化器
"elapsed time: 199.318 msecs"
因此,原始`str`大约快100倍。
为了参考,在同一硬件上,使用
SBCL Common Lisp,此测试运行时间小于1 ms。
这里至少有两个问题
1. cl-format函数以类似下面的行开始
let [compiled-format (if (string? format-in) (compile-format format-in) format-in)
但是没有API可以通过它传递编译后的格式;(因为编译格式
是一个私有函数,所以不能广泛使用)所以这有点无用的。
2. 即使用预先编译的格式化器也过于缓慢。
建议的修复方案:没有,也许应该警告用户这个
函数根本不适合用于紧密循环,而应仅用于
美化打印用户输入字符串等。
谢谢