2015-05-12 4 views
0

Вот код:Тип намекая на длинные массивы не улучшает производительность AGET

(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

Тип намека относится к ситуации взаимодействия, где компилятор не может иначе вывести тип. Если установка '* warn-on-reflection *' на true не приведет к появлению предупреждения на данном фрагменте кода, подсказка вообще не поможет. –

ответ

4

Вызов long-array является встраиваемой компилятором Clojure в вызове метода 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 вернется, так что вы должны увидеть хит показательных выступлений по сравнению к вашему примеру кода.

Смежные вопросы