内联或不内联在Haskell中

fel*_*pez 10 haskell inline number-crunching

我有几个数字运算操作占CPU时间的很大一部分.此类操作的一个示例是此功能:

import Data.Number.Erf
import Math.Gamma
import Math.GaussianQuadratureIntegration as GQI

-- Kummer's' "1F1" a.k.a M(a,b,z) Confluent Hypergeometric function
-- Approximation by the Gaussian Quadrature method from 128 up to 1024 points of resolution
kummer :: Double -> Double -> Double -> Double -> Double
kummer a b z err = gammaFactor * integralPart
    where
        gammaFactor       = (gamma b) / (gamma a * gamma (b-a))
        integralPart      = (integrator err) fun 0 1
        fun               = (\t -> (e ** (z * t)) * (1-t) ** (b-a-1) * t ** (a-1))
        e                 = exp 1
        integrator err
                | err > 0.1   =  GQI.nIntegrate128
                | err > 0.01  =  GQI.nIntegrate256
                | err > 0.001 =  GQI.nIntegrate512
                | otherwise   = GQI.nIntegrate1024
Run Code Online (Sandbox Code Playgroud)

所以,我想知道当函数应该是INLINE以提高性能时是否有一些规则要遵循.REPA作者建议:

将INLINE编译指示添加到代码中的所有叶函数,尤其是计算数字结果的函数.非内联惰性函数调用每个可能花费超过50个周期,而每个数字运算符仅花费一个(或更少).内联叶函数还可确保它们专门适用于相应的数字类型.

这些指示是否也适用于其余的数值计算或仅适用于数组计算?或者是否有更一般的指南来决定函数何时应该内联?

请注意这篇文章:是否有任何理由不对函数使用INLINABLE pragma?没有直接解决程序员提供的提示是否真正有助于编译器优化代码的问题.