commit 4169d99ef8050faa7cc079ff3510f0b45c6e6582
parent 60d6fec58a24e5bf8cf3a3a1602ad670cd9078b9
Author: Jared Tobin <jared@jtobin.io>
Date: Wed, 22 Jan 2025 14:05:11 +0400
bench: arithmetic benchmarks
Diffstat:
3 files changed, 108 insertions(+), 0 deletions(-)
diff --git a/bench/Main.hs b/bench/Main.hs
@@ -0,0 +1,74 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# LANGUAGE BangPatterns #-}
+
+module Main where
+
+import qualified Data.Word.Extended as W
+import Control.DeepSeq
+import Criterion.Main
+
+instance NFData W.Word256
+instance NFData W.Word512
+
+add_baseline :: Benchmark
+add_baseline = bench "add (baseline)" $ nf ((+) w0) w1 where
+ w0, w1 :: Integer
+ w0 = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
+ w1 = 0x7fffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffed
+
+add :: Benchmark
+add = bench "add" $ nf (W.add w0) w1 where
+ w0 = W.to_word256
+ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
+ w1 = W.to_word256
+ 0x7fffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffed
+
+sub_baseline :: Benchmark
+sub_baseline = bench "sub (baseline)" $ nf ((-) w0) w1 where
+ w0, w1 :: Integer
+ w0 = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
+ w1 = 0x7fffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffed
+
+sub :: Benchmark
+sub = bench "sub" $ nf (W.sub w0) w1 where
+ w0 = W.to_word256
+ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
+ w1 = W.to_word256
+ 0x7fffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffed
+
+mul_baseline :: Benchmark
+mul_baseline = bench "mul (baseline)" $ nf ((*) w0) w1 where
+ w0, w1 :: Integer
+ w0 = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
+ w1 = 0x7fffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffed
+
+mul :: Benchmark
+mul = bench "mul" $ nf (W.mul_512 w0) w1 where
+ w0 = W.to_word256
+ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
+ w1 = W.to_word256
+ 0x7fffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffed
+
+mul128_baseline :: Benchmark
+mul128_baseline = bench "mul128 (baseline)" $ nf ((*) w0) w1 where
+ w0, w1 :: Integer
+ w0 = 0x7fffffffffffffffffffffffffffffed
+ w1 = 0x7ffffffffffffffbffffffffffffffed
+
+mul128 :: Benchmark
+mul128 = bench "mul128" $ nf (W.mul w0) w1 where
+ w0 = W.to_word256 0x7fffffffffffffffffffffffffffffed
+ w1 = W.to_word256 0x7ffffffffffffffbffffffffffffffed
+
+main :: IO ()
+main = defaultMain [
+ add_baseline
+ , add
+ , sub_baseline
+ , sub
+ , mul_baseline
+ , mul
+ , mul128_baseline
+ , mul128
+ ]
+
diff --git a/bench/Weight.hs b/bench/Weight.hs
@@ -0,0 +1,4 @@
+module Main where
+
+main :: IO ()
+main = pure ()
diff --git a/ppad-fixed.cabal b/ppad-fixed.cabal
@@ -43,3 +43,33 @@ test-suite fixed-tests
, tasty
, tasty-quickcheck
+benchmark fixed-bench
+ type: exitcode-stdio-1.0
+ default-language: Haskell2010
+ hs-source-dirs: bench
+ main-is: Main.hs
+
+ ghc-options:
+ -rtsopts -O2 -Wall
+
+ build-depends:
+ base
+ , criterion
+ , deepseq
+ , ppad-fixed
+
+benchmark fixed-weigh
+ type: exitcode-stdio-1.0
+ default-language: Haskell2010
+ hs-source-dirs: bench
+ main-is: Weight.hs
+
+ ghc-options:
+ -rtsopts -O2 -Wall
+
+ build-depends:
+ base
+ , deepseq
+ , ppad-fixed
+ , weigh
+