Performance 严格构造函数的局部应用
如果我有Performance 严格构造函数的局部应用,performance,haskell,Performance,Haskell,如果我有 data Foo a = Foo !Int a [a] | Bar [a] 因此,Foo构造函数的第一个参数是严格的,它将被解包。进一步假设我将foon传递给一个高阶函数f,并且f没有内联(因此foon实际上被传递)。我用-O2得到的核心表示n被装箱,然后传递给Foo,结果传递给f。我的问题是:我打电话会更好吗 f (\a b -> Foo n a b) 要避免装箱n?还是会导致其他性能问题 我实际上在想如何定义 foo' !n = \a b -> Foo n a b
data Foo a = Foo !Int a [a] | Bar [a]
因此,Foo
构造函数的第一个参数是严格的,它将被解包。进一步假设我将foon
传递给一个高阶函数f
,并且f
没有内联(因此foon
实际上被传递)。我用-O2
得到的核心表示n
被装箱,然后传递给Foo
,结果传递给f
。我的问题是:我打电话会更好吗
f (\a b -> Foo n a b)
要避免装箱n
?还是会导致其他性能问题
我实际上在想如何定义
foo' !n = \a b -> Foo n a b
打电话给
f(foo'n)
,我觉得应该做同样的事情,但我想最好是具体问一下。我是为此打开的。Reid Barton和Simon Peyton Jones提出了一个修复方案(允许在部分应用时内联包装器函数),我将其提交为。修补程序已应用于主分支,并将包含在GHC 8.2中。据我所知,编译器将foon
转换为\a b->foon a b
,因为STG机器中没有部分应用的构造函数。@augustss,据我所知,Foo
被转换为一个调用真正构造函数的严格函数。简化和STG之间是否会发生进一步的拆箱?我的意思是,部分应用的构造函数将被转换为函数。然后是严格构造函数的另一个翻译级别。