是否会让构建优化列表理解中的某些内容?

mkU*_*tra 1 optimization haskell compiler-optimization

我应该编写一个函数来对列表理解块中的元素求和.

我们以这两个函数为例:

letSum :: [Int] -> [Int]
letSum xs = [result | x <- xs, y <- xs, let result = x + y, result > 10]

normalSum  :: [Int] -> [Int]
normalSum xs = [x + y | x <- xs, y <- xs, x + y > 10]
Run Code Online (Sandbox Code Playgroud)

题:

  • 第二个函数是否与第一个相反,将x和y相加两次?
  • 如果没有,它是如何工作的?

rad*_*row 7

第二个函数将计算两次总和 - 这里没有显式共享,Haskell也没有执行memoization(源:在GHC Haskell中何时自动记忆?)

let让和计算一次并在几个地方使用,所以第一个函数会快一些.


编辑:

评论中有人提到CSE(公共子表达式消除)可能在此处进行优化.我已经尝试编译你的函数-ddump-cse以发现它是否会发生,但是虽然我没有找到任何提及normalSum,但输出对我来说太神秘了.但是,如果你构建没有-O*标志的函数,我的答案应该是真的.如果我找到更多相关信息,我会更新我的答案.

  • 我不确定它是否计算过两次.做CSE只计算一次,甚至只使用廉价的严格(ghc这样做). (3认同)