packages feed

ppad-bech32-0.2.0: bench/Main.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StandaloneDeriving #-}

module Main where

import Criterion.Main
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base32 as Base32
import qualified Data.ByteString.Bech32 as Bech32
import GHC.Generics
import qualified Reference.Bech32 as R
import Control.DeepSeq

deriving instance Generic R.Word5
instance NFData R.Word5

main :: IO ()
main = defaultMain [
    suite
  ]

base32_encode :: Benchmark
base32_encode = bgroup "base32 encode" [
    bench "120b" $ nf Base32.encode "jtobin was here"
  , bench "128b (non 40-bit multiple length)" $
      nf Base32.encode "jtobin was here!"
  , bench "240b" $ nf Base32.encode "jtobin was herejtobin was here"
  ]

base32_decode :: Benchmark
base32_decode = bgroup "base32 decode" [
    bench "120b" $ nf Base32.decode "df6x7cnfdcs8wctnyp5x2un9"
  , bench "128b (non 40-bit multiple length)" $
      nf Base32.decode "df6x7cnfdcs8wctnyp5x2un9yy"
  ]

bech32_encode :: Benchmark
bech32_encode = bgroup "bech32 encode" [
    bench "120b" $ nf (Bech32.encode "bc") "jtobin was here"
  ]

bech32_decode :: Benchmark
bech32_decode = bgroup "bech32 decode" [
    bench "120b" $ nf Bech32.decode "bc1df6x7cnfdcs8wctnyp5x2un9f0pw8y"
  ]

suite :: Benchmark
suite = bgroup "benchmarks" [
      bgroup "ppad-bech32" [
          base32_encode
        , base32_decode
        , bech32_encode
        , bech32_decode
      ]
    , bgroup "reference" [
        bgroup "bech32 encode" [
          bench "120b" $ nf (refEncode "bc") "jtobin was here"
        ]
      ]
    ]
  where
    refEncode h a = R.bech32Encode h (R.toBase32 (BS.unpack a))