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