Прочитав несколько постов в блоге на эту тему, я обнаружил, что мутирует массив в Clojure так:Оптимизация мутации массива в Clojure
(defn m [xs ys]
(dotimes [i (count xs)]
(aset #^ints ys (int i)
(int (* (int 3) (int (aget #^ints xs (int i))))))))
где (def xs (into-array Integer/TYPE (range 1000000)))
и (def ys (into-array Integer/TYPE (range 1000000)))
уходило в среднем 14ms согласно Критерию, тогда как Java должен делать то же самое,
public static int[] m(int[] x, int[] y)
{
for(int i=0; i<x.length; i++)
y[i] = 3*x[i];
return y;
}
занимает в среднем 800US. **
Я делаю все, что в моих силах, чтобы все ускорилось, и есть ли еще какие-нибудь пути оптимизации?
** Я приуроченная их с помощью критериум с (report-result (bench (m xs ys)) :verbose)
и (report-result (bench (. Test m xs ys)) :verbose)
если вы делаете много такого рода вещи, вероятно, вы должны смотреть на 'core.matrix' и/или' vectorz-clj', а не руки -кодирование математических операций на массивах. – mikera
yeh, теперь, когда они существуют, конечно, – Hendekagon