基准测试和懒惰评估

Gmp*_*Gmp 2 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 ()  
Run Code Online (Sandbox Code Playgroud)

*Main> main
Computation time: 0.125 sec

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

我做了一个测试打印mapasort:

  • 时间$ print("排序usando map =",mapasort)

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

Computation time: 1.188 sec

谢谢

sep*_*p2k 6

是的,这是由于Haskell的懒惰.你试图通过使用来绕过懒惰seq,但由于它seq是"浅的"(即它不会遍历表达式的整个结构 - 只有"外层"),它会强制评估map,但不是对sorts 的评价.

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