packages feed

lsm-tree-1.0.0.0: bench/micro/Bench/Database/LSMTree/Internal/RawPage.hs

{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE TypeApplications   #-}

{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}

module Bench.Database.LSMTree.Internal.RawPage (
    benchmarks
    -- * Benchmarked functions
  ) where

import           Control.DeepSeq (deepseq)
import qualified Data.ByteString as BS

import           Database.LSMTree.Extras.ReferenceImpl
import qualified Database.LSMTree.Internal.RawBytes as RB
import           Database.LSMTree.Internal.RawPage
import           Database.LSMTree.Internal.Serialise

import           Criterion.Main
import           Test.QuickCheck
import           Test.QuickCheck.Gen (Gen (..))
import           Test.QuickCheck.Random (mkQCGen)

benchmarks :: Benchmark
benchmarks = rawpage `deepseq` bgroup "Bench.Database.LSMTree.Internal.RawPage"
    [ bRawPageFindKey
    , bRawPageLookup
    ]
  where
    bRawPageFindKey = bgroup "rawPageFindKey"
      [ bench "missing"       $ whnf (rawPageFindKey rawpage) missing
      , bench "existing-head" $ whnf (rawPageFindKey rawpage) existingHead
      , bench "existing-last" $ whnf (rawPageFindKey rawpage) existingLast
      ]

    bRawPageLookup = bgroup "rawPageLookup"
      [ bench "missing"       $ whnf (rawPageLookup rawpage) missing
      , bench "existing-head" $ whnf (rawPageLookup rawpage) existingHead
      , bench "existing-last" $ whnf (rawPageLookup rawpage) existingLast
      ]

    kops :: [(Key, Operation)]
    kops = unGen genPage (mkQCGen 42) 200
      where
        genPage = orderdKeyOps <$>
                    genPageContentNearFull DiskPage4k genSmallKey genSmallValue

    rawpage :: RawPage
    rawpage = fst $ toRawPage (PageContentFits kops)

    genSmallKey :: Gen Key
    genSmallKey = Key . BS.pack <$> vectorOf 8 arbitrary

    genSmallValue :: Gen Value
    genSmallValue = Value . BS.pack <$> vectorOf 8 arbitrary

    missing :: SerialisedKey
    missing = SerialisedKey $ RB.pack [1, 2, 3]

    keys :: [Key]
    keys = map fst kops

    existingHead :: SerialisedKey
    existingHead = SerialisedKey $ RB.fromByteString $ unKey $ head keys

    existingLast :: SerialisedKey
    existingLast = SerialisedKey $ RB.fromByteString $ unKey $ last keys