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

欢迎!请查阅关于页面,了解该功能的更多信息。

+1
tools.reader

Tools.reader 接受这个符号:MyClazz:/3,但不接受符号 MyClass:。这似乎不一致。这是本次“提问”的主要内容。

顺便说一句,我注意到这个提交
https://github.com/clojure/tools.reader/commit/31adc06cd56753ed5a3cd443cea32158ba68c45c#diff-11ba7fe0994caede16eeb1c6ed52fc3aba112849ce1fd23dff0b9fb72441a09fR111
使用正则表达式 + re-matches 检查 sym 是否为 1 位的数字字符串。我发现这比 1.4.2 版本导致轻微的性能下降。我认为可以使用一种更复杂但更高效的方法来实现此检查

  • 检查字符串长度是否为 1
  • 只有在此之后,再检查该字符串是否代表一个介于 1 和 9 之间的数字

例如,这个版本似乎比 re-matches 方法快约 6 倍

user=> (defn array-dim? [^String s] (and (= 1 (.length s)) (some-> (try (Integer/parseInt s) (catch Exception e nil)) pos?)))
#'user/array-dim?
user=> (time (dotimes [i 10000000] (array-dim? "1")))
"Elapsed time: 45.287416 msecs"
user=> (defn array-dim2? [^String s] (re-matches #"[1-9]" s))
#'user/array-dim2?
user=> (time (dotimes [i 10000000] (array-dim2? "1")))
"Elapsed time: 304.30275 msecs"
nil

注意 clojure 自带的读取器是如何实现的

https://github.com/clojure/clojure/commit/1fa5b038a434da34f787e3aec56f9cb48ed4dd99#diff-9216bc4fd055e0567fa034ec14a8ba470d36ba5be16418c8f2e2ebe1939bbb21R259

这是我的错,因为我实现了正则表达式版本。一旦有 JIRA 工单,我将编写一个补丁。

1 个答案

+1
谢谢。性能问题是额外收获。主要问题是

Tools.reader可以接受这个符号:MyClazz:/3,但是不支持符号MyClass:.这似乎不统一。这就是这个问题的主要内容。
...