Performance 长数组中的类型暗示不能提高aget的性能
代码如下:Performance 长数组中的类型暗示不能提高aget的性能,performance,clojure,Performance,Clojure,代码如下: (time (dorun 1000000 (repeatedly #(let [a (long-array (range 10))] (aget a 7))))) (time (dorun 1000000 (repeatedly #(let [^longs a (long-array (range 10))] (aget a 7))))) Cloj
(time
(dorun 1000000
(repeatedly #(let [a (long-array (range 10))]
(aget a 7)))))
(time
(dorun 1000000
(repeatedly #(let [^longs a (long-array (range 10))]
(aget a 7)))))
Clojure编译器将对
long数组的调用内联到对Java方法Clojure.lang.Numbers/long_数组的调用中,该方法的返回类型为long[]
。因此,编译器已经能够推断a
的类型,而类型暗示在这里对您没有任何好处
将此与:
(time
(dorun 1000000
(repeatedly #(let [a (or (long-array (range 10))
(int-array (range 10)))]
(aget a 7)))))
在这里,编译器无法推断a
的类型,因为它无法预测或
的哪个分支将返回,因此,与示例代码相比,您应该会看到显著的性能损失。对long数组的调用由Clojure编译器内联到对Java方法Clojure.lang.Numbers/long_数组的调用中,该方法的返回类型为long[]
。因此,编译器已经能够推断a
的类型,而类型暗示在这里对您没有任何好处
将此与:
(time
(dorun 1000000
(repeatedly #(let [a (or (long-array (range 10))
(int-array (range 10)))]
(aget a 7)))))
在这里,编译器无法推断a
的类型,因为它无法预测或的哪个分支将返回,因此与示例代码相比,您应该会看到显著的性能影响。类型暗示与互操作情况相关,在互操作情况下,编译器无法推断类型。除非将*warn on reflection*
设置为true会在给定的代码段上生成警告,否则提示通常不会有帮助。类型提示与互操作情况相关,在互操作情况下,编译器无法以其他方式推断类型。除非将*反射时警告*
设置为true会在给定代码段上生成警告,否则提示通常不会有帮助。