Я пишу игровой 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]
Теперь оцениваем 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
Теперь, чтобы включить это в мой код Ants ...