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
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
content <- readFile s
return (read content)
main :: IO ()
main = do
t5 <- getCPUTime
content <- learquivo "mkList1.txt"
let !mapasort = rnf $ map sort content
t6 <- getCPUTime
let diffft6t5 = (fromIntegral (t6 - t5)) / (10^12)
printf "Computation time Mapasort: %0.3f sec\n" (diffft6t5 :: Double)
如何判断它是否评估了内容的所有元素?
let !mapasort = rnf $ map sort content
我在winghci中使用了这行:
*Main> let !mapasort = rnf $ map sort content
但是,返回:
*Main> mapasort ()
由于
答案 0 :(得分:5)
我看到两个问题:
1)为什么将maport评估为单位()
。
因为rnf
函数始终返回()
。 See the documentation
2)是否评估了所有内容
是。用于列表的DeepSeq实例(rnf
所在的实例)只调用列表中每个元素的deepseq实例:
rnf [] = ()
rnf (x:xs) = rnf x `seq` rnf xs
你的元素所有Ints,它们都有正确的NFData实例。
我还要再添两个问题:
3)如何正确完成此基准测试?
使用Criterion。这里有许多标准倡导者,你可以找到答案,作为搜索的好例子。
4)如何针对非基准测试目的强制进行此评估?
使用并行包。
import Control.Parallel.Strategies
...
let !mapsort = (map sort content) `using` (evalList rdeepseq)
或仍在使用rnf
:
let mapsort = map sort content
!_ = rnf mapsort