我目前正在用 Haskell 编写一个多模块程序。我发现了一个奇怪的问题,即我的文件没有得到正确优化,即使我传入了 -O2
等等。有问题的文件是共享的 3D 矢量数学模块。当单独编译为 .o 时,这些模块已正确优化。当使用 --make 编译为较大程序的一部分时,它们未正确优化。核心完全不同。
我已将一些简单的精简测试代码放入 vector.hs 文件中:
data TestVector = TestVector !Double !Double !Double !Double
addVec :: TestVector -> TestVector -> TestVector
addVec (TestVector x1 y1 z1 w1) (TestVector x2 y2 z2 w2) =
TestVector (x1 + x2) (y1 + y2) (z1 + z2) (w1 + w2)
并从主...
import Vector
与我使用
--make
构建 main.hs 时相比,此代码作为独立 .hs 文件的编译方式不同。
我的命令行是:
ghc -tmpdir tmp -hidir hi -odir obj -fext-core -fexcess-precision -funbox-strict-fields -threaded -rtsopts -fwarn-missing-signatures -Wall -O2 Main.hs -o main
干杯
请您参考如下方法:
添加
{-# INLINE addVec #-}
在主模块中。
如果调用者/被调用者不在同一个模块中,GHC 需要在进行优化之前指出这种可能性。