Ответ 1
Проще всего делать :set +s
в ghci
, а затем вы можете видеть время выполнения всего, что вы запускаете, а также использование памяти.
Есть ли простой способ вычислить время выполнения функции в Haskell?
Проще всего делать :set +s
в ghci
, а затем вы можете видеть время выполнения всего, что вы запускаете, а также использование памяти.
criterion
package был специально создан для этого.
Посмотрите, подходит ли http://hackage.haskell.org/package/timeit ваши потребности.
время выполнения функции исполнения включено в Criterion.Measurement
например, если я хочу записать время someIOFunction :: IO ()
import Criterion.Measurement
main = secs <$> time_ someIOFunction >>= print
Критерий - самый сложный метод, хотя мне было трудно начать, и он, похоже, нацелен на программы бенчмаркинга. Я хотел вычислить время выполнения и использовать эти данные в моей программе, и это, похоже, не затрагивает эту потребность, по крайней мере, это не сразу видно.
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