Как использовать Criterion для измерения производительности программ Haskell?

Я пытаюсь измерить производительность простой программы 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 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)

Заранее спасибо!

15
задан hammar 4 June 2013 в 04:06
поделиться