首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加速Haskell中的相等检查

加速Haskell中的相等检查
EN

Stack Overflow用户
提问于 2013-04-07 09:51:07
回答 1查看 238关注 0票数 1

有没有可能加速(或者在我的函数中,删除) Haskell中的相等性检查?我有一个函数,它对一个代理的所有交互进行求和,其中交互是在两个代理之间进行的。为了对交互进行求和,它首先必须检查智能体是否等于交互中的第一个或第二个智能体,然后对其求和。检查相等性几乎占据了我程序运行时间的一半。

代码语言:javascript
运行
复制
sumAgent :: [Interaction] -> Agent -> Int
sumAgent xs agent = foldr (\x acc -> acc + sumInteraction agent x) 0 xs

-- Use this in a map call of sumAgent to return the sums of a specific agent
sumInteraction :: Agent -> Interaction  -> Int
sumInteraction agent (Interaction a1 a2 xs )
    | (==) agent a1 = sum $ map fst scores
    | (==) agent a2 = sum $ map snd scores
    | otherwise = 0
    where scores = map score xs

是否可以通过使用c函数或只检查部分代理的相等性来删除相等性检查,或者加快相等性检查的速度?Eq实现是:

代码语言:javascript
运行
复制
  data Agent = Agent {
                function::[(Bool,Bool)] -> Bool,
                name::String,
                position::(Int,Int),
                dna::DNA
               }
 instance Eq Agent where
        (==) a1 a2 = position a1 == position a2
EN

回答 1

Stack Overflow用户

发布于 2013-04-07 11:36:44

你怎么知道平等需要一半的时间?我猜你最有可能通过使用严格的和未装箱的对获得性能上的好处:

代码语言:javascript
运行
复制
 data Pair = P {-# UNPACK #-} !Int {-# UNPACK #-} !Int
 data Agent = Agent {
            function::[(Bool,Bool)] -> Bool,
            name::String,
            position:: {-# UNPACK #-} !Pair Int Int,
            dna::DNA
           }

这样,您将避免额外的间接性,并可能获得更好的缓存行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15858043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档