Ваша функция main
неверна. Если qsort1
не является действием IO
, вы не можете выполнить его в монаде IO. Вместо этого вы можете поместить его в привязку let:
main = do
start <- getCurrentTime
let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
end <- getCurrentTime
print (diffUTCTime end start)
Также обратите внимание, что я явно дал аннотацию типа для 1
, чтобы избежать некоторых ошибок компиляции.
Но при этом вы не можете найти общее время, затраченное на сортировку, из-за ленивой оценки. x
никогда не будет вычислено, потому что оно никогда не используется в программе. Если вы запустите main
, он выдаст вам этот вывод, который определенно неверен:
λ> main
0.000001s
Вместо этого вы можете использовать это для вычисления вычисления:
main = do
start <- getCurrentTime
let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
print x
end <- getCurrentTime
print (diffUTCTime end start)
Вместо печати вы также можете использовать расширение BangPatterns
для принудительного вычисления qsort1
:
main = do
start <- getCurrentTime
let !x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
end <- getCurrentTime
print (diffUTCTime end start)
BangPatterns
не приведет к полной оценке, как указывает @kosmikus. Вместо этого используйте библиотеку, например criterion
, которая была специально создана для сравнительного анализа.
person
Sibi
schedule
17.07.2015