基准测试和懒惰评估

时间:2010-10-21 14:22:27

标签: 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
Computation time: 0.125 sec

mkList1.txt是100个随机数列表中的100个列表,大致或多或少如下:[[23,45,89,78,89 ...],[4783,44,34 ... ] ...]

我做了一个测试打印mapasort:

  • time $ print(“Sort usando map =”,mapasort)

计算时间大大增加,所以我觉得有些不对劲。

Computation time: 1.188 sec

由于

1 个答案:

答案 0 :(得分:6)

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

要解决此问题,请使用deepseq代替seq,或者更好的是,使用库进行基准测试,而不是使用getCPUTime