评论者:mikera
Rich,这些见解很好——你是否有用一个基准作为真实世界代码的代表性基准的测试?
我同意我们如果能避免调用点成为巨构的类型会是好事,尽管我也相信在已经存在多种IPersistentVector类型(如MapEntry、PersistentVector、SubVector以及任何库定义的IPersistentVector实例,例如clojure.core.rrb-vector)的情况下,这一目标已经失败了。因此,JVM通常不可能证明一个特定的IPersistentVector接口调用是单态的,这正是极大的优化发生的时候。
在我曾经工作过的绝大多数真实世界的代码中,相同的尺寸/类型的向量被反复使用(例如,遍历映射项,处理大小为N的向量序列),在这种情况下,我们应该能够依赖多态内联缓存做正确的事情。
为0-4大小范围使用单个Tuple类的想法很有趣,尽管我不禁认为从这种优化中获得的大量性能提升可能来自大量代码像东西(如(reduce conj (超连接: ) ....)或transient等价物,这种使用方法是Tuple特别差的场景,至少从调用点缓存的视角来看。可能有一种更好的方法来优化这类情况,而不是简单地尝试使Tuple更快……例如,将Tuple0的asTransient()调用立即切换到PersistentVector实现可能是一种更好的方法。