함수를 별도의 모듈로 옮기면 프로그램 성능이 크게 떨어집니다. 다른 모듈함수가 모듈간에 이동하는 경우 성능이 크게 달라집니다.
calc = sum . nub . map third . filter isProd . concat . map parts . permutations
where third (_,_,b) = fromDigits b
isProd (a,b,p) = fromDigits a * fromDigits b == fromDigits p
-- All possibilities have digits: A x AAAA or AA x AAA
parts (a:b:c:d:e:rest) = [([a], [b,c,d,e], rest)
,([a,b], [c,d,e], rest)]
:
fromDigits :: Integral a => [a] -> a
fromDigits = foldl1' (\a b -> 10 * a + b)
fromDigits
은 동일 모듈에있을 때 0.1 초에서 실행하지만, 0.4 초 I는 다른 모듈로 이동합니다.
GHC가 다른 모듈에있는 경우 GHC가 함수를 인라인 할 수 없기 때문에 이것을 가정합니다.하지만 동일한 패키지에 있기 때문에 이어야합니다.이 가능해야합니다.
저는 컴파일러 설정이 무엇인지 모르지만 Leksah/cabal 기본값으로 작성되었습니다. 나는 그것이 적어도 -O2와 최소한 같다고 확신한다.
GHC는 모듈을 통해 인라인 할 수 있습니다. 다음을 참고하십시오 : http://www.haskell.org/haskellwiki/Performance/GHC#Modules_and_separate_compilation – porges
'fromDigits' 정의 근처에'{- # INLINE fromDigits # -}'주석을 추가 할 수 있습니다. – hvr
감사합니다. INLINE pragma가 작동합니다. 하지만 .. 통화 사이트에서이를 지정할 수 없다는 것이 약간 이상하다고 생각합니다. –