2010-10-21 177 views
2

這裏有什麼不對,懶惰評估呢?標杆管理和懶惰評估

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:

  • 時間$打印(「排序山島地圖=」,mapasort)

和計算時間大大增加,所以我認爲什麼是錯的。

Computation time: 1.188 sec

感謝

+0

您提到安裝Criterion時遇到問題。如果你使用freenode(IRC)並加入#haskell頻道,那麼可以幫助你安裝它。 – 2010-10-21 17:45:22

+0

TomMD,我會做的,謝謝 – Gmp 2010-10-21 20:42:04

回答

6

是的,這是由於Haskell的懶惰。您試圖通過使用seq來解決懶惰,但由於seq是「淺」(即它不遍歷表達式的整個結構 - 僅「外」層),因此它將強制評估map ,但不是對sort的評估。

要解決此問題,請使用deepseq而不是seq,或者更好的方法是使用庫進行基準測試而不是使用getCPUTime

+0

sepp2k,有沒有任何基準庫,它計算的時間等於getCPUTime? Criteriom試圖安裝,但她不能這樣做? – Gmp 2010-10-21 20:40:15