난 그냥 하스켈을 배우는 튜토리얼 사이트에서 두 프로그램을 작성하고, 같은 어디서이 두 프로그램은 상당히 동등한 생각
maximumwhere :: (Ord a) => [a] -> a
maximumwhere [] = error "empty"
maximumwhere [x] = x
maximumwhere (x:xs) = if x > maximum' then x else maximum' where maximum' = maximumwhere xs
maximumnowhere :: (Ord a) => [a] -> a
maximumnowhere [] = error "empty"
maximumnowhere [x] = x
maximumnowhere (x:xs) = if x > maximumnowhere xs then x else maximumnowhere xs
있고
바인딩, 왜냐하면 바인딩은 변수를 내용으로 대체하기 때문입니다. 하지만 ghci에서 실행할 때 첫 번째 방법은 후자보다 느린 편이었습니다. 특히 길이가 25 이상인 배열의 경우에는 더욱 그렇습니다. 아마도 바인딩을 사용하면 성능 차이가 커질 수 있지만 그 이유는 모르겠습니다. 아무도 나를 위해 그것을 설명 할 수 있습니까?
첫 번째 것은'maximumnowhere xs' (if 조건문과 else 경우 모두에 사용됨)의 평가를 공유하지 않습니다. 공유하고 싶다면 두 번째 버전에 따라 스스로해야합니다. –
추가 정보를 추가하면 GHC는 일반적으로 공통 하위 표현식 제거를 수행하지 않습니다 (두 버전이 동일하게 수행하게됩니다). 이는 CSE가 게으른 언어로 공간 누수를 유발할 수 있기 때문입니다. GHC FAQ - http://www.haskell.org/haskellwiki/GHC:FAQ#Does_GHC_do_common_subexpression_elimination.3F –
ghci를 성능 측정에 사용하는 이유는 무엇입니까? 테스트 할 수있는 최적화 컴파일러가 있습니다 .. –