Haskell, измерение времени процессора функции
мне нужно измерить время процессора функции, например:
t <- getCPUTime
res <- callTheFunction input
t' <- getCPUTime
print $ t' - t
проблема возникает из-за лени Хаскелла. функция callTheFunction должна быть строго оценена. Я много искал и пытался использовать seq и $! но безуспешно. Я думаю, это должно быть довольно распространенной задачей. В любом случае, мне нужна помощь. Спасибо.
обновление: Спасибо за всю помощь, особенно @FUZxxl. Это напоминает мне разницу между WHNF (слабая голова нормальной формы) и нормальной Форма. Haskell / Лень помогает понять ленивую оценку Haskell.
что мне нужно, это еще одна оценка шага. В любом случае $! или оцените обе работы, пока для res требуется только WHNF:
t <- getCPUTime
res <- callTheFunction input
evaluate res OR return $! res
t' <- getCPUTime
print $ t' - t
3 ответов
использование функции evaluate :: a -> IO a
с Control.Exception
. Он оценивает свой аргумент в WHNF при выполнении соответствующего IO-действия. Вы должны убедиться, что WHNF достаточно для вашей функции.
Если вы бенчмаркинг, то вы должны использовать критерий. В противном случае используйте NFData (rnf) и модели взрыва в силу оценки.
Если вы пытаетесь сделать бенчмарки, пожалуйста, используйте отличную библиотеку критериев, которая находится на хакинге.