欢迎!请查看关于页面以了解更多该平台如何运作的信息。
当寻找应用程序的执行速度时,在构建映射和向量时使用 java.util.ArrayList 充分诱惑。但这样做有一些缺陷。例如,对于向量,人们应该使用 LazilyPersistentVector/createOwning 而不是比如 PersistentVector/adopt(前者能正确工作),而后者仅针对小于 32 的向量有效。
java.util.ArrayList
LazilyPersistentVector/createOwning
PersistentVector/adopt
同样,对于映射,如果映射中的条目不到 9 个,可以选择创建一个 PersistentArrayMap,但如果条目是 9 个或更多,则应使用 PersistentHashMap。
PersistentArrayMap
PersistentHashMap
我不打算在这里规定解决方案,但有一些在 clojure.core 中的函数,它们接收数组作为参数,并返回适当的数据结构 (array->vector arr) ;; 与 LazilyPersistentVector/createOwning 功能相同 (array->map arr) ;; 根据大小返回 PAM 或 PHM
clojure.core
(array->vector arr) ;; 与 LazilyPersistentVector/createOwning 功能相同 (array->map arr) ;; 根据大小返回 PAM 或 PHM
试图找到根本问题——这是关于构建性能还是具体是关于数组到持久向量的转换?对于映射,我假设它是 kv 数组到持久映射的转换?
已经有一个从数组到向量的接口 (into [] arr),所以这可能真的是关于让它更快(这实际上与我现在正在工作中的一些事情相交集)。对于映射来说,可能最好的等效操作是 (apply hash-map arr),但这会根据您所说的选择一个实现。
(into [] arr)
(apply hash-map arr)