请在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 // 方法 java/lang/Byte.valueOf:(B)Ljava/lang/Byte; 30: checkcast #81 // 类 java/lang/Number 33: invokestatic #85 // 方法 clojure/lang/RT.uncheckedLongCast:(Ljava/lang/Object;)J

在一个密集循环中操作和匹配字节数组时,这种装箱对性能有重大影响。

附件是一个测试,用于展示字节(link: )和长整型(link: )性能差异,以了解差异。

4 个答案

0

由bronsa发表的评论

描述中指出,Util.equiv()有一个字节/字节比较的变体,但它似乎根本不存在。

0

由bronsa发表的评论

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

0

评论人:alexmiller

感谢Nicola - 我可能把它和布尔/布尔版本弄混了。

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