Size: a a a

Clojure — русскоговорящее сообщество

2019 December 11

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
пока (и возможно вообще) самая быстрая реализация:
(defn swap-diap*
 [v i j]
 (if (= i j)
   v
   (let [arr (to-array v)]
     (loop [a (min i j)
            b (max i j)]
       (if (>= a b)
         (vec arr)
         (let [t (aget arr a)]
           (aset arr a (aget arr b))
           (aset arr b t)
           (recur (inc a) (dec b))))))))

на синтетических тестах работает 8 секунд против 14 у наивного лупа с ассоком в кложевый вектор
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
а если транзиентный вектор взять?
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
в наивной реализации? щас попробую
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Andrey Ivanov
Кто реализует самую оптимальную версию функции
reverse-diap [vec from to]

которая принимает вектор и 2 индекса и возвращает вектор с реверснутым диапазоном между этими индексами (оба включительно), тот молодец ) Хоть через джава-интероп
хе, т.е. оно должно вернуть ОРИГИНАЛЬНЫЙ вектор, где только указаный диапазон реверснут?
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
так выпьем же за то, чтобы задачи были нормально описаны
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Вот теперь, Ваня, ты молодец! 7.5 секунд на том же тесте )
(defn swap-diap*
 [v i j]
 (let [a (min i j)
       b (max i j)]
   (loop [c a
          r (transient v)]
     (if (> c b)
       (persistent! r)
       (recur (inc c) (assoc! r c (v (+ a (- b c)))))))))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
транзиент выруливает. вот и появился повод его заюзать
ЗЫ я даже помню что-то читал в твоем блоге про него )
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
у меня глава про изменяемость, и там про транзиенты было
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Andrey Ivanov
транзиент выруливает. вот и появился повод его заюзать
ЗЫ я даже помню что-то читал в твоем блоге про него )
mapv работает ровно так же
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
как и многие другие кор функи
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Andrew Rudenko
ты задал вопрос как можно оптимизировать функцию, при этом не дав саму функцию. очевидная имплементация ее это:

(defn reverse-diap [vec from to]
 (mapv #(nth vec (dec %)) (range to from -1)))
тут не происходит никаких аллокаций промежуточных деревьев
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Andrey Ivanov
Вот теперь, Ваня, ты молодец! 7.5 секунд на том же тесте )
(defn swap-diap*
 [v i j]
 (let [a (min i j)
       b (max i j)]
   (loop [c a
          r (transient v)]
     (if (> c b)
       (persistent! r)
       (recur (inc c) (assoc! r c (v (+ a (- b c)))))))))
но такое конечно будет эффективнее в конкретном случае
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
По поводу блох. Если у меня функция принимает вектор из 2 аргументов, и каждый раз при вызове я его конструирую, то переписав на 2 отдельных параметра и не конструируя вектор для вызова можно что-то получить существенное, как думаете? Просьба в байтоебстве не обвинять и в Джаву не посылать )
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Добавил кешиков, отсечений, оптимизаций и вместо 1.2 сек на запрос стало 60 мс. Так уже можно жить.
источник

SH

Serhii Hapii in Clojure — русскоговорящее сообщество
Andrey Ivanov
Добавил кешиков, отсечений, оптимизаций и вместо 1.2 сек на запрос стало 60 мс. Так уже можно жить.
На cache miss или hit?
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Сложный вопрос, не знаю что сказать ) Я имел в виду свои ручные кешики часто вызываемой чистой функции. Не через  мемоиз, а тупо через атом, чтобы самому в любой момент чистить когда надо
источник

MN

Maksim N in Clojure — русскоговорящее сообщество
Почему нигде нет бенчмарков datomic?
источник

MN

Maksim N in Clojure — русскоговорящее сообщество
И еще вопрос: datomic можно бесплатно использовать на продакшене?
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Вроде можно: через год просто лишаешься обновлений
источник