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

欢迎!请参阅《关于》页面获取更多有关此工作的信息。

0
core.logic

我在这里工作是从:https://github.com/aamedina/cljs.core.logic

我基本上按照 clojure.core.logic 的代码布局直接执行,考虑到 ClojureScript 的需要,将宏移动到姐妹 .clj 文件中。我对文件中宏的最佳组织方式没有明确的观点,我所做的方式只是我发现最容易的方式,因为这样你就不需要为引用姐妹 .cljs 文件中的函数的每一行带注解的语法进行命名空间限定。

此外,我也使用 clojurescript.test 将所有 clojure.core.logic 的测试移植过来。

5 个回答

0

评论由:adrianm 发布

因此,我已经更新了存储库,以反映对现有的 cljs.core.logic 代码约定和组织方式的更忠实遵循。我将非常感谢任何有关如何可能优化代码以更好地与 JVM 并行的见解。

0

评论由: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 vms 的特定实现来提高性能吗?仅从代码中看,它看起来很不同,因此这些性能问题也可能是由于未优化算法引起。

我可以帮助调查将 clojure.core.logic 移植的可行性,尽管我对 clojure 还比较新手。我的策略是在测试用例通过 clojurescript 之前添加读取条件。

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