评论者:mikera
Rich, 这些见解很好 - 你是否有用作现实世界代码代表性的基准测试?
我同意如果我们可以避免调用点成为巨形化是很棒的,但考虑到已经存在的多个IPersistentVector类型(例如MapEntry, PersistentVector, SubVector以及clojure.core.rrb-vector等库定义的IPersistentVector实例),我认为这艘船已经离去了。因此,JVM通常无法证明特定IPersistentVector接口调用是单态的,这才是真正大的优化发生的时候。
在我几乎所有的真实世界代码工作中,相同的尺寸/类型的向量被重复使用(例如:迭代map项,处理尺寸为N的向量的序列),因此在这种情况下,我们应该能够依赖多态内联缓存做正确的事。
为大小0-4的单一个Tuple类的想法很吸引人,但我不禁想到,这种性能提升的很大一部分可能来源于很多代码像这种作法的做法(例如:reduce conj (...) 或其transient等效)这对Tuple来说是一个非常糟糕的使用案例,至少是从调用缓存的角度来看。可能有一种更好的方法来优化这种情况,而不仅仅是尝试让Tuple更快....例如,在Tuple0上调用asTransient()可能直接切换到PersistentVector实现。