Clojure在州的游戏循环中裁判:为什么它走得越来越慢?

Clojure在州的游戏循环中裁判:为什么它走得越来越慢?,clojure,ref,Clojure,Ref,我试图在上一步的基础上每一步更新一个映射。我有一个参考,它是一个数字向量的向量,为了模糊我的世界地图,我向左、向右、向上和向下旋转,然后平均我的四个新世界地图。我在主循环中以“alter”的形式进行此更新。最初速度很快,但越来越慢。难道我没有以某种我不知道的方式放开脑袋吗?它似乎在每一步都会进行之前的所有计算。这是我的密码: 我定义地图: (def gradient-map (ref( vec (repeat columns (vec (repeat rows 0)))

我试图在上一步的基础上每一步更新一个映射。我有一个参考,它是一个数字向量的向量,为了模糊我的世界地图,我向左、向右、向上和向下旋转,然后平均我的四个新世界地图。我在主循环中以“alter”的形式进行此更新。最初速度很快,但越来越慢。难道我没有以某种我不知道的方式放开脑袋吗?它似乎在每一步都会进行之前的所有计算。这是我的密码:

我定义地图:

      (def gradient-map
       (ref( vec (repeat columns (vec (repeat rows 0))))))
以下是我的更新功能:

(defn rotate-grid-up [grid]
  (map #(concat (rest %) [(last %)]) grid))
(defn rotate-grid-down [grid]
  (map #(concat [(first %)] (drop-last %)) grid))
(defn rotate-grid-right [grid]
  (concat [(first grid)] (drop-last grid)))
(defn rotate-grid-left [grid]
  (concat (rest grid) [(last grid)]))

(defn blur [grid]
  (let [g1 (rotate-grid-up grid)
        g2 (rotate-grid-down grid)
        g3 (rotate-grid-left grid)
        g4 (rotate-grid-right grid)]
   (vec (map
     (fn [r1 r2 r3 r4 r5]
       (vec (map
        #(/ (+ %1 %2 %3 %4 %5) 5)
        r1 r2 r3 r4 r5)))
     g1 g2 g3 g4 grid))))
然后在我的画循环中,我模糊了每个tic

(dosync (alter gradient-map blur))

绘图循环会变慢为爬行。

代码创建了太多的向量,导致内存使用和gc增加

您可以尝试不创建向量,懒洋洋地做每件事,或者尽量减少它们的创建。或者,您可以使用矩阵库(例如core.matrix或白炽灯)


另外,不相关的,你需要一个比赛状态的裁判吗?如果与其他类似的东西没有依赖关系,一个原子就足够了吗?

在我相当新的计算机上,1000×1000网格的模糊处理大约需要2.7秒。您的世界地图是否随着时间的推移而增长?

您的所有旋转函数都是惰性的(无论是
map
还是
concat
都是惰性的)。也许你应该尝试将所有旋转函数的主体包装进去,看看是否有帮助。你确定这个
doasync
就是cluprit吗?你在画图循环中还做什么?为什么要使用参照系?有多个线程吗?你创造工作的速度比完成工作的速度快吗?