Есть ли простой способ вычислить время выполнения функции в Haskell?
Время выполнения функции Haskell
Ответ 1
Проще всего делать :set +s
в ghci
, а затем вы можете видеть время выполнения всего, что вы запускаете, а также использование памяти.
Ответ 2
criterion
package был специально создан для этого.
Ответ 3
Посмотрите, подходит ли http://hackage.haskell.org/package/timeit ваши потребности.
Ответ 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