请在2024年Clojure调查中分享您的想法!

欢迎!请参阅关于页面了解有关此工作方式的一些更多信息。

0
编译器

这个问题在一个更复杂的例子中提出,但考虑以下这种情况

`
(defn simple []
(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: invokestatic #85 // Method clojure/lang/RT.uncheckedLongCast:(Ljava/lang/Object;)J

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

附件中有一个测试,展示了字节数组(link: )[link: ]和长整数(link: )[link: ]性能差异,以了解差异。

4 个答案

0

评论者:bronsa

描述中提到Util.equiv()有一个字节/字节比较变体,但看起来它实际上并不存在。

0

评论者:bronsa

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

0

评论者:alexmiller

谢谢你,尼古拉 - 我可能把它和布尔/布尔版本搞混了。

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