欢迎!请参阅关于页面以了解有关如何工作的更多信息。
在寻找应用程序中的执行速度时,构建映射和向量时使用 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)