@GKArnd

Как измерить время выполнения функции в Haskell?

Задача такая: выполнить миллион раз функцию на одних и тех же аргументах и посмотреть время.
Погуглив, я пришел к выводу, что необходимо использовать функцию getCurrentTime и оператор форсирования вычислений $!
Но почему то не выходит и я не понимаю почему. Результат примерно один и тот же, независимо от размера аргументов и числа повторений
Код:
testTime func arg1 arg2 = let list = ($!) replicate 10000000 (arg1, arg2); func' = uncurry (($!) func) in do
    start <- getCurrentTime
    return $! ($!) map func' list
    stop <- getCurrentTime
    print (diffUTCTime stop start)
  • Вопрос задан
  • 598 просмотров
Решения вопроса 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
Прокомментирую только приведённый код.

Во-первых, в многоаргументных функциях $! нужно делать не только на внешнем уровне, но и на всех остальных, т.е. (f $! x) $! y, иначе строгость относится только к первому аргументу и созданию
чанка.

Во-вторых, компилятор хитёр, но один из вариантов его обдурить заключается в оборачивании вычисляемого выражения в хитрую монаду. Хитрее IO придумать сложно.
import Data.Time

testTime n func arg1 arg2 = let
  list = (replicate $! n) $! (arg1, arg2)
  func' ~(x, y) = return $ (func $! x) $! y
  in do
    start <- getCurrentTime
    sequence $ (map $! func') $! list
    stop <- getCurrentTime
    print (diffUTCTime stop start)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы