Optimization GHC和x27之间的差异;s-O和-O2

Optimization GHC和x27之间的差异;s-O和-O2,optimization,haskell,compiler-construction,ghc,Optimization,Haskell,Compiler Construction,Ghc,cabal dist不鼓励您使用-O2,因为它会产生更长的编译时间,GHC手册上说: 目前,-O2不太可能产生比-O更好的代码 我知道我总是可以对库进行基准测试,看看-O2是否能提供更好的性能,但我想知道是否有人可以解释 -O2>代码>与 -o>代码>不同,因此我可以得到一个直觉,解释为什么他们认为它不太可能产生更好的代码。 -O2/执行构造函数专门化。还有一些仅在-O2处启用的其他优化,包括-fliberate case,-fstatic参数转换 我怀疑-O2现在总是产生更好的代码,因为该建

cabal dist
不鼓励您使用
-O2
,因为它会产生更长的编译时间,GHC手册上说:

目前,
-O2
不太可能产生比
-O
更好的代码


我知道我总是可以对库进行基准测试,看看
-O2
是否能提供更好的性能,但我想知道是否有人可以解释<代码> -O2>代码>与<代码> -o>代码>不同,因此我可以得到一个直觉,解释为什么他们认为它不太可能产生更好的代码。

<代码> -O2/<代码>执行构造函数专门化。还有一些仅在-O2处启用的其他优化,包括

-fliberate case
-fstatic参数转换


我怀疑-O2现在总是产生更好的代码,因为该建议可以追溯到大约10年前。

不总是,有很多代码没有区别。但是也有很多代码,
-O2
-O
做得更好。例如,对于我的主筛,它产生了2.5倍的差异(对于ghc-7.4.2)。我并没有做过详尽的测试,但我还没有看到过一段时间,
-O2
-O
更差的情况(我想是在ghc-7之前)。唯一的方法是,
-O2
仍然不可能产生比
-O
更好的代码,即差异显著或可能存在差异的代码可能很少-不知道是否存在差异。有时候,这会产生巨大的不同,参见我对唐回答的评论。我建议您使用
-O2
,除非您有理由不这样做。