solrize
# haskell에서이 코드의 한 버전에 대한 질문을하고 다른 사례를 시도하고 무슨 일이 일어 났는지 궁금합니다. 내 컴퓨터에서 "빠른"코드는 ~ 1 초가 걸리며 "느린"코드는 ~ 1.3-1.5 (모든 것은 ghc -O2
으로 컴파일됩니다). `logBase 10 x`가 전문화되어 있더라도`log x/log 10`보다 느린 이유는 무엇입니까?
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]
는 I'd've는 GHC는 전문 때
log y/log x
, 정확히 같은 일에
logBase x y
를 켤 수있을 것이라고 희망했다. 무슨 일이 벌어지고 있으며,
logBase
을 사용하는 것이 좋습니다.
ghc는 경우에 따라 'log 10'의 상수 전파를 수행 할 수 있습니다. 다양한 기준으로 측정 해보십시오. –
n.b. 'Double'의'Floating' 인스턴스는 위의'fooLogBase'의 주석 처리 된 정의와 같은'logBase'를 정의합니다. – dave4420
LLVM 백엔드로 컴파일하면 모두 똑같이 빠릅니다. – leftaroundabout