GHC中嵌套的UNPACK

时间:2012-04-18 20:16:54

标签: optimization haskell data-structures ghc

我经常在元组中收集多个值,因为我认为元组是这种元素的自然类型。但是,元组并不严格。所以考虑一下

data A

data B =
    B !A

data C =
    C !(B, B)

data D =
    D !B !B

使用-funbox-strict-fields和优化,UNPACK是嵌套的。 C中的元组是否会像C A A一样被解压缩到D,或只是C B B?以下是GHC-doc中的参考:7.16. Pragmas

(非空元组类型?type-constructors?)

1 个答案:

答案 0 :(得分:6)

考虑:

data B = B !Int

data C = C !(B, B)

data D = D !B !B

b0 = B 7
b1 = B 4

c = C (b0, b1)

d = D b0 b1

其中

data (,) a b = (a,b)

GHC会愉快地删除嵌套的严格构造函数(!B),它会在第一个字段中使C严格,优化为:

b0 = B 7
b1 = B 4

c = C b0 b1

d = D 7 4

然而,重要的是,(,)本身的字段并不严格 - 所以GHC无法解压缩它们。此外,它们是多态的,所以即使它们很严格也无法解压缩。

第一部分的解决方法是使用严格的元组。第二部分的解决方法是使用self-specializing tuples(例如,键入专门化元组的系列)。


请注意,在此样式中使用元组语法会产生开销 - 它们会引入必须优化的间接级别。因此,它有点单一。