点评作者:mikera
丰富的见解——你是否有作为真实世界代码代表的基准测试?
我同意如果我们能避免调用点变成巨构体是很好的,但当我考虑到已经存在的多种 IPersistentVector 类型(如MapEntry、PersistentVector、SubVector以及库定义的IPersistentVector实例,如clojure.core.rrb-vector)时,我认为这艘船已经开了。因此,JVM通常无法证明某个具体的IPersistentVector接口调用是单态的,而这时候发生真正的优化。
在我一直在处理的大多数真实世界代码中,使用相同大小/类型的向量是反复发生的(例如:遍历map条目,工作于大小为N的向量序列),因此在这些情况下,我们应该能够依赖于多态的内联缓存做好正确的事情。
对于大小为0-4的单个元组类 ideas 很有趣,尽管我不禁想到,从性能提升来看,这很可能是因为大量代码都执行如(reduce conj ...)或transient等效的操作,这对元组来说尤其是一个糟糕的用例,至少从调用点缓存的角度来看。可能有一种更好的方法来优化这些情况,而不是单纯尝试让元组更快 ... 例如,在 Tuple0 上调用 asTransient() 可能会直接切换到 PersistentVector 实现。