Main.hs (1927B)
1 {-# LANGUAGE BangPatterns #-} 2 {-# LANGUAGE OverloadedStrings #-} 3 4 module Main where 5 6 import qualified Data.ByteString as BS 7 import Control.DeepSeq 8 import Criterion.Main 9 import qualified Crypto.Curve.Secp256k1 as S 10 11 instance NFData S.Projective 12 instance NFData S.Affine 13 14 main :: IO () 15 main = defaultMain [ 16 secp256k1 17 ] 18 19 secp256k1 :: Benchmark 20 secp256k1 = bgroup "secp256k1" [ 21 bgroup "parse" [ 22 bench "foo" $ nf bparse p 23 , bench "bar" $ nf bparse q 24 , bench "baz" $ nf bparse r 25 , bench "qux" $ nf bparse s 26 ] 27 , bgroup "add" [ 28 bench "foo bar" $ nf (S.add foo) bar 29 , bench "foo baz" $ nf (S.add foo) baz 30 , bench "foo qux" $ nf (S.add foo) qux 31 , bench "bar baz" $ nf (S.add bar) baz 32 , bench "bar qux" $ nf (S.add bar) qux 33 , bench "baz qux" $ nf (S.add baz) qux 34 ] 35 , bgroup "double" [ 36 bench "foo" $ nf S.double foo 37 , bench "bar" $ nf S.double bar 38 , bench "baz" $ nf S.double baz 39 , bench "qux" $ nf S.double qux 40 ] 41 ] 42 where 43 p = "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" 44 q = "02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9" 45 r = "03a2113cf152585d96791a42cdd78782757fbfb5c6b2c11b59857eb4f7fda0b0e8" 46 s = "0306413898a49c93cccf3db6e9078c1b6a8e62568e4a4770e0d7d96792d1c580ad" 47 48 bparse :: BS.ByteString -> S.Projective 49 bparse bs = case S.parse_point bs of 50 Nothing -> error "bang" 51 Just v -> v 52 53 foo :: S.Projective 54 foo = case S.parse_point p of 55 Nothing -> error "boom" 56 Just !pa -> pa 57 58 bar :: S.Projective 59 bar = case S.parse_point q of 60 Nothing -> error "bang" 61 Just !pa -> pa 62 63 baz :: S.Projective 64 baz = case S.parse_point r of 65 Nothing -> error "bang" 66 Just !pa -> pa 67 68 qux :: S.Projective 69 qux = case S.parse_point s of 70 Nothing -> error "bang" 71 Just !pa -> pa 72