packages feed

plugins-multistage-0.3: bench/Benchmark.hs

{-# LANGUAGE TemplateHaskell #-}

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

import Foreign.Marshal (alloca)

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
loadFun 'naive

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

main :: IO ()
main = alloca $ \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 marshal"
          [ bench "c_naive" $ c_naive_worker d
          , bench "c_normal" $ c_normal_worker d
          ]
      , bgroup "compiled"
          [ bench "c_naive" $ c_naive_raw pd out
          , bench "c_normal" $ c_normal_raw pd out
          ]
      ]