Производительность резко меняется, если функция перемещается между модулями.

Если я перемещаю функцию из того места, где она используется, в отдельный модуль, я заметил, что производительность программы значительно падает.

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)

Это выполняется за 0,1 секунды, когда fromDigitsнаходится в том же модуле, и за 0,4 секунды, когда я перемещаю его в другой модуль.

Я предполагаю, что это связано с тем, что GHC не может встроить функцию, если она находится в другом модуле, но мне кажется, это должнобыть в состоянии, поскольку они находятся в одном пакете.

Я не уверен, каковы настройки компилятора, но он собран с настройками Leksah/cabal по умолчанию. Я почти уверен, что это как минимум с -O2.

8
задан Peter Hall 14 March 2012 в 22:23
поделиться