欢迎!请参阅关于页面了解更多关于这里的工作方式的信息。
当在应用程序中寻找执行速度时,当构造地图和向量时,很容易选择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
尝试找到问题的根本原因——是关于构建性能,还是特定于数组到持久向量的操作?对于地图,我假设它是从数组到持久地图的操作。
已经存在一个从数组到向量的接口 (into [] arr),因此这也许真的是关于使其更快的问题(这实际上与我现在正在做的工作有关)。对于映射,最好的对应可能是 (apply hash-map arr),但这样就会选择一个实现,正如你所说的。
(into [] arr)
(apply hash-map arr)