这个问题在一个更复杂的示例中出现了,但考虑以下情况
`
(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: )性能差异,以了解差异。