haskell - 基准测试和惰性评估

标签 haskell lazy-evaluation

这里出了什么问题,惰性求值也是吗?

teste.hs

module Main where  

import Control.Parallel(par,pseq)  
import Text.Printf  
import Control.Exception  
import System.CPUTime  
import Data.List  
import IO  
import Data.Char  
import Control.DeepSeq  

--Calcula o tempo entre o inicio e o fim de rodagem do programa  
time :: IO t -> IO t  
time a = do  
    start <- getCPUTime  
    v <- a
    end   <- getCPUTime  
    let diff = (fromIntegral (end - start)) / (10^12)  
    printf "Computation time: %0.3f sec\n" (diff :: Double)  
    return v  

learquivo :: FilePath -> IO ([[Int]])  
learquivo s = do   
            conteudo <- readFile s   
            return (read conteudo)   

main :: IO ()  
main = do   
    conteudo <- learquivo "mkList1.txt"   
    mapasort <- return (map sort conteudo)
    time $ mapasort  `seq` return ()  

*Main> main<br/> Computation time: 0.125 sec

mkList1.txt 是一个由 100 个列表组成的列表,每个列表有 100 个随机数,或多或少像这样:[[23,45,89,78,89 ...], [4783, 44, 34 ... ]...]

我做了一个测试打印映射排序:

  • time $ print("对usando map进行排序=",mapasort)

计算时间显着增加,所以我认为出了问题。

Computation time: 1.188 sec

谢谢

最佳答案

是的,这是由于 Haskell 的懒惰造成的。您试图通过使用 seq 来解决惰性问题,但由于 seq 是“浅层”的(即它不会遍历表达式的整个结构 - 仅遍历“outer”层),它将强制评估map,但不会评估sort

要解决此问题,可以使用 deepseq 而不是 seq,或者更好的是,使用基准测试库而不是使用 getCPUTime

关于haskell - 基准测试和惰性评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988477/

相关文章:

haskell - 如何减少 Haskell 应用程序中的内存使用量?

haskell - 小村庄模板中的 $forall 问题

haskell - 使用管道将文件作为 HTTP 请求的源

performance - 展开器与 zipWith 的效率

Clojure:休息与下一个

functional-programming - 使用 Lazy.jl 在 Julia 中生成惰性范围

haskell - 时髦的 haskell 惰性列表隐式递归

haskell - 封闭类型族不能按预期工作

haskell - 如何检查生成无限列表的函数的实现?

f# - 函数生成的长度不正确的序列