Criterionフレームワークを使用して単純なHaarDWTプログラムのパフォーマンスを測定しようとしています。(誤って遅いですが、別の質問に残しておきます)。残念ながら、Web上で適切なドキュメントを見つけることができません。私の2つの主な問題は
- あるベンチマークから別のベンチマークにデータを渡すにはどうすればよいですか?プログラムの各段階の時間を計りたいです。
- サンプリングはどのように機能し、以前の計算を再利用する遅延評価を回避しますか?
このソースは比較的簡素化されています。最初の関数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)
前もって感謝します!