Оптимизация изменения массива в 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)))

заняло в среднем 14 мс согласно Criterium, тогда как в Java для того же

public static int[] m(int[] x, int[] y)
{
  for(int i=0; i<x.length; i++)
    y[i] = 3*x[i];
  return y;
}

требуется в среднем 800 мкс.**

Делаю ли я все, что в моих силах, чтобы ускорить процесс, и могу ли я пойти дальше по пути оптимизации?

**Я замерил время с помощью Criterium с (report-result (bench (m xs ys )) :verbose)и(report-result (bench (. Test m xs ys)) :verbose)

6
задан Hendekagon 16 April 2012 в 06:29
поделиться