5

私のhaskellプログラムをプロファイリングした後、プログラムの時間の66%がリストへのインデックス作成に費やされていることがわかりました。解決策はData.Vectorを使用しているようですが、変換に問題があります。Vectorを使用するようにコードを変更すると、大量のメモリが使用され、非常にひどくハングして、プロファイリングすらできません。何が原因でしょうか?

変換したいファイルは次のとおりです:https ://github.com/drew-gross/Blokus-AI/blob/master/Grid.hs

そしてそれを変換する私の試み:https ://github.com/drew-gross/Blokus-AI/blob/convert-to-vector/Grid.hs

私が間違っていることについて何か考えはありますか?または少なくとも、どこを見ればいいですか?

4

2 に答える 2

7
makeEmptyGrid width height defaultCell = Grid (Data.Vector.take arraySize $ fromList $ repeat defaultCell) width height

それはまさにキラーです。fromListリスト全体をに変換しますがVector、これrepeat defaultCellは無限のリストです。

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

また

makeEmptyGrid width height defaultCell = Grid (fromList $ replicate arraySize defaultCell) width height

それを修正します。

残りの部分をざっと見ただけでは、それ以上の明らかな罠は発生しませんでしたが、私は簡単にいくつかを見落とした可能性があります。

于 2012-11-16T02:11:45.010 に答える
5

これはダニエルに続く追加の考えです。 小さな「グリッド」ではおそらくあまり効果がないようですが、のインスタンスを作成するのは比較的Grids簡単です。次に、グリッドにはボックス化されていない配列が含まれます。ではなくインポートします。これは一般的に多くの理由ではるかに優れていますが、多くの定義に制約を課す必要があります。これは、インスタンスがない限り、以外のタイプのものでいっぱいのグリッドを作成または「マップ」する場合に影響を与える可能性があります。 ColorsUnboxColorGrid.hsData.Vector.UnboxedData.VectorUnbox a =>ColorUnbox

以下に、THの呪文vector-th-unbox(最近そのパッケージについて学び、もう一度テストする機会があります)と2つの必要な定義を追加します。のBoolインスタンスに続いて、手動で記述するのはそれほど難しくありませんData.Vector.Unboxed.Base

{-#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  = "."

vector-th-unbox編集:前述のバージョンでは0.1、次のテンプレートが使用されていました。

derivingUnbox "Color"
    [d| instance Unbox' (Color) Word8 |]
    [| fromColor |]
    [| toColor |]
于 2012-11-16T17:57:58.383 に答える