评论由: alexyakushev 提出
我尝试按照(链接:~alexmiller)的建议实现。附带的补丁文件使用 getComponentType 代替字符串魔术,与第一个补丁相比,提出了以下改进:
- 现在支持 aset。除了最后一个索引之外的所有索引均为 unroll 到 {{RT.aget}} 调用,最外层的调用扩展到 {{RT.aset}}。
- 如果内联版本在任何一点都无法解析数组的类型,那么,它将不会展开为 N 个 {{RT.aget}} 调用(这会导致 N 个编译器反射点),而是生成对非内联 {{aget}} 调用的调用,该调用将使用 {{Array.get}}(这更快)。
不利的一面是,现在对 aset 的多参数调用将触发编译器反射,以前它是 {{Array.set}}。我想知道是否应该对这些角落进行平滑处理,或者在这种情况下,是否更好的是让这种情况下的反射更加明显(显示在编译器警告中)。
我还附上了验证示例的 REPL 日志(使用 clj-java-decompiler)。将其转换为测试将会很好,但我还不知道如何做到。
顺便提一下,我必须使用技巧 {{((var aget) ...)}} 来强制调用非内联版本。我并不喜欢它,但我还没有想出更好的办法。另一种方法是将非内联版本分离到单独的私有函数中,但我不想在核心命名空间中添加更多的 Vars。