Performance Haskell-从列表转换为数据.Vector

Performance Haskell-从列表转换为数据.Vector,performance,list,haskell,vector,Performance,List,Haskell,Vector,在分析我的haskell程序之后,我发现程序中66%的时间都花在列表索引上。解决方案似乎是使用Data.Vector,但我在转换时遇到了问题:当我将代码更改为使用Vector时,它会占用大量内存,并且挂起得非常厉害,我甚至无法分析它。这是什么原因造成的 以下是我要转换的文件: 我试图将其转化为: 你知道我做错了什么吗?或者至少,去哪里看 makeEmptyGrid width height defaultCell = Grid (Data.Vector.take arraySize $ from

在分析我的haskell程序之后,我发现程序中66%的时间都花在列表索引上。解决方案似乎是使用Data.Vector,但我在转换时遇到了问题:当我将代码更改为使用Vector时,它会占用大量内存,并且挂起得非常厉害,我甚至无法分析它。这是什么原因造成的

以下是我要转换的文件:

我试图将其转化为:

你知道我做错了什么吗?或者至少,去哪里看

makeEmptyGrid width height defaultCell = Grid (Data.Vector.take arraySize $ fromList $ repeat defaultCell) width height
那是个杀手
fromList
将整个列表转换为
向量
,但
repeat defaultCell
是一个无限列表

makeEmptyGrid width height defaultCell = Grid (fromListN arraySize $ repeat defaultCell) width height

我会解决的


粗略地看一下其余部分并没有发现更多明显的陷阱,但我可能很容易忽略了一些陷阱。

这只是丹尼尔之后的一个额外想法。看起来你的
网格
只有
颜色
对于一个小的“网格”可能没有多大作用,但是对于
颜色
来说,相对而言,制作一个
取消装箱
的实例比较容易。然后网格将包含一个未绑定的数组。在
Grid.hs
中,您将导入
Data.Vector.unbox
而不是
Data.Vector
。出于许多原因,这通常要好得多,但需要对许多定义设置
Unbox a=>
约束。如果您想要制作或“映射”到网格中,而不是
Color
,这可能会产生后果,除非它有一个
Unbox
实例

下面我只添加了
vector TH unbox
中的TH咒语(我最近刚刚了解了该软件包,并借此机会再次测试了它)和两个必要的定义。在
Data.Vector.Unboxed.Base
中按照Bool实例手工编写也不会太难

{-#LANGUAGE TemplateHaskell, TypeFamilies, MultiParamTypeClasses#-}
module Color where

import Display
import Data.Vector.Unboxed.Deriving 
import qualified Data.Vector.Unboxed as V 
import qualified Data.Vector.Generic         as G
import qualified Data.Vector.Generic.Mutable as M 
import Data.Word (Word8)

data Color = Yellow | Red | Green | Blue | Empty      
           deriving (Show, Eq, Ord, Enum, Bounded)

fromColor :: Color -> Word8
{-# INLINE fromColor #-}
fromColor = fromIntegral . fromEnum

toColor :: Word8 -> Color
{-# INLINE toColor #-}
toColor x | x < 5 = toEnum (fromIntegral x)
toColor _ = Empty

derivingUnbox "Color"
   [t| Color -> Word8 |]
    [| fromColor |]
    [| toColor |]

-- test
colorCycle :: Int -> V.Vector Color
colorCycle n = V.unfoldr colorop 0 where 
  colorop m  | m < n =  Just (toColor (fromIntegral (m `mod` 5)),m+1)
  colorop _ =  Nothing
-- *Colour> colorCycle 12
-- fromList [Yellow,Red,Green,Blue,Empty,Yellow,
-- Red,Green,Blue,Empty,Yellow,Red]

colorBlack  = "\ESC[0;30m"
colorRed    = "\ESC[0;31m"
colorGreen  = "\ESC[0;32m"
colorYellow = "\ESC[0;33m"
colorBlue =   "\ESC[0;34m"

instance Display Color where
    display Red    = colorRed ++ "R" ++ colorBlack
    display Green  = colorGreen ++ "G" ++ colorBlack
    display Yellow = colorYellow ++ "Y" ++ colorBlack
    display Blue   = colorBlue ++ "B" ++ colorBlack
    display Empty  = "."

谢谢在另一个地方,同样的问题解决了它。
{-#LANGUAGE TemplateHaskell, TypeFamilies, MultiParamTypeClasses#-}
module Color where

import Display
import Data.Vector.Unboxed.Deriving 
import qualified Data.Vector.Unboxed as V 
import qualified Data.Vector.Generic         as G
import qualified Data.Vector.Generic.Mutable as M 
import Data.Word (Word8)

data Color = Yellow | Red | Green | Blue | Empty      
           deriving (Show, Eq, Ord, Enum, Bounded)

fromColor :: Color -> Word8
{-# INLINE fromColor #-}
fromColor = fromIntegral . fromEnum

toColor :: Word8 -> Color
{-# INLINE toColor #-}
toColor x | x < 5 = toEnum (fromIntegral x)
toColor _ = Empty

derivingUnbox "Color"
   [t| Color -> Word8 |]
    [| fromColor |]
    [| toColor |]

-- test
colorCycle :: Int -> V.Vector Color
colorCycle n = V.unfoldr colorop 0 where 
  colorop m  | m < n =  Just (toColor (fromIntegral (m `mod` 5)),m+1)
  colorop _ =  Nothing
-- *Colour> colorCycle 12
-- fromList [Yellow,Red,Green,Blue,Empty,Yellow,
-- Red,Green,Blue,Empty,Yellow,Red]

colorBlack  = "\ESC[0;30m"
colorRed    = "\ESC[0;31m"
colorGreen  = "\ESC[0;32m"
colorYellow = "\ESC[0;33m"
colorBlue =   "\ESC[0;34m"

instance Display Color where
    display Red    = colorRed ++ "R" ++ colorBlack
    display Green  = colorGreen ++ "G" ++ colorBlack
    display Yellow = colorYellow ++ "Y" ++ colorBlack
    display Blue   = colorBlue ++ "B" ++ colorBlack
    display Empty  = "."
derivingUnbox "Color"
    [d| instance Unbox' (Color) Word8 |]
    [| fromColor |]
    [| toColor |]