评论者:mikera
Rich 这些见解很好 -你是否有一个基准用来代表实际代码的效率?
我同意如果我们能避免调用点变为大规模形态会很好,但考虑到已经存在的多种 IPersistentVector 类型(MapEntry、PersistentVector、SubVector 以及任何库定义的 IPersistentVector 实例,如 clojure.core.rrb-vector),我认为在那方面已经没有什么方法了。因此,JVM 通常无法证明特定的 IPersistentVector 接口调用是同态的,而这正是发生真正大优化的地方。
在我的大多数实际代码工作中,相同的尺寸/类型的向量被反复使用(例如:遍历映射条目,处理大小为 N 的向量序列),因此在这种情况下,我们应该能够依赖多态内联缓存正确执行。
单个 Tuple 类对于大小 0-4 感觉很有趣,但我还是认为性能提升可能更多地源于很多代码像这样做东西(reduce conj(link:)...)或者 transitory 相似,这对 Tuple 是一个特别糟糕的使用案例,至少从调用站点缓存的角度来看。可能还有更好的方法来优化这些案例,而不仅仅是尝试让 Tuple 更快。例如,在 Tuple0 上调用 asTransient() 可能直接切换到 PersistentVector 实现。