solrize
在#haskell 中询问了有关此代码的一个版本的问题,我尝试了其他一些案例,想知道发生了什么。在我的机器上,“快速”代码大约需要 1 秒,“慢”代码需要大约 1.3-1.5 秒(一切都用 编译ghc -O2
)。
import Data.List
log10 :: Double -> Double
--log10 x = log x / log 10 -- fast
--log10 = logBase 10 -- slow
--log10 = barLogBase 10 -- fast
--log10 = bazLogBase 10 -- fast
log10 = fooLogBase 10 -- see below
class Foo a where
fooLogBase :: a -> a -> a
instance Foo Double where
--fooLogBase x y = log y / log x -- slow
fooLogBase x = let lx = log x in \y -> log y / lx -- fast
barLogBase :: Double -> Double -> Double
barLogBase x y = log y / log x
bazLogBase :: Double -> Double -> Double
bazLogBase x = let lx = log x in \y -> log y / lx
main :: IO ()
main = print . foldl' (+) 0 . map log10 $ [1..1e7]
我希望 GHC 能够在专业化时变成logBase x y
与 完全相同的东西。log y / log x
这里发生了什么,推荐的使用方式是logBase
什么?