packages feed

bind-marshal-0.1: test/verify_desaction_static_fixed_buffer_perf.hs

-- Copyright   :  (C) 2009 Corey O'Connor
-- License     :  BSD-style (see the file LICENSE)

{-# LANGUAGE NoRebindableSyntax #-}
{-# LANGUAGE ImplicitPrelude #-}
import Bind.Marshal.Verify

import Bind.Marshal.Action.Base
import Bind.Marshal.DesAction.Base
import Bind.Marshal.DesAction.Static
import Bind.Marshal.StdLib.Des

import FLVHeader.Data
import FLVHeader.Des

import Control.DeepSeq
import Control.Exception ( evaluate )
import "monads-tf" Control.Monad.Trans
import Control.Monad

import Data.Word

import Foreign.Marshal.Alloc
import Foreign.Marshal.Array ( pokeArray )
import Foreign.Ptr
import Foreign.Storable

import System.IO
import System.Random ( newStdGen, split )

import Test.QuickCheck.Gen ( Gen(..) )

{-# NOINLINE bench_des #-}
bench_des des_buf () = do
    let des = apply_des_to_fixed_buffer_unsafe des_flv_header
    foldM_ (\in_des_buf _ -> do
                ( v, out_des_buf ) <- des in_des_buf
                evaluate (rnf v)
                return out_des_buf :: IO DesBuffer
           ) des_buf
             [0 :: Int .. 49999]

{-# NOINLINE bench_storable #-}
bench_storable b () = do
    foldM_ (\in_b _ -> do
                v :: FLVHeader <- peek in_b
                evaluate (rnf v)
                return (in_b `plusPtr` 9) :: IO (Ptr FLVHeader)
           ) (castPtr b :: Ptr FLVHeader)
             [0 :: Int .. 49999]

main = run_test $ do
    buffer_0 <- liftIO $ mallocBytes (50001 * 9 * 2) :: Test ( Ptr Word32 )
    test_flv_headers <- liftIO $ gen_a_bunch arbitrary 50000 :: Test [FLVHeader]
    liftIO $ pokeArray (castPtr buffer_0) test_flv_headers :: Test ()
    let des_buf = BufferRegion (castPtr buffer_0) (9 * 50000)
    verify_faster "DesAction.Static versus storable" perf_config (bench_des des_buf) (bench_storable buffer_0)
    liftIO $ free buffer_0 :: Test()
    return () :: Test ()