我正在写一个玩游戏的ai(aichallenge.org - Ants),它需要大量更新,并引用数据结构.我已经尝试了数组和地图,但基本问题似乎是每次更新都会创建一个新值,这会让它变慢.如果您花费超过一秒钟来进行移动,游戏会引导您,因此应用程序将被视为"硬实时".是否有可能在Haskell中具有可变数据结构的性能,或者我应该学习Python,还是在OCaml中重写我的代码?
我完全改写了蚂蚁"初学者包".从阵列更改为地图,因为我的测试显示地图更新速度更快.
我运行了地图版本并进行了分析,结果显示仅有20%的时间是由地图更新单独进行的.
这是一个简单的演示,说明阵列更新的速度有多慢.
slow_array =
let arr = listArray (0,9999) (repeat 0)
upd i ar = ar // [(i,i)]
in foldr upd arr [0..9999]
Run Code Online (Sandbox Code Playgroud)
现在评估slow_array!9999需要将近10秒!虽然一次应用所有更新会更快,但该示例模拟了每回合必须更新阵列的真正问题,并且最好每次在计划下一轮时选择移动.
感谢nponeccop和Tener参考矢量模块.以下代码等同于我的原始示例,但运行时间为0.06秒而不是10秒.
import qualified Data.Vector.Unboxed.Mutable as V
fast_vector :: IO (V.IOVector Int)
fast_vector = do
vec <- V.new 10000
V.set vec 0
mapM_ (\i -> V.write vec i i) [0..9999]
return vec
fv_read :: IO Int
fv_read = do
v <- fast_vector
V.read v 9999
Run Code Online (Sandbox Code Playgroud)
现在,将其纳入我的蚂蚁代码......