2024 年 Clojure 调查)中分享您的想法!

欢迎!请查看关于页面以了解有关此内容的更多信息。

0
core.logic

我正在工作的Repo在这里:https://github.com/aamedina/cljs.core.logic

我基本上按照 clojure.core.logic 中的代码布局实施了,根据 ClojureScript 的需求进行了调整,将宏移动到了姐妹.dlj 文件中。我对每个文件中宏的最佳组织方式没有固定的看法,我这样做只是因为我认为这样做是最容易的,因为你不必为引用姐妹.dynomite 文件中函数的所有引号语法形式都进行命名空间限定。

此外,我还使用 clojurescript.test 将所有 clojure.core.logic 的测试端口携带过来。

5 个答案

0
by

评论者:adrianm

因此,我已经更新了代码库以更好地遵循现有的 cljs.core.logic 代码约定和组织结构。我非常感谢任何可以帮助优化代码以使其更加接近 JVM 运行的洞察力。

0
by

评论者:dnolen

你观察到了什么类型的性能问题?你有运行特定的基准测试吗?

0

评论者:adrianm

Appendo 和 membero 非常慢。

(dotimes (link: i ie5) (run* (link: q) (== q true))) 需要大约 ~4500ms,这比 JVM 慢约 10 倍。

经过分析后,我发现问题 —— 需要进行相当标准的递归优化,因为代码执行时,会递归地重走(通过重新统一)lvars。例如,
对于 appendo,(run 5 (link: q) (fresh (link: x y) (appendo x y q))) 会展开成类似的东西..

((_0) (_0 . _1) (_0 _1 . _2) ... ))

它之所以慢,是因为每个新的列表实际上都会再次递归地重走之前统一的所有 lvar。

周末我会有更多时间来调查这个问题,但我想这或许可以通过不默认生成唯一的 lvars 来解决,因为这样,用于统一的 identical? 检查应该可以捕获任何尝试的遍历。

0

评论者:munro

我一直使用 clojure.core.logic 和 cljs.core.logic,并遇到了 API 差异问题。考虑到新的读取条件,我认为应该废弃 cljs.core.logic,改用 clojure.core.logic。

cljs.core.logic 有特定的实现来使其在 JS vm 上表现良好吗?仅从代码来看,它看起来相当不同,所以这些性能问题也可能是由未优化算法引起的。

我可以帮助调查将 clojure.core.logic 便携化的方法,尽管我对 clojure 是新手。我的策略是添加读取条件,直到测试套件在 clojurescript 中通过。

0
参考:https://clojure.atlassian.net/browse/LOGIC-144(由 adrianm 报告)
...