У меня есть следующие функции в моей (гораздо более) Haskell коде (с некоторым поддерживающим кодом, чтобы понять, что к чему):Предложения по сокращению ассигнований (и работы) в этой функции Haskell
import qualified Data.Set as S
import qualified Data.IntMap.Strict as M
import Data.Ord
import Data.Monoid
data Atom = Neg { index :: Int }
| Pos { index :: Int }
deriving (Eq, Ord, Show, Read)
newtype Clause = Clause { atoms :: S.Set Atom }
deriving (Eq, Show, Read)
instance Ord Clause where
compare = comparing (Down . S.size . atoms) <> comparing atoms
newtype Form = Form { clauses :: S.Set Clause }
deriving (Eq, Ord, Show, Read)
type Interpretation = M.IntMap Bool
-- the function of interest
interpret :: Interpretation -> Form -> Maybe Bool
interpret interp = evalForm
where evalAtom [email protected](Pos _) = M.lookup (index x) interp
evalAtom [email protected](Neg _) = not <$> M.lookup (index x) interp
evalClause (Clause x)
| S.member (Just False) evaluated = Just False
| evaluated == S.singleton (Just True) = Just True
| otherwise = Nothing
where evaluated = S.map evalAtom x
evalForm (Form x)
| S.member (Just True) evaluated = Just True
| evaluated == S.singleton (Just False) = Just False
| otherwise = Nothing
where evaluated = S.map evalClause x
После профилированного моя программа Haskell, я обнаружил, что это распределение interpret
составляет почти 40% всех распределений в моей программе (а также около 40% работы ЦП).
Есть ли способ уменьшить либо объем работы interpret
, либо сумму, которую он выделяет? Это может потенциально выиграть у меня большие выигрыши в производительности (которые мне действительно понадобятся, поскольку мне нужно много раз запускать этот код для экспериментов).
Поскольку вы не придаете большого значения контексту, я не могу придумать какие-либо идеи из коробки. Но вы можете подумать, было бы лучше представить 'Clause' как два' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Следует также отметить, что «Set» наборов, как правило, может быть медленным, но это скорее результат сравнения, чем распределение. – dfeuer
@dfeuer Моя основная мотивация использования наборов для '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' означает, Есть ли альтернативная структура, которую я могу использовать, которая не будет иметь проблемы, которую вы описываете относительно медленного набора множеств? –
Уникальное членство? Я не уверен, что вы имеете в виду. Если элемент должен отображаться как 'Neg' или' Pos', но не оба, вы этого не достигнете.Чтобы получить это, вы должны использовать 'data Sign = Neg | Pos', а затем 'IntMap Sign'. – dfeuer