评论人:mikera
Rich 这些见解很好 - 你是否有作为真实世界代码代表的基准测试?
我同意如果能避免调用点变得巨形态那就太好了,尽管我同时认为当考虑到已经存在的多种 IPersistentVector 类型(例如 MapEntry、PersistentVector、SubVector 以及任何库中定义的 IPersistentVector 实例,如 clojure.core.rrb-vector)时,这一点可能已经无法实现了。因此,JVM 通常不可能证明特定的 IPersistentVector 接口调用是单态的,这是真正的大优化发生的时候。
在我处理的大多数真实世界代码中,相同的尺寸/类型的向量会被反复使用(例如:遍历映射条目、处理大小为-N 的向量序列),因此在这些情况下,我们应该能够信赖多态内联缓存做正确的事。
为大小 0-4 设计一个单一 Tuple 类的想法很有意思,尽管我不禁想到,从性能提升的角度来看,这其中的很多可能来自大量代码执行类似 (reduce conj (link: ) .....) 或其瞬态等价的操作,这对 Tuple 来说是一个特别糟糕的使用场景,至少从调用点缓存的角度来看。可能有一种更好的优化此类案例的方法,而不仅仅是试图让 Tuple 变快...... 例如,对 Tuple0 调用 asTransient() 可能可以直接切换到 PersistentVector 实现。