评论者:mikera
这些见解很深刻——您是否有一个用来代表真实世界代码的基准测试?
我同意如果我们能避免调用点变成巨形是件好事,尽管我同时也认为,当我们考虑到已经存在的多重IPersistentVector类型(MapEntry、PersistentVector、SubVector以及任何库定义的IPersistentVector实例,如clojure.core.rrb-vector)时,这一轮已经结束了。结果是,JVM通常无法证明特定IPersistentVector接口调用是单态的,而这恰恰是在出现真正大优化的时候。
在我所处理的大部分真实世界代码中,相同大小/类型的向量被反复使用(例如:遍历map条目,处理大小为N的向量序列),因此在这种情况下,我们应能够依赖多态内联缓存做一些正确的事情。
一个大小为0-4的单个元组类对于SIZE是有趣的,尽管我忍不住想到,很多性能提升可能源于许多代码做类似(reduce conj (链接: ) ……)或transient等价物的事情,这对元组来说尤其是一个糟糕的使用案例,至少从调用站点缓存的角度来看。可能有更好的方法来优化这种案例,而不仅仅是尝试使元组更快……例如,对Tuple0调用asTransient()可能直接切换到PersistentVector实现。