长数组中的类型提示不会提高aget的性能

时间:2015-05-12 15:44:48

标签: 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)))))

1 个答案:

答案 0 :(得分:4)

Clojure编译器将对long-array的调用内联到对Java方法clojure.lang.Numbers/long_array的调用中,该方法的返回类型为long[]。因此,编译器已经能够推断出a的类型,而类型提示在这里没有任何好处。

将其与:

进行比较
(time
  (dorun 1000000
         (repeatedly #(let [a (or (long-array (range 10))
                                  (int-array (range 10)))]
                       (aget a 7)))))

此处,编译器无法推断a的类型,因为它无法预测or的哪个分支将返回,因此您应该会看到与您相比的显着性能损失示例代码。