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会在给定代码段上生成警告,否则提示通常不会有帮助。