yck*_*yck 5 benchmarking haskell
我试图编码以计算功能成本的时间
list <- buildlist 10000 10000
starttime <- getClockTime
let sortedlist = quicksort list
endtime <- getClockTime
let difftime = diffClockTimes endtime starttime
Run Code Online (Sandbox Code Playgroud)
功能构建列表:
buildlist :: Int -> Int -> IO [Int]
buildlist n m = do
seed <- getStdGen
let l = randomRs (0, m) seed
let list = take n l
return list
Run Code Online (Sandbox Code Playgroud)
功能快速排序:
quicksort [] = []
quicksort (x:xs) =
let head = [a|a<-xs,a<=x]
tail = [a|a<-xs,a>x]
in quicksort head ++ [x] ++ quicksort tail
Run Code Online (Sandbox Code Playgroud)
第一个问题:当我输出difftime时,无论列表有多长,它总是为零.
第二个:我想知道真实世界Haskell的代码中的">> ="是什么意思.
getClockTime >>= (\(TOD sec _) -> return sec)
Run Code Online (Sandbox Code Playgroud)
第三:我写这个来从TimeDiff变量获取tdSec和tdPicosec.有没有更简单的方法?
time <-(\(TimeDiff _ _ _ _ _ s ps) -> return [ ( \a -> fromIntegral a :: Double ) s , ( \a -> fromIntegral a :: Double ) ps ] ) difftime
Run Code Online (Sandbox Code Playgroud)
Phi*_* JF 11
您的代码不会对列表进行排序!它只是将名称定义sortedlist为,quicksort list但在实际需要该值之前不会计算.那是懒惰的评价.我们不会用这种语言做额外的工作.
由于基准是额外无用的工作(这就是重点),这使得基准测试变得困难.
你的选择
seq. seq具有类型,a -> b -> b并具有评估其第一个参数的行为,即所谓的"弱头正常形式".在这里,因为您想要强制使用您可能想要使用的整个列表deepseq>>=是monadic绑定运算符.这里需要一个IO类型IO a和一个函数的动作,并将a -> IO b它们组合在一起以创建一个新的类型动作IO b.这与表示法的作用相同. foo >>= \x -> expr是一样的
do x <- foo
expr
Run Code Online (Sandbox Code Playgroud)
事实上,do符号只是语法糖>>=
我不确定问题3中的问题是什么 - 也许它应该得到自己的Stackoverflow问题.