packages feed

feldspar-compiler-0.7: benchs/CRC.hs

{-# LANGUAGE TemplateHaskell #-}

import Feldspar hiding (force)
import Feldspar.Vector
import Feldspar.Compiler.Plugin
import Feldspar.Algorithm.CRC

import Foreign.Marshal (with)
import Data.Default
import Control.DeepSeq (force)
import Control.Exception (evaluate)

import Criterion.Main

testdata :: [Word8]
testdata = Prelude.take (16*1024) $ cycle [1,2,3,4]

naive :: Vector1 Word8 -> Data Word16
naive = crcNaive 0x8005 0

normal :: Vector1 Word8 -> Data Word16
normal v = share (makeCrcTable 0x8005) $ \t -> crcNormal t 0 v

h_naive :: [Word8] -> Word16
h_naive = eval naive

h_normal :: [Word8] -> Word16
h_normal = eval normal

loadFun ['naive, 'normal]

main :: IO ()
main = with def $ \out -> do
    d  <- evaluate $ force testdata
    pd <- pack d >>= evaluate
    _  <- evaluate c_naive_builder
    _  <- evaluate c_normal_builder
    defaultMain
      [
        bgroup "evaluated"
          [ bench "h_naive"  $ nf h_naive  (Prelude.take 1024 d)
          , bench "h_normal" $ nf h_normal (Prelude.take 1024 d)
          ]
      , bgroup "compiled"
          [ bgroup "marshal"
              [ bench "c_naive"  $ c_naive_worker d
              , bench "c_normal" $ c_normal_worker d
              ]
          , bgroup "raw"
              [ bench "c_naive"  $ c_naive_raw pd out
              , bench "c_normal" $ c_normal_raw pd out
              ]
          ]
      ]