Я пытаюсь измерить производительность простой программы Haar DWT, используя структуру Criterion. (Это ошибочно медленно, но я оставлю это для другого вопроса). К сожалению, я не могу найти хорошую документацию в Интернете. Мои две основные проблемы:
- Как передать данные с одного теста на другой? Я хочу, чтобы каждый этап программы.
- Как работает выборка и избегайте ленивой оценки, повторно использующей предыдущие вычисления?
Этот источник относительно ограничен; первая функция 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 [email protected](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
; возможно, это всего лишь ошибка Criterion.
Main: ./Data/Vector/Generic.hs:237 ((!)): index out of bounds (1,1)
Спасибо заранее!