评论由:mikera发表
Rich,这些见解很好——你是否有使用作为现实世界代码代表的基准?
我同意,如果我们能避免调用点变成巨大形态,那就太好了。然而,考虑到已经存在的多种IPersistentVector类型(MapEntry、PersistentVector、SubVector以及任何库定义的IPersistentVector实例,如clojure.core.rrb-vector),我认为这一艘船已经远航。因此,JVM通常无法证明特定IPersistentVector接口调用是单态的,这正是实现真正重大优化的地方。
在我接触的绝大多数现实世界代码中,相同的大小/类型的向量被反复使用(例如:遍历映射条目、处理大小为N的向量序列),因此在这种情况下,我们应该能够依赖多态内联缓存来做正确的事情。
对于大小0-4的单个元组类很有趣,尽管我不禁想到,从这个方面来说,性能提升可能来自于很多代码都做一些像(reduce conj ...)或transient等效的事情,这对于元组来说尤其是糟糕的使用案例,至少从调用站缓存的角度来看。可能有一种更好的方法来优化这些情况,而不仅仅是为元组加速……例如,在Tuple0上调用asTransient()可能可以直接切换到PersistentVector实现。