繁体   English   中英

如何在用GHC编译的Haskell函数中找到分配?

[英]How can I find the allocation in a Haskell function compiled with GHC?

我正在使用GHC 7.4编译以下功能:

nodups' :: [Int] -> Bool
nodups' = ok empty
  where ok _ [] = True
        ok seen (n:ns) = not (n `member` seen) && ok (n `insert` seen) ns
        member n word = testBit word n
        insert n word = setBit word n
        empty = 0 :: Int

该函数在小整数列表中查找重复的元素。 seen的集合是一组小整数的表示形式,作为位向量。 分析器(使用ghc -prof -auto-all运行)声称ok函数占总分配的22%。 -ddump-simpl输出,我不明白为什么要分配此代码。 我检查了一下,据我所知,它没有insert的调用分配thunk。

我应该怎么看才能确定我正在分配的代码部分?

通常

我知道功能语言的简单(科学)实现,如果我没记错的话,Haskell可以使用G机器

这意味着(再次,如果我没记错的话)表示您的程序状态像“树”一样表示,其中的节点(为简化起见)是您在代码中使用的功能。 叶子将是它的参数。 然后,“ G-Maschine”沿着“ Spine”(节点的左侧链)查找,并在一组可用的“ Functions”(“ Supercombinators”?)中查找可应用的模式匹配。 如果从定义的左侧识别出物质匹配 ,则将其替换为定义的右侧

这意味着即使是一条简单的线

ok seen (n:ns) = not (n `member` seen) && ok (n `insert` seen) ns

甚至

(n:ns) = ns

正在计算机内存中执行某项操作,即匹配模式

       ...
     ...
    (:)
   /   \
  n     ns

并替换为

       ...
     ...
    ns

最终结果可能比输入消耗更少的内存,但这是一个动态步骤,因此必须在某个地方进行。 如果一遍又一遍地重复(以“紧密循环”的方式),那么这将使您的CPU繁忙,也将使您的内存繁忙-仅因为G-Machine正在运行。 (正如我所说,我不确定G机器概念是否适用于此,但我想这是相似的)。

具体猜测

    member n word = testBit word n
    insert n word = setBit word n

除此之外,我还有些怀疑。 testBitsetBit看起来像列表上的索引操作。 如果是这样,可能需要一些工作。 如果它们是正确的数组,那就可以了。 如果它们是某种地图或集合……那么……可能涉及代价高昂的散列吗? 还是通过平衡树来实现?平衡树需要使用大量(比较昂贵的)比较操作?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM