2024 Clojure现状调查中分享您的想法!

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

0
打印
运行此示例代码

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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. 即使使用预编译的格式化器,速度也太慢了。


建议的修复:没有,也许只是警告无意使用的用户,这个
函数根本不适合用于密集循环,并且仅应
用于美化打印用户输入字符串等。

谢谢

2 个答案

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

似乎可以通过将 compile-format 公开来部分解决这个问题。关于 compile-format 的文档字符串建议将其用作提高性能的方法;将返回的编译后的blob传递给 cl-format(而不是格式字符串)似乎按预期工作。也许这个问题只是被忽略了吧,该函数标记为私有只是一个疏忽?

by
compile-format 有所帮助,但与例如 clojure.core/format 相去甚远。

与常见的 Lisp 的 format 的不一致是这一主题的核心。

https://www.reddit.com/r/lisp/comments/qho92i/a_casual_clojure_common_lisp_codeperformance/

cl-format 需要重写,以消除许多剩余的性能;特别是仅在 clojure.core/format 不使用的持久结构中独占使用。  我开始在大约写的时候深入研究,但没怎么取得进展。
...