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) и модели взрыва в силу оценки.


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