Jump to content

Como faço para saber se o uso do rnf está correto?


gmp
 Share

Recommended Posts

Preciso pegar o tempo gasto para fazer um map e um sort do conteúdo de um arquivo, que é uma lista de lista, mas tenho  o problema de Lazy Evaluation, como posso resolver isso? Tentei desta forma mas não sei se está correta. Alguém pode me ajudar?

main:: IO ()
main = do
t5 <- getCPUTime
conteudo <- learquivo "mkList1.txt"
let !mapasort = rnf $ map sort conteudo
t6 <- getCPUTime
let diffft6t5 = (fromIntegral (t6 - t5)) / (10^12)
printf "Computation time Mapasort: %0.3f sec\n" (diffft6t5 :: Double)

Obrigado

Link to comment
Share on other sites

Que pretendes fazer?

Pelo que me dás a entender e como não precisas de saber qual o resultado, bastaria por a linha

return . rnf $ map sort conteudo
[/quote]

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Estás.

A única coisa a que fiz referência é que não precisas de atribuir o resultado a uma variável (mapasort), já que esta não te servirá de nada.

Hmm quer dizer. Não sei até que ponto ao usares um let não estás a adiar a acção, que só então é que irá executar o rnf que irá forçar a execução total do sort.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Fiz da forma que vc sugeriu, mas retornou tempo zerado, acho que assim a avalição não é forçada.

main:: IO ()
main = do 
    t5 <- getCPUTime
    conteudo <- learquivo "mkList1.txt" 
    return . rnf $ map sort conteudo
    t6 <- getCPUTime
    let diffft6t5 = (fromIntegral (t6 - t5)) / (10^12)
    printf "Computation time Mapasort: %0.3f sec\n" (diffft6t5 :: Double)

Isso esté me deixando maluca, hehehe, me sugeriram usar uma biblioteca chamada Criterion, vc conhece?

Link to comment
Share on other sites

Pois. É o facto de estar dentro da monad IO não está sequer a executar o rnf.

Põe antes da seguinte maneira

main:: IO ()
main = do 
    t5 <- getCPUTime
    conteudo <- learquivo "mkList1.txt" 
    print . rnf $ map sort conteudo
    t6 <- getCPUTime
    let diffft6t5 = (fromIntegral (t6 - t5)) / (10^12)
    printf "Computation time Mapasort: %0.3f sec\n" (diffft6t5 :: Double)

Assim de certeza que força a execução do rnf.

Irá imprimir pro ecrã um ()

Não conheço essa biblioteca.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.