-
Notifications
You must be signed in to change notification settings - Fork 486
/
Copy pathArrays.hs
74 lines (62 loc) · 2.46 KB
/
Arrays.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE TypeApplications #-}
module Benchmarks.Arrays (makeBenchmarks) where
import Prelude
import Common (createOneTermBuiltinBench, createTwoTermBuiltinBenchElementwise)
import Control.Monad (replicateM)
import Criterion.Main (Benchmark)
import Data.Vector.Strict (Vector)
import Data.Vector.Strict qualified as Vector
import PlutusCore.Builtin (mkTyBuiltin)
import PlutusCore.Core (Type)
import PlutusCore.Default (DefaultFun (IndexArray, LengthOfArray, ListToArray), DefaultUni)
import PlutusCore.Name.Unique (TyName)
import System.Random.Stateful (StdGen, UniformRange (uniformRM), runStateGen_)
--------------------------------------------------------------------------------
-- Benchmarks ------------------------------------------------------------------
makeBenchmarks :: StdGen -> [Benchmark]
makeBenchmarks gen =
[ benchLengthOfArray gen
, benchListToArray gen
, benchIndexArray gen
]
benchLengthOfArray :: StdGen -> Benchmark
benchLengthOfArray gen =
createOneTermBuiltinBench LengthOfArray [tyArrayOfInteger] listOfArrays
where
listOfArrays :: [Vector Integer] =
runStateGen_ gen \g -> replicateM 100 do
arraySize <- uniformRM (1, 100) g
Vector.replicateM arraySize (uniformRM intRange g)
benchListToArray :: StdGen -> Benchmark
benchListToArray gen =
createOneTermBuiltinBench ListToArray [tyListOfInteger] listOfLists
where
listOfLists :: [[Integer]] =
runStateGen_ gen \g -> replicateM 100 do
listSize <- uniformRM (1, 100) g
replicateM listSize (uniformRM intRange g)
benchIndexArray :: StdGen -> Benchmark
benchIndexArray gen =
createTwoTermBuiltinBenchElementwise
IndexArray
[tyArrayOfInteger]
(zip arrays idxs)
where
(arrays :: [Vector Integer], idxs :: [Integer]) =
unzip $ runStateGen_ gen \g -> replicateM 100 do
arraySize <- uniformRM (1, 100) g
vec <- Vector.replicateM arraySize (uniformRM intRange g)
idx <- uniformRM (0, arraySize - 1) g
pure (vec, fromIntegral idx)
--------------------------------------------------------------------------------
-- Helpers ---------------------------------------------------------------------
tyListOfInteger :: Type TyName DefaultUni ()
tyListOfInteger = mkTyBuiltin @_ @[Integer] ()
tyArrayOfInteger :: Type TyName DefaultUni ()
tyArrayOfInteger = mkTyBuiltin @_ @(Vector Integer) ()
intRange :: (Integer, Integer)
intRange =
( fromIntegral (minBound @Int) - 10
, fromIntegral (maxBound @Int) + 10
)