评论由:mikera 发表
Rich,这些见解很好——你有没有使用作为真实世界代码代表的基准测试吗?
我同意,如果我们能避免调用位置变为巨形会很好,尽管我认为当考虑到已经存在的多种IPersistentVector类型(如MapEntry、PersistentVector、SubVector以及任何库定义的IPersistentVector实例,如clojure.core.rrb-vector)时,这方面的机会已经失去了。因此,JVM通常无法证明特定IPersistentVector接口调用的单形性,这正是真正的大优化发生的时候。
在我所合作的绝大多数真实世界代码中,相同的尺寸/类型的向量会反复使用(例如:迭代map条目、处理大小为N的向量序列),因此在这种情况下,我们应该能够依赖多态内联缓存正确地完成工作。
单个Tuple类用于0-4大小的想法很有趣,尽管我不禁想到,这种性能优势的大部分可能来自于很多代码都进行类似(reduce conj ...)或transient等效操作的事实,这对Tuple来说是特别坏的使用案例,至少从调用位置缓存的角度来看。也许有更好的方法来优化这种案例,而不是仅仅尝试使Tuple更快...例如,在Tuple0上调用asTransient()可能直接切换到PersistentVector实现。