评论由: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实现。