2024年Clojure状态调查!中分享您的想法。

欢迎!请参见关于页面了解该功能的一些更多信息。

0 votes
打印
运行此示例代码

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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. 即使用预先编译的格式化器也过于缓慢。


建议的修复方案:没有,也许应该警告用户这个
函数根本不适合用于紧密循环,而应仅用于
美化打印用户输入字符串等。

谢谢

2 答案

0 votes
参考:https://clojure.atlassian.net/browse/CLJ-1950(由 alex+import 报告)
0 votes







...