packages feed

bytebuild-0.3.4.0: bench/Main.hs

{-# language LambdaCase #-}
{-# language OverloadedStrings #-}

import Data.Primitive (ByteArray)
import Data.Word (Word64)
import Gauge (bgroup,bench,whnf)
import Gauge.Main (defaultMain)

import qualified Arithmetic.Nat as Nat
import qualified Data.Bytes.Builder as B
import qualified Data.Bytes.Builder.Bounded as U

import qualified Cell
import qualified SimpleCsv
import qualified HexWord64
import qualified Word16Tree

main :: IO ()
main = defaultMain
  [ bgroup "w64"
    [ bgroup "hex"
      [ bench "library" (whnf encodeHexWord64s w64s)
      , bench "loop" (whnf encodeHexWord64sLoop w64s)
      ]
    ]
  , bgroup "unbounded"
    [ bench "csv-no-escape" $ whnf
        (\x -> B.run 4080 (SimpleCsv.encodeRows x))
        Cell.cells
    , bench "word-16-tree-small" $ whnf
        (\x -> B.run 4080 (Word16Tree.encode x))
        Word16Tree.exampleSmall
    , bench "word-16-tree-2000" $ whnf
        (\x -> B.run ((4096 * 16) - 16) (Word16Tree.encode x))
        Word16Tree.example2000
    , bench "word-16-tree-9000" $ whnf
        (\x -> B.run ((4096 * 64) - 16) (Word16Tree.encode x))
        Word16Tree.example9000
    ]
  ]

w64s :: Word64s
w64s = Word64s
  0xde2b8a480cf77113
  0x48f1668ca2a68b45
  0xd262fbaa0b2f473c
  0xbab20547f4919d9f
  0xb7ec16121704db43
  0x9c259f5bfa90e1eb
  0xd451eca11d9873ad
  0xbd927e8d4c879d02

data Word64s = Word64s
  !Word64 !Word64 !Word64 !Word64
  !Word64 !Word64 !Word64 !Word64

encodeHexWord64s :: Word64s -> ByteArray
{-# noinline encodeHexWord64s #-}
encodeHexWord64s (Word64s a b c d e f g h) = U.run Nat.constant $
  U.word64PaddedUpperHex a `U.append`
  U.word64PaddedUpperHex b `U.append`
  U.word64PaddedUpperHex c `U.append`
  U.word64PaddedUpperHex d `U.append`
  U.word64PaddedUpperHex e `U.append`
  U.word64PaddedUpperHex f `U.append`
  U.word64PaddedUpperHex g `U.append`
  U.word64PaddedUpperHex h

encodeHexWord64sLoop :: Word64s -> ByteArray
{-# noinline encodeHexWord64sLoop #-}
encodeHexWord64sLoop (Word64s a b c d e f g h) = U.run Nat.constant $
  HexWord64.word64PaddedUpperHex a `U.append`
  HexWord64.word64PaddedUpperHex b `U.append`
  HexWord64.word64PaddedUpperHex c `U.append`
  HexWord64.word64PaddedUpperHex d `U.append`
  HexWord64.word64PaddedUpperHex e `U.append`
  HexWord64.word64PaddedUpperHex f `U.append`
  HexWord64.word64PaddedUpperHex g `U.append`
  HexWord64.word64PaddedUpperHex h