Nếu tôi di chuyển một hàm từ nơi nó được sử dụng thành một mô-đun riêng biệt, tôi nhận thấy hiệu suất của chương trình giảm đáng kể.Hiệu suất thay đổi đáng kể nếu một hàm được di chuyển giữa các mô-đun
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)]
trong mô-đun khác:
fromDigits :: Integral a => [a] -> a
fromDigits = foldl1' (\a b -> 10 * a + b)
này chạy trong 0,1 giây khi fromDigits
là trong module tương tự, nhưng 0,4 giây khi tôi di chuyển nó đến mô-đun khác. Tôi cho rằng điều này là do GHC không thể thực hiện chức năng nếu nó ở trong mô-đun khác nhau, nhưng tôi cảm thấy nó là nên có thể, vì chúng nằm trong cùng một gói.
Tôi không chắc chắn cài đặt trình biên dịch là gì, nhưng nó được xây dựng với giá trị mặc định của Leksah/cabal. Tôi khá chắc chắn đó là với -O2 là tối thiểu.
GHC có thể nội dòng trên các mô-đun. Hãy xem điều này để biết một số mẹo: http://www.haskell.org/haskellwiki/Performance/GHC#Modules_and_separate_compilation – porges
Bạn có thể thử thêm '{- # INLINE fromDigits # -}' -kết quả gần định nghĩa 'fromDigits' ... – hvr
Cảm ơn, pragma INLINE hoạt động. Nhưng .. nó cảm thấy một chút lạ để không thể xác định rằng tại trang web cuộc gọi. –