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

欢迎!请参阅关于页面以获取有关该功能的一些更多信息。

+3
core.cache

我在使用core.cacheLazyMap的组合。懒映射是类似于map的对象(一种封装map并添加一些逻辑的新数据类型,以自动强制延迟键相关值的新数据类型)。

当我开始将懒映射作为FIFO缓存的值时,我发现所有值都仅在映射进入缓存后立即实现。经过一番探究,我发现这是由clojure.core.cache.wrapped/lookup-or-miss中的表达式(= ::expired v)导致的。

发生的事情是,=内部调用clojure.lang.Util/equiv(因为LazyMap实现了IPersistentCollection),然后,经过一些分派,调用equiv来检查懒映射的内容是否等于其他对象(隐含其他映射)。这是期望的行为,懒映射实现所有值以实现比较。

然而,当我们比较类似映射的对象与不是映射(也不是集合)的某些东西时,如果我们知道它肯定返回false,则短路将受欢迎。但这可能更多与Clojure本身和类似CLJ-1375的东西有关。

如果这不会太成问题,则可以在core.cache这一边这样做:

(= ::expired v)替换为(identical? ::expired v)

clojure.core.cache.wrapped中。

这不仅将修复像我这样的角落案例,还可以稍微加快一些速度(当涉及到Clojure关键字时,显式的引用相等非常有用)。

还可以更改的表达式
(= ::nope ret)和来自clojure.core.cache(= ::nil v)

2 个答案

+1
来自

我不明白为什么将所有这些关键字比较更改为 identical? 检查会成为问题。我将对此再思考一下,但与此同时我已经创建了 https://clojure.atlassian.net/browse/CCACHE-66

你有一个我可以查看的复现例子吗?

来自
谢谢!

以下是一些例子


(require '[clojure.core.cache :as cache]
                 '[clojure.core.cache.wrapped :as cwr]
                 '[lazy-map.core :as lm])

(def C (atom (cache/fifo-cache-factory {})))
(def m (lm/->LazyMap {:a 1 :b (delay 8)}))

m
; => {:a 1, :b <unrealized>}

 (cwr/lookup-or-miss C :k (constantly m))
; => {:a 1, :b 8}

m
; => {:a 1, :b 8}


需要

com.intuitiveexplanations/lazy-map   {:mvn/version "1.0.0"}
org.clojure/core.cache                             {:mvn/version "1.0.225"}
+1
来自

为 CCACHE-66 附上补丁

https://gist.github.com/siefca/fa2745999281440867de1d1a89243f6d

(我在大约2或3年前签署了Clojure贡献者协议。)

...