运行此示例代码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(in-ns 'clojure.pprint)
(println "使用原始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])))
;; ==> "已用时: 231.345 毫秒"
(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))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
它将打印类似以下内容
使用原始str输出的基本输出。
"已用时: 2.402 毫秒"
测试 1 - 原始 cl-format
"已用时: 194.405 毫秒"
测试 2 - 调用编译好的格式
"已用时: 87.271 毫秒"
测试 3 - 使用格式化器
"已用时: 199.318 毫秒"
因此原始`str`速度快约100倍。
参考:在同一硬件上,使用
SBCL Common Lisp,此测试运行时间小于1毫秒。
这里至少有两个问题
1. cl-format函数以类似下面的行开始
let [compiled-format (if (string? format-in) (compile-format format-in) format-in)
但是没有API可以将编译后的格式传递给它;(因为compile-format
是一个私有函数,因此不能广泛使用)所以这有点无用。
2. 即使使用预编译的格式化器,速度也太慢了。
建议的修复:没有,也许只是警告无意使用的用户,这个
函数根本不适合用于密集循环,并且仅应
用于美化打印用户输入字符串等。
谢谢