Skip to content

Commit a018fc2

Browse files
committed
WIP: add benchmarking for insertCoin
1 parent d42b963 commit a018fc2

File tree

3 files changed

+1280
-1190
lines changed

3 files changed

+1280
-1190
lines changed

plutus-core/cost-model/budgeting-bench/Benchmarks/Values.hs

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import Common
1010
import Control.Monad (replicateM)
1111
import Criterion.Main (Benchmark)
1212
import Data.ByteString (ByteString)
13-
import PlutusCore (DefaultFun (LookupCoin, UnValueData, ValueContains, ValueData))
13+
import PlutusCore (DefaultFun (InsertCoin, LookupCoin, UnValueData, ValueContains, ValueData))
1414
import PlutusCore.Evaluation.Machine.ExMemoryUsage (LogValueOuterOrMaxInner (..),
15-
ValueTotalSize (..))
15+
ValueOuterOrMaxInner (..), ValueTotalSize (..))
1616
import PlutusCore.Value (K, Value)
1717
import PlutusCore.Value qualified as Value
1818
import System.Random.Stateful (StatefulGen, StdGen, runStateGen_, uniformByteStringM, uniformRM)
@@ -205,6 +205,58 @@ unValueDataBenchmark :: StdGen -> Benchmark
205205
unValueDataBenchmark gen =
206206
createOneTermBuiltinBench UnValueData [] (Value.valueData <$> generateTestValues gen)
207207

208+
-- insertCoin :: ByteString -> ByteString -> Integer -> Value -> Value
209+
----------------------------------------------------------------------------------------------------
210+
-- InsertCoin --------------------------------------------------------------------------------------
211+
212+
insertCoinBenchmark :: StdGen -> Benchmark
213+
insertCoinBenchmark gen =
214+
createFourTermBuiltinBenchElementwiseWithWrappers
215+
(id, id, id, ValueOuterOrMaxInner) -- Wrap Value argument to report outer/max inner size
216+
InsertCoin -- the builtin fun
217+
[] -- no type arguments needed (monomorphic builtin)
218+
(insertCoinArgs gen) -- the argument combos to generate benchmarks for
219+
220+
insertCoinArgs :: StdGen -> [(ByteString, ByteString, Integer, Value)]
221+
insertCoinArgs gen = runStateGen_ gen $ \(g :: g) -> do
222+
-- Add search keys to common test values
223+
let testValues = generateTestValues gen
224+
commonWithKeys <- mapM (withSearchKeys g . pure) testValues
225+
226+
-- Additional tests specific to insertCoin
227+
let valueSizes = [(100, 10), (500, 20), (1_000, 50), (2_000, 100)]
228+
additionalTests <-
229+
sequence $
230+
concat
231+
[ -- Value size tests (number of policies × tokens per policy)
232+
[ generateInsertTest g numPolicies tokensPerPolicy
233+
| (numPolicies, tokensPerPolicy) <- valueSizes
234+
]
235+
, -- Budget-constrained tests (at 30KB limit)
236+
[generateBudgetTest g 30_000]
237+
, -- Additional random tests for parameter spread
238+
replicate 50 (generateRandomInsertTest g)
239+
]
240+
241+
pure $ commonWithKeys ++ additionalTests
242+
243+
-- | Generate insert test with specified parameters
244+
generateInsertTest
245+
:: (StatefulGen g m)
246+
=> g
247+
-> Int -- Number of policies
248+
-> Int -- Tokens per policy
249+
-> m (ByteString, ByteString, Value)
250+
generateInsertTest g numPolicies tokensPerPolicy =
251+
withSearchKeys g (generateConstrainedValue numPolicies tokensPerPolicy g)
252+
253+
-- | Generate random insert test with varied parameters for better spread
254+
generateRandomInsertTest :: (StatefulGen g m) => g -> m (ByteString, ByteString, Value)
255+
generateRandomInsertTest g = do
256+
numPolicies <- uniformRM (1, 2_000) g
257+
tokensPerPolicy <- uniformRM (1, 1_000) g
258+
withSearchKeys g (generateConstrainedValue numPolicies tokensPerPolicy g)
259+
208260
----------------------------------------------------------------------------------------------------
209261
-- Value Generators --------------------------------------------------------------------------------
210262

@@ -244,15 +296,10 @@ generateConstrainedValue numPolicies tokensPerPolicy g = do
244296
policyIds <- replicateM numPolicies (generateKey g)
245297
tokenNames <- replicateM tokensPerPolicy (generateKey g)
246298

247-
-- Generate positive quantities (1 to 1000000)
248-
let quantity :: Int -> Int -> Integer
249-
quantity policyIndex tokenIndex =
250-
fromIntegral (1 + (policyIndex * 1_000 + tokenIndex) `mod` 1_000_000)
251-
252-
nestedMap :: [(K, [(K, Integer)])]
299+
let nestedMap :: [(K, [(K, Integer)])]
253300
nestedMap =
254301
[ ( policyId
255-
, [ (tokenName, quantity policyIndex tokenIndex)
302+
, [ (tokenName, genQuantity policyIndex tokenIndex)
256303
| (tokenIndex, tokenName) <- zip [0 ..] tokenNames
257304
]
258305
)
@@ -295,3 +342,8 @@ generateKey g = do
295342
-- | Generate random key as ByteString (for lookup arguments)
296343
generateKeyBS :: (StatefulGen g m) => g -> m ByteString
297344
generateKeyBS = uniformByteStringM Value.maxKeyLen
345+
346+
-- | Generate positive quantities (1 to 1000000)
347+
genQuantity :: Int -> Int -> Integer
348+
genQuantity policyIndex tokenIndex =
349+
fromIntegral (1 + (policyIndex * 1_000 + tokenIndex) `mod` 1_000_000)

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,3 +431,36 @@ createThreeTermBuiltinBenchWithWrappers (wrapX, wrapY, wrapZ) fun tys xs ys zs =
431431
[mkBM x y z | z <- zs] | y <- ys] | x <- xs]
432432
where mkBM x y z = benchDefault (showMemoryUsage (wrapZ z)) $ mkApp3 fun tys x y z
433433

434+
{- See Note [Adjusting the memory usage of arguments of costing benchmarks]. -}
435+
createFourTermBuiltinBenchElementwiseWithWrappers
436+
:: ( fun ~ DefaultFun
437+
, uni ~ DefaultUni
438+
, uni `HasTermLevel` a
439+
, uni `HasTermLevel` b
440+
, uni `HasTermLevel` c
441+
, uni `HasTermLevel` d
442+
, ExMemoryUsage a'
443+
, ExMemoryUsage b'
444+
, ExMemoryUsage c'
445+
, ExMemoryUsage d'
446+
, NFData a
447+
, NFData b
448+
, NFData c
449+
, NFData d
450+
)
451+
=> (a -> a', b -> b', c -> c', d -> d')
452+
-> fun
453+
-> [Type tyname uni ()]
454+
-> [(a,b,c,d)]
455+
-> Benchmark
456+
createFourTermBuiltinBenchElementwiseWithWrappers (wrapW, wrapX, wrapY, wrapZ) fun tys inputs =
457+
bgroup (show fun) $
458+
fmap
459+
(\(w, x, y, z) ->
460+
bgroup (showMemoryUsage $ wrapW w)
461+
[bgroup (showMemoryUsage $ wrapX x)
462+
[bgroup (showMemoryUsage $ wrapY y) [mkBM w x y z]]
463+
]
464+
)
465+
inputs
466+
where mkBM w x y z = benchDefault (showMemoryUsage $ wrapZ z) $ mkApp4 fun tys w x y z

0 commit comments

Comments
 (0)