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

欢迎!请查看关于页面了解更多关于该功能的信息。

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报告)
...