Skip to content

Commit c891dcc

Browse files
committed
Benchmark.Arrays
1 parent 52c8ebd commit c891dcc

File tree

5 files changed

+81
-4
lines changed

5 files changed

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

plutus-core/cost-model/budgeting-bench/Common.hs

+3-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ benchWith
8484
-- the result, so e.g. 'evaluateCek' won't work properly because it returns a pair whose components
8585
-- won't be evaluated by 'whnf'. We can't use 'nf' because it does too much work: for instance if it
8686
-- gets back a 'Data' value it'll traverse all of it.
87-
benchWith params name term = bench name $ whnf (evaluateCekNoEmit params) term
87+
benchWith params name term =
88+
bench name $
89+
whnf (unsafeSplitStructuralOperational . evaluateCekNoEmit params) term
8890

8991
{- Benchmark with the most recent CekParameters -}
9092
benchDefault :: String -> PlainTerm DefaultUni DefaultFun -> Benchmark

plutus-core/cost-model/budgeting-bench/Main.hs

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module Main (main) where
33

44
import CriterionExtensions (BenchmarkingPhase (Continue, Start), criterionMainWith)
55

6+
import Benchmarks.Arrays qualified
67
import Benchmarks.Bitwise qualified
78
import Benchmarks.Bool qualified
89
import Benchmarks.ByteStrings qualified
@@ -53,6 +54,7 @@ main = do
5354
<> Benchmarks.Data.makeBenchmarks gen
5455
<> Benchmarks.Integers.makeBenchmarks gen
5556
<> Benchmarks.Lists.makeBenchmarks gen
57+
<> Benchmarks.Arrays.makeBenchmarks gen
5658
<> Benchmarks.Misc.makeBenchmarks gen
5759
<> Benchmarks.Pairs.makeBenchmarks gen
5860
<> Benchmarks.Strings.makeBenchmarks gen

plutus-core/plutus-core.cabal

+2
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,7 @@ executable cost-model-budgeting-bench
888888
import: lang
889889
main-is: Main.hs
890890
other-modules:
891+
Benchmarks.Arrays
891892
Benchmarks.Bitwise
892893
Benchmarks.Bool
893894
Benchmarks.ByteStrings
@@ -924,6 +925,7 @@ executable cost-model-budgeting-bench
924925
, random
925926
, text
926927
, time
928+
, vector
927929

928930
-- This reads CSV data generated by cost-model-budgeting-bench, uses R to build
929931
-- the cost models for built-in functions, and saves them in a specified

plutus-core/plutus-core/src/PlutusCore/Default/Builtins.hs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2113,7 +2113,7 @@ instance uni ~ DefaultUni => ToBuiltinMeaning uni DefaultFun where
21132113
DefaultUniArray _uniA -> pure $ Vector.length vec
21142114
_ -> throwing _StructuralUnliftingError "Expected an array but got something else"
21152115
{-# INLINE lengthOfArrayDenotation #-}
2116-
in makeBuiltinMeaning lengthOfArrayDenotation (runCostingFunOneArgument . unimplementedCostingFun)
2116+
in makeBuiltinMeaning lengthOfArrayDenotation (runCostingFunOneArgument . paramLengthOfArray)
21172117

21182118
toBuiltinMeaning _semvar ListToArray =
21192119
let listToArrayDenotation :: SomeConstant uni [a] -> BuiltinResult (Opaque val (Vector a))
@@ -2122,7 +2122,7 @@ instance uni ~ DefaultUni => ToBuiltinMeaning uni DefaultFun where
21222122
DefaultUniList uniA -> pure $ fromValueOf (DefaultUniArray uniA) $ Vector.fromList xs
21232123
_ -> throwing _StructuralUnliftingError "Expected an array but got something else"
21242124
{-# INLINE listToArrayDenotation #-}
2125-
in makeBuiltinMeaning listToArrayDenotation (runCostingFunOneArgument . unimplementedCostingFun)
2125+
in makeBuiltinMeaning listToArrayDenotation (runCostingFunOneArgument . paramListToArray)
21262126

21272127
toBuiltinMeaning _semvar IndexArray =
21282128
let indexArrayDenotation :: SomeConstant uni (Vector a) -> Int -> BuiltinResult (Opaque val a)
@@ -2138,7 +2138,7 @@ instance uni ~ DefaultUni => ToBuiltinMeaning uni DefaultFun where
21382138
-- message, so we don't need to repeat them here.
21392139
throwing _StructuralUnliftingError "Expected an array but got something else"
21402140
{-# INLINE indexArrayDenotation #-}
2141-
in makeBuiltinMeaning indexArrayDenotation (runCostingFunTwoArguments . unimplementedCostingFun)
2141+
in makeBuiltinMeaning indexArrayDenotation (runCostingFunTwoArguments . paramIndexArray)
21422142

21432143
-- See Note [Inlining meanings of builtins].
21442144
{-# INLINE toBuiltinMeaning #-}

0 commit comments

Comments
 (0)