@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)
  • Вопрос задан
  • 49 просмотров
Решения вопроса 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)
    Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы