评论者:mikera
丰富的内容,您是否有一个作为实际代码代表的基准测试?
我同意如果我们可以避免调用点变成巨型多态,尽管我认为当考虑已存在的多种 IPersistentVector 类型(如 MapEntry、PersistentVector、SubVector 以及 clojure.core.rrb-vector 等)时,在这方面已经无力回天。因此,JVM 通常无法证明特定 IPersistentVector 接口调用是一致多态的,这通常是最大优化的发生时刻。
在我曾合作的大多数实际代码中,相同大小/类型的向量会被反复使用(例如:遍历映射条目,处理大小为N的向量序列),因此在这种情况下,我们应该能够依赖多态内联缓存来做正确的事情。
对于0-4个大小使用单个 Tuple 类的想法很有趣,尽管我忍不住想,性能的提升很大程度上可能源于很多代码像 (reduce conj (link: ) ...) 这样的操作或transient的等价物,这可能是 Tuple 的一个特别糟糕的使用情况,至少从调用站点缓存的角度来看。可能存在一种更好的优化此类情况的方式,而不仅仅是尝试使 Tuple 更快……例如,在 Tuple0 上调用 asTransient() 可能直接切换到 PersistentVector 实现。