Время выполнения функции Haskell

Есть ли простой способ вычислить время выполнения функции в Haskell?

Ответ 1

Проще всего делать :set +s в ghci, а затем вы можете видеть время выполнения всего, что вы запускаете, а также использование памяти.

Ответ 2

criterion package был специально создан для этого.

Ответ 4

время выполнения функции исполнения включено в Criterion.Measurement

например, если я хочу записать время someIOFunction :: IO ()

import Criterion.Measurement
main = secs <$> time_ someIOFunction >>= print

Ответ 5

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

TimeIt очень просто и делает то, что я хотел, за исключением того, что он плохо обрабатывает чистые функции. Время, возвращенное для чистой функции, - время распределения thunk (AFAIK), и даже с использованием seq может быть трудно получить то, что вы хотите.

То, что работает для меня, основано на TimeIt.

import System.TimeIt

timeItTPure :: (a -> ()) -> a -> IO (Double,a)
timeItTPure p a = timeItT $ p a `seq` return a

В timeItTPure p a, p - функция, ответственная за оценку результата чистого вычисления, a, настолько глубоко, насколько это необходимо для получения хорошего времени оценки. Возможно, это простое совпадение шаблонов, возможно, подсчет длины списка, возможно, его seq каждый элемент в списке, возможно, его deepseq и т.д.

Использование seq сложно. Обратите внимание: функция ниже не работает по желанию. Хаскелл - загадочная вещь.

badTimeItTPure a = timeItT . return $ seq (p a) a