commit 011d1f446a94c0ac72eb372accdc6951b5d797ea
parent d4c704d005ceedbac7cb11b3b7abec818a22bdb2
Author: Jared Tobin <jared@jtobin.io>
Date: Sat, 16 May 2026 11:38:25 -0230
bench: criterion and weigh suites
Criterion bench for encode (1024B) and decode (1024-char input),
plus opt-in groups comparing against base64-bytestring and base64.
Weigh suite measures allocation on a ~1KB string against the same
two references.
Diffstat:
2 files changed, 92 insertions(+), 0 deletions(-)
diff --git a/bench/Main.hs b/bench/Main.hs
@@ -0,0 +1,66 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PackageImports #-}
+
+module Main where
+
+import Criterion.Main
+import qualified Data.ByteString as BS
+import qualified "ppad-base64" Data.ByteString.Base64 as B64
+import qualified "base64-bytestring" Data.ByteString.Base64 as R0
+import qualified "base64" Data.ByteString.Base64 as R1
+
+main :: IO ()
+main = defaultMain [
+ minimal_encode
+ , minimal_decode
+ ]
+
+minimal_encode :: Benchmark
+minimal_encode =
+ let !a = BS.replicate 1024 0x00
+ in bench "ppad-base64/encode" $
+ nf B64.encode a
+
+minimal_decode :: Benchmark
+minimal_decode =
+ let !a = B64.encode (BS.replicate 768 0x00)
+ in bench "ppad-base64/decode" $
+ nf B64.decode a
+
+encode :: Benchmark
+encode = bgroup "encode" [
+ bench "ppad-base64" $ nf B64.encode (BS.replicate 1024 0x00)
+ , bench "base64-bytestring" $ nf R0.encode (BS.replicate 1024 0x00)
+ , bench "base64" $ nf R1.encodeBase64' (BS.replicate 1024 0x00)
+ ]
+
+decode :: Benchmark
+decode = bgroup "decode" [
+ bench "ppad-base64" $ nf B64.decode
+ (B64.encode (BS.replicate 768 0x00))
+ , bench "base64-bytestring" $ nf R0.decode
+ (B64.encode (BS.replicate 768 0x00))
+ , bench "base64" $ nf R1.decodeBase64Untyped
+ (B64.encode (BS.replicate 768 0x00))
+ ]
+
+decode_various :: Benchmark
+decode_various = bgroup "base64" [
+ bench "1024B input" $ nf B64.decode (B64.encode (BS.replicate 768 0x00))
+ , bench "1028B input" $ nf B64.decode (B64.encode (BS.replicate 771 0x00))
+ , bench "1032B input" $ nf B64.decode (B64.encode (BS.replicate 774 0x00))
+ , bench "1036B input" $ nf B64.decode (B64.encode (BS.replicate 777 0x00))
+ , bench "1040B input" $ nf B64.decode (B64.encode (BS.replicate 780 0x00))
+ , bench "1044B input" $ nf B64.decode (B64.encode (BS.replicate 783 0x00))
+ , bench "1048B input" $ nf B64.decode (B64.encode (BS.replicate 786 0x00))
+ , bench "1052B input" $ nf B64.decode (B64.encode (BS.replicate 789 0x00))
+ ]
+
+encode_various :: Benchmark
+encode_various = bgroup "base64" [
+ bench "1024B input" $ nf B64.encode (BS.replicate 1024 0x00)
+ , bench "1023B input" $ nf B64.encode (BS.replicate 1023 0x00)
+ , bench "1022B input" $ nf B64.encode (BS.replicate 1022 0x00)
+ ]
diff --git a/bench/Weight.hs b/bench/Weight.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PackageImports #-}
+
+module Main where
+
+import qualified Data.ByteString as BS
+import qualified "base64-bytestring" Data.ByteString.Base64 as R0
+import qualified "base64" Data.ByteString.Base64 as R1
+import qualified "ppad-base64" Data.ByteString.Base64 as B64
+import qualified Weigh as W
+
+inp :: BS.ByteString
+inp = "jtobin was here benching stuffjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin was here benching stufjtobin w"
+
+binp :: BS.ByteString
+binp = B64.encode inp
+
+main :: IO ()
+main = W.mainWith $ do
+ W.func "ppad-base64 (encode)" B64.encode inp
+ W.func "base64-bytestring (encode)" R0.encode inp
+ W.func "base64 (encode)" R1.encodeBase64' inp
+
+ W.func "ppad-base64 (decode)" B64.decode binp
+ W.func "base64-bytestring (decode)" R0.decode binp
+ W.func "base64 (decode)" R1.decodeBase64Untyped binp