fixed

Pure Haskell large fixed-width integers.
git clone git://git.ppad.tech/fixed.git
Log | Files | Refs | README | LICENSE

commit 4169d99ef8050faa7cc079ff3510f0b45c6e6582
parent 60d6fec58a24e5bf8cf3a3a1602ad670cd9078b9
Author: Jared Tobin <jared@jtobin.io>
Date:   Wed, 22 Jan 2025 14:05:11 +0400

bench: arithmetic benchmarks

Diffstat:
Abench/Main.hs | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abench/Weight.hs | 4++++
Mppad-fixed.cabal | 30++++++++++++++++++++++++++++++
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 +