Haskell计算函数执行的时间

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变量获取tdSectdPicosec.有没有更简单的方法?

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

问题1:

您的代码不会对列表进行排序!它只是将名称定义sortedlist为,quicksort list但在实际需要该值之前不会计算.那是懒惰的评价.我们不会用这种语言做额外的工作.

由于基准是额外无用的工作(这就是重点),这使得基准测试变得困难.

你的选择

  • 使用seq. seq具有类型,a -> b -> b并具有评估其第一个参数的行为,即所谓的"弱头正常形式".在这里,因为您想要强制使用您可能想要使用的整个列表deepseq
  • 使用适当的基准测试包,如标准(首选和更容易)

问题2:

>>=是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问题.

  • 对于问题三:`get_s_ps td =(tdSec td,tdPicoSec td)`也就是说,只使用字段访问器,[你可以看作定义的一部分](http://hackage.haskell.org/packages/archive `TimeDiff`类型的/old-time/latest/doc/html/System-Time.html#v:TimeDiff). (2认同)