评论者:mikera
这些见解很好,你是否有使用作为真实世界代码代表性的基准测试?
我同意如果我们能避免调用点变得多态化会很好,尽管我也认为这个船已经扬帆起航了,因为已经存在多种IPersistentVector类型(MapEntry,PersistentVector,SubVector,以及clojure.core.rrb-vector等由库定义的IPersistentVector实例)。因此,JVM通常无法证明特定IPersistentVector接口调用是一元多态的,即此时发生的真正大优化。
在我曾处理的大多数真实世界代码中,相同的尺寸/类型向量被反复使用(例如:遍历映射条目,处理大小为-N的向量序列),因此在这种情况下,我们应该能够依赖多态内联缓存做正确的事情。
为0-4个大小使用单个Tuple类是一个有趣的想法,尽管我忍不住认为性能增益可能源于大量代码做类似于(reduce conj ...)或transient类似操作的事实,这对于Tuple来说是一个特别坏的使用案例,至少从调用点缓存的角度看。可能有一种更好的方法来优化这种情况,而不仅仅是尝试使Tuple更快,例如,在Tuple0上调用的asTransient()可能直接切换到PersistentVector实现。