Cac*_*tus 4 arrays performance haskell addressing data-structures
假设我有一个Data.Array.IO.IOArray i e(来自array包),我想从中读取元素,根据一些索引顺序在 IO 中一个一个地处理每个元素:
arr :: IOArray I E
ordering :: [I]
processElement :: I -> E -> IO ()
Run Code Online (Sandbox Code Playgroud)
(正如我们所见,一切都是单态的)。
有两种明显的方法可以做到这一点:
freeze首先将数组放入不可变数组中,然后使用!运算符:
do
arr' <- freeze arr
forM_ ordering $ \i -> processElement i (arr' ! i)
Run Code Online (Sandbox Code Playgroud)
readArray'ing 原始可变数组中的每个元素:
forM_ ordering $ \i -> do
e <- readArray arr i
processElement i e
Run Code Online (Sandbox Code Playgroud)
中的索引ordering是“密集”的,因为大多数索引arr出现在 中ordering。
哪一种更有效率?此外,答案是否取决于以下因素:
ordering有重复索引?ordering是否单调递增?ordering是完全随机还是有大的连续延伸?