我正在尝试使用 Criterion 框架来衡量一个简单的 Haar DWT 程序的性能。(这是错误的慢,但我会把它留给另一个问题)。不幸的是,我在网上找不到任何好的文档。我的两个主要问题是
- 如何将数据从一个基准传递到另一个基准?我想为程序的每个阶段计时。
- 采样如何工作,并避免重复使用之前的计算的惰性评估?
这个来源相对减少;第一个函数getRandList
生成一个随机数列表;haarStep
将输入信号转换为差值和和,并haarDWT
调用前者并对和进行递归。我正在尝试将 传递getRandList
给haarDWT
通过惰性评估,但也许我的用法不正确/不受支持。时间安排似乎没有意义。
{-# LANGUAGE ViewPatterns #-}
import Control.Arrow
import qualified Data.Vector.Unboxed as V
import System.Random
import Criterion.Main
invSqrt2 = 0.70710678118654752440
getRandList :: RandomGen g => g -> Int -> [Float]
getRandList gen 0 = []
getRandList gen n = v:rest where
(v, gen') = random gen
rest = getRandList gen' (n - 1)
haarStep :: V.Vector Float -> (V.Vector Float, V.Vector Float)
haarStep = (alternatingOp (-) &&& alternatingOp (+)) where
alternatingOp op x = V.generate (V.length x `div` 2) (\i ->
((x V.! (2 * i)) `op` (x V.! (2 * i + 1))) * invSqrt2)
haarDWT :: V.Vector Float -> V.Vector Float
haarDWT xl@(V.length -> 1) = xl
haarDWT (haarStep -> (d, s)) = haarDWT s V.++ d
main = do
gen <- getStdGen
inData <- return $ getRandList gen 2097152
outData <- return $ haarDWT (V.fromList inData)
defaultMain [
bench "get input" $ nf id inData,
bench "transform" $ nf V.toList outData
]
writeFile "input.dat" (unlines $ map show inData)
writeFile "output.dat" (unlines $ map show $ V.toList outData)
最后,当我尝试使用-s 1
;调用它时出现错误。也许这只是一个标准错误。
Main: ./Data/Vector/Generic.hs:237 ((!)): index out of bounds (1,1)
提前致谢!