运行此示例代码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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 可以传入编译格式到其中;因为编译格式
是一个私有函数,所以无法广泛使用,因此这有点无用。
2. 即使使用预编译的格式化工具也过于缓慢。
建议的解决方案:没有其他解决方案,也许应该警告用户这个
函数根本不适用于密集循环,并且只能用于
美化用户输入字符串等。
谢谢