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

在紧密循环操作和匹配字节数组的情况下,这种装箱对性能有重要影响。

附上了一个测试用例,以展示-byte-(链接) 和-long-(链接) 性能之间的差异,以了解一下差异。

4 个答案

0

由bronsa发表的评论

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

0

由bronsa发表的评论

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

0

由alexmiller发表的评论

谢谢Nicola - 我可能把它与布尔值/布尔值版本混淆了。

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