【发布时间】:2012-12-31 02:53:14
【问题描述】:
GHC 转换具有中间值的表达式的效率是否与没有转换的一样有效?
例如
main = print $ f ["aa", "bb", "cc"]
f x =
let a = map (map toUpper) x
b = filter (\z -> 'C' /= head z) a
c = foldl1 (++) b
in c
似乎有非常不同的核心输出(-ddump-simple)与
f x = foldl1 (++) $ filter (\z -> 'C' /= head z) $ map (map toUpper) x
具有中间值的表达式是否需要(显着)更长的时间来计算?
【问题讨论】:
-
请注意,这是使用 build/foldr 融合,因为您使用的是默认的 GHC 列表实现。如果您想要流版本,请使用
stream-fusion包。好处是 foldl1 融合了。 -
两个版本都为我提供了相同的内核,分别为 7.6.1 和 7.2.2(使用
-O和-O2)。您使用了哪些版本和优化标志? -
@DanielFischer:我没有使用任何优化标志;我想知道的是“这些是什么时候不等价的”,看起来答案是“不使用优化标志的时候”。
-
@amindfv 没有优化基本上意味着“音译已写的内容”。这绝不是一个好主意。
-
不开启优化,重写规则优化将不会开启。
标签: performance haskell optimization ghc