2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以获取更多有关该功能的信息。

0
编译器

这在更复杂的示例中出现过,但考虑一下这种情况

`
(*defn 简单 []
(*let [b (byte-array [(byte 0)])

    m (byte 0)]
(= m (aget b 0))))

`

在编译后的字节码中,m和(aget b 0)都被确认为字节,但都使用Byte.valueOf()装箱,然后使用RT.uncheckedLongCast()进行类型转换,最终以长整型进行比较

26: iload_2 27: invokestatic #69 // Method java/lang/Byte.valueOf:(B)Ljava/lang/Byte; 30: checkcast #81 // class java/lang/Number 33: invokevirtual #85 // Method clojure/lang/RT.uncheckedLongCast:(Ljava/lang/Object;)J

在紧循环中操作和匹配字节数组时,这种装箱对性能有显著影响。

附上了一份测试,展示了字节(link: )和长整型(link: )性能差异的示例试验。

4 个答案

0

评论者:bronsa

描述中提到 Util.equiv() 有一个 byte/byte 比较变体,但实际上它似乎并不存在。

0

评论者:bronsa

顺便说一下,tools.emitter.jvm 使用i2l将字节转换为长整型,而不是装箱和解装箱来转换为长整型

0

评论者:alexmiller

感谢 Nicola - 我可能把它混淆了,是关于布尔值/布尔版本的。

0
by
参考: https://clojure.atlassian.net/browse/CLJ-1342(由 alexmiller 报告)
...