packages feed

memcache-0.0.0: bench/Parser.hs

{-# LANGUAGE OverloadedStrings #-}

-- | Benchmark the parsing and serialization aspects of memcache.
module Main where

import Database.Memcache.Types
import Database.Memcache.Wire

import Criterion.Main
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as LC
import Data.Monoid

main :: IO ()
main =
    defaultMain [
        bgroup "serialize" [
            bench "get" $ whnf szRequest' getReqMsg,
            bench "set" $ whnf szRequest' setReqMsg
        ],
        bgroup "deserialize" [
            bench "get" $ whnf dzResponse' getRespBytes
        ]
    ]

getReqMsg :: Request
getReqMsg = Req {
        reqOp     = ReqGet Loud NoKey "key!",
        reqOpaque = 123,
        reqCas    = 999
    }

setReqMsg :: Request
setReqMsg = Req {
        reqOp     = ReqSet Loud "key!" "hello world" (SESet 10 0),
        reqOpaque = 123,
        reqCas    = 999
    }

getRespHeaderBytes :: L.ByteString
getRespHeaderBytes =
    --        magic, op,               extral, 0
    L.pack $ [0x81, 0x00] ++ keyl' ++ [0x04, 0x00] ++ status' ++ bodyl' ++ opaque' ++ cas'
  where
    keyl'   = [0x00, 0x00]
    status' = [0x00, 0x00, 0x00, 0x00]
    bodyl'  = [0x00, 0x00, 0x00, 0x08]
    opaque' = [0x00, 0x00, 0x00, 0x07]
    cas'    = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09]

getRespBytes :: L.ByteString
getRespBytes = getRespHeaderBytes <> extras' <> key' <> value'
  where
    extras' = L.pack  [0x00, 0x00, 0x00, 0x01] -- BE: so 1?
    key'    = L.pack  []
    value'  = LC.pack "12345678"