Skip to content

Commit

Permalink
Make NumBytesCostedAsNumWords use Integer instead of Int (#6350)
Browse files Browse the repository at this point in the history
The `NumBytesCostedAsNumWords` wrapper contained an `Int`, but this changes it to `Integer` for consistency with the other wrappers.  This change also affects the type of `Bitwise.replicateByte`.
  • Loading branch information
Kenneth MacKenzie authored Jul 29, 2024
1 parent f74023e commit 613ab5f
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 47 deletions.
8 changes: 2 additions & 6 deletions plutus-core/cost-model/budgeting-bench/Benchmarks/Bitwise.hs
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,6 @@ topBitIndex s = fromIntegral $ 8*(BS.length s)-1
memoryUsageAsNumBytes :: ExMemoryUsage a => a -> Int
memoryUsageAsNumBytes = (8*) . fromSatInt . sumCostStream . flattenCostRose . memoryUsage

-- An explicit conversion to avoid some type annotations later.
integerToInt :: Integer -> Int
integerToInt = fromIntegral

{- Experiments show that the times for big-endian and little-endian
`byteStringToInteger` conversions are very similar, with big-endian
conversion perhaps taking a fraction longer. We just generate a costing
Expand Down Expand Up @@ -81,7 +77,7 @@ benchIntegerToByteString =
-- The minimum width of bytestring needed to fit the inputs into.
widthsInBytes = fmap (fromIntegral . memoryUsageAsNumBytes) inputs
in createThreeTermBuiltinBenchElementwiseWithWrappers
(id, NumBytesCostedAsNumWords . integerToInt, id) b [] $
(id, NumBytesCostedAsNumWords, id) b [] $
zip3 (repeat True) widthsInBytes inputs

{- For `andByteString` with different-sized inputs, calling it with extension
Expand Down Expand Up @@ -174,7 +170,7 @@ benchReplicateByte =
-- ^ This gives us replication counts up to 64*128 = 8192, the maximum allowed.
inputs = pairWith (const (0xFF::Integer)) xs
in createTwoTermBuiltinBenchElementwiseWithWrappers
(NumBytesCostedAsNumWords . fromIntegral, id) ReplicateByte [] inputs
(NumBytesCostedAsNumWords, id) ReplicateByte [] inputs

{- Benchmarks with varying sizes of bytestrings and varying amounts of shifting
show that the execution time of `shiftByteString` depends linearly on the
Expand Down
43 changes: 20 additions & 23 deletions plutus-core/plutus-core/src/PlutusCore/Bitwise.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ module PlutusCore.Bitwise (
rotateByteStringWrapper,
-- * Implementation details
IntegerToByteStringError (..),
integerToByteStringMaximumOutputLength,
maximumOutputLength,
integerToByteString,
byteStringToInteger,
andByteString,
Expand Down Expand Up @@ -53,20 +53,17 @@ import GHC.Exts (Int (I#))
import GHC.Integer.Logarithms (integerLog2#)
import GHC.IO.Unsafe (unsafeDupablePerformIO)

{- Note [Input length limitation for IntegerToByteString]. We make
`integerToByteString` fail if it is called with arguments which would cause
the length of the result to exceed about 8K bytes because the execution time
becomes difficult to predict accurately beyond this point (benchmarks on a
number of different machines show that the CPU time increases smoothly for
inputs up to about 8K then increases sharply, becoming chaotic after about
14K). This restriction may be removed once a more efficient implementation
becomes available, which may happen when we no longer have to support GHC
8.10. -}
{- NB: if we do relax the length restriction then we will need two variants of
integerToByteString in Plutus Core so that we can continue to support the
current behaviour for old scripts.-}
integerToByteStringMaximumOutputLength :: Integer
integerToByteStringMaximumOutputLength = 8192
{- Note [Input length limitation for IntegerToByteString].
We make `integerToByteString` and `replicateByte` fail if they're called with arguments which would
cause the length of the result to exceed about 8K bytes because the execution time becomes difficult
to predict accurately beyond this point (benchmarks on a number of different machines show that the
CPU time increases smoothly for inputs up to about 8K then increases sharply, becoming chaotic after
about 14K). This restriction may be removed once a more efficient implementation becomes available,
which may happen when we no longer have to support GHC 8.10. -}
{- NB: if we do relax the length restriction then we will need two variants of integerToByteString in
Plutus Core so that we can continue to support the current behaviour for old scripts.-}
maximumOutputLength :: Integer
maximumOutputLength = 8192

{- Return the base 2 logarithm of an integer, returning 0 for inputs that aren't
strictly positive. This is essentially copied from GHC.Num.Integer, which
Expand All @@ -85,9 +82,9 @@ integerToByteStringWrapper endiannessArg lengthArg input
evaluationFailure
-- Check that the requested length does not exceed the limit. *NB*: if we remove the limit we'll
-- still have to make sure that the length fits into an Int.
| lengthArg > integerToByteStringMaximumOutputLength = do
| lengthArg > maximumOutputLength = do
emit . pack $ "integerToByteString: requested length is too long (maximum is "
++ show integerToByteStringMaximumOutputLength
++ show maximumOutputLength
++ " bytes)"
emit $ "Length requested: " <> (pack . show $ lengthArg)
evaluationFailure
Expand All @@ -96,12 +93,12 @@ integerToByteStringWrapper endiannessArg lengthArg input
-- limit. If the requested length is nonzero and less than the limit,
-- integerToByteString checks that the input fits.
| lengthArg == 0 -- integerLog2 n is one less than the number of significant bits in n
&& fromIntegral (integerLog2 input) >= 8 * integerToByteStringMaximumOutputLength =
&& fromIntegral (integerLog2 input) >= 8 * maximumOutputLength =
let bytesRequiredFor n = integerLog2 n `div` 8 + 1
-- ^ This gives 1 instead of 0 for n=0, but we'll never get that.
in do
emit . pack $ "integerToByteString: input too long (maximum is 2^"
++ show (8 * integerToByteStringMaximumOutputLength)
++ show (8 * maximumOutputLength)
++ "-1)"
emit $ "Length required: " <> (pack . show $ bytesRequiredFor input)
evaluationFailure
Expand Down Expand Up @@ -599,18 +596,18 @@ writeBits bs ixs bits = case unsafeDupablePerformIO . try $ go of
-- | Byte replication, as per [CIP-122](https://github.com/cardano-foundation/CIPs/tree/master/CIP-0122)
-- We want to cautious about the allocation of huge amounts of memory so we
-- impose the same length limit that's used in integerToByteString.
replicateByte :: Int -> Word8 -> BuiltinResult ByteString
replicateByte :: Integer -> Word8 -> BuiltinResult ByteString
replicateByte len w8
| len < 0 = do
emit "replicateByte: negative length requested"
evaluationFailure
| toInteger len > integerToByteStringMaximumOutputLength = do
| len > maximumOutputLength = do
emit . pack $ "replicateByte: requested length is too long (maximum is "
++ show integerToByteStringMaximumOutputLength
++ show maximumOutputLength
++ " bytes)"
emit $ "Length requested: " <> (pack . show $ len)
evaluationFailure
| otherwise = pure . BS.replicate len $ w8
| otherwise = pure . BS.replicate (fromIntegral len) $ w8

-- | Wrapper for calling 'shiftByteString' safely. Specifically, we avoid various edge cases:
--
Expand Down
8 changes: 2 additions & 6 deletions plutus-core/plutus-core/src/PlutusCore/Default/Builtins.hs
Original file line number Diff line number Diff line change
Expand Up @@ -1872,12 +1872,8 @@ instance uni ~ DefaultUni => ToBuiltinMeaning uni DefaultFun where
toBuiltinMeaning _semvar IntegerToByteString =
let integerToByteStringDenotation :: Bool -> NumBytesCostedAsNumWords -> Integer -> BuiltinResult BS.ByteString
{- The second argument is wrapped in a NumBytesCostedAsNumWords to allow us to
interpret it as a size during costing. Elsewhere we need
`NumBytesCostedAsNumWords` to contain an `Int` so we re-use that
here at the cost of not being able to convert an integer to a
bytestring of length greater than 2^63-1, which we're never going
to want to do anyway. -}
integerToByteStringDenotation b (NumBytesCostedAsNumWords w) = Bitwise.integerToByteStringWrapper b $ toInteger w
interpret it as a size during costing. -}
integerToByteStringDenotation b (NumBytesCostedAsNumWords w) = Bitwise.integerToByteStringWrapper b w
{-# INLINE integerToByteStringDenotation #-}
in makeBuiltinMeaning
integerToByteStringDenotation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,14 @@ instance ExMemoryUsage () where
denotation of a builtin then it *MUST* also be used to wrap the same argument
in the relevant budgeting benchmark.
-}
newtype NumBytesCostedAsNumWords = NumBytesCostedAsNumWords { unNumBytesCostedAsNumWords :: Int }
newtype NumBytesCostedAsNumWords = NumBytesCostedAsNumWords { unNumBytesCostedAsNumWords :: Integer }
instance ExMemoryUsage NumBytesCostedAsNumWords where
memoryUsage (NumBytesCostedAsNumWords n) = singletonRose . fromIntegral $ ((n-1) `div` 8) + 1
{-# INLINE memoryUsage #-}
-- Note that this uses `fromIntegral`, which will narrow large values to
-- maxBound::SatInt = 2^63-1. This shouldn't be a problem for costing because no
-- realistic input should be that large; however if you're going to use this then be
-- sure to convince yourself that it's safe.

{- | A wrapper for `Integer`s whose "memory usage" for costing purposes is the
absolute value of the `Integer`. This is used for costing built-in functions
Expand All @@ -195,6 +199,10 @@ newtype IntegerCostedLiterally = IntegerCostedLiterally { unIntegerCostedLiteral
instance ExMemoryUsage IntegerCostedLiterally where
memoryUsage (IntegerCostedLiterally n) = singletonRose . fromIntegral $ abs n
{-# INLINE memoryUsage #-}
-- Note that this uses `fromIntegral`, which will narrow large values to
-- maxBound::SatInt = 2^63-1. This shouldn't be a problem for costing because no
-- realistic input should be that large; however if you're going to use this then be
-- sure to convince yourself that it's safe.

{- | A wrappper for lists whose "memory usage" for costing purposes is just the
length of the list, ignoring the sizes of the elements. If this is used to
Expand All @@ -204,6 +212,10 @@ newtype ListCostedByLength a = ListCostedByLength { unListCostedByLength :: [a]
instance ExMemoryUsage (ListCostedByLength a) where
memoryUsage (ListCostedByLength l) = singletonRose . fromIntegral $ length l
{-# INLINE memoryUsage #-}
-- Note that this uses `fromIntegral`, which will narrow large values to
-- maxBound::SatInt = 2^63-1. This shouldn't be a problem for costing because no
-- realistic input should be that large; however if you're going to use this then be
-- sure to convince yourself that it's safe.

-- | Calculate a 'CostingInteger' for the given 'Integer'.
memoryUsageInteger :: Integer -> CostingInteger
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ module Evaluation.Builtins.Conversion (

import Evaluation.Builtins.Common (typecheckEvaluateCek)
import PlutusCore qualified as PLC
import PlutusCore.Bitwise (integerToByteStringMaximumOutputLength)
import PlutusCore.Bitwise qualified as Bitwise (maximumOutputLength)
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultBuiltinCostModelForTesting)
import PlutusCore.MkPlc (builtin, mkConstant, mkIterAppNoAnn)
import PlutusPrelude (Word8, def)
Expand All @@ -47,7 +47,7 @@ i2bProperty1 = do
e <- forAllWith ppShow Gen.bool
-- We limit this temporarily due to the limit imposed on lengths for the
-- conversion primitive.
d <- forAllWith ppShow $ Gen.integral (Range.constant 0 integerToByteStringMaximumOutputLength)
d <- forAllWith ppShow $ Gen.integral (Range.constant 0 Bitwise.maximumOutputLength)
let actualExp = mkIterAppNoAnn (builtin () PLC.IntegerToByteString) [
mkConstant @Bool () e,
mkConstant @Integer () d,
Expand All @@ -68,7 +68,7 @@ i2bProperty2 = do
e <- forAllWith ppShow Gen.bool
-- We limit this temporarily due to the limit imposed on lengths for the
-- conversion primitive.
k <- forAllWith ppShow $ Gen.integral (Range.constant 1 integerToByteStringMaximumOutputLength)
k <- forAllWith ppShow $ Gen.integral (Range.constant 1 Bitwise.maximumOutputLength)
j <- forAllWith ppShow $ Gen.integral (Range.constant 0 (k-1))
let actualExp = mkIterAppNoAnn (builtin () PLC.IntegerToByteString) [
mkConstant @Bool () e,
Expand Down Expand Up @@ -406,9 +406,8 @@ i2bCipExamples = [
-- inputs close to the maximum size.
i2bLimitTests ::[TestTree]
i2bLimitTests =
let maxAcceptableInput = 2 ^ (8*integerToByteStringMaximumOutputLength) - 1
maxAcceptableLength = integerToByteStringMaximumOutputLength -- Just for brevity
maxOutput = fromList (take (fromIntegral integerToByteStringMaximumOutputLength) $ repeat 0xFF)
let maxAcceptableInput = 2 ^ (8*Bitwise.maximumOutputLength) - 1
maxOutput = fromList (take (fromIntegral Bitwise.maximumOutputLength) $ repeat 0xFF)
makeTests endianness =
let prefix = if endianness
then "Big-endian, "
Expand All @@ -427,7 +426,7 @@ i2bLimitTests =
in evaluateAssertEqual expectedExp actualExp,
-- integerToByteString maxLen maxInput = 0xFF...FF
testCase (prefix ++ "maximum acceptable input, maximum acceptable length argument") $
let actualExp = mkIntegerToByteStringApp maxAcceptableLength maxAcceptableInput
let actualExp = mkIntegerToByteStringApp Bitwise.maximumOutputLength maxAcceptableInput
expectedExp = mkConstant @ByteString () maxOutput
in evaluateAssertEqual expectedExp actualExp,
-- integerToByteString 0 (maxInput+1) fails
Expand All @@ -436,16 +435,16 @@ i2bLimitTests =
in evaluateShouldFail actualExp,
-- integerToByteString maxLen (maxInput+1) fails
testCase (prefix ++ "input too big, maximum acceptable length argument") $
let actualExp = mkIntegerToByteStringApp maxAcceptableLength (maxAcceptableInput + 1)
let actualExp = mkIntegerToByteStringApp Bitwise.maximumOutputLength (maxAcceptableInput + 1)
in evaluateShouldFail actualExp,
-- integerToByteString (maxLen-1) maxInput fails
testCase (prefix ++ "maximum acceptable input, length argument not big enough") $
let actualExp = mkIntegerToByteStringApp (maxAcceptableLength - 1) maxAcceptableInput
let actualExp = mkIntegerToByteStringApp (Bitwise.maximumOutputLength - 1) maxAcceptableInput
in evaluateShouldFail actualExp,
-- integerToByteString _ (maxLen+1) 0 fails, just to make sure that
-- we can't go beyond the supposed limit
testCase (prefix ++ "input zero, length argument over limit") $
let actualExp = mkIntegerToByteStringApp (maxAcceptableLength + 1) 0
let actualExp = mkIntegerToByteStringApp (Bitwise.maximumOutputLength + 1) 0
in evaluateShouldFail actualExp
]
in makeTests True ++ makeTests False
Expand Down
2 changes: 1 addition & 1 deletion plutus-tx/src/PlutusTx/Builtins/Internal.hs
Original file line number Diff line number Diff line change
Expand Up @@ -817,7 +817,7 @@ replicateByte ::
BuiltinInteger ->
BuiltinByteString
replicateByte n w8 =
case Bitwise.replicateByte (fromIntegral n) (fromIntegral w8) of
case Bitwise.replicateByte n (fromIntegral w8) of
BuiltinFailure logs err -> traceAll (logs <> pure (display err)) $
Haskell.error "byteStringReplicate errored."
BuiltinSuccess bs -> BuiltinByteString bs
Expand Down

1 comment on commit 613ab5f

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Plutus Benchmarks'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.05.

Benchmark suite Current: 613ab5f Previous: f74023e Ratio
marlowe-semantics/cf542b7df466b228ca2197c2aaa89238a8122f3330fe5b77b3222f570395d9f5 525.7 μs 500.3 μs 1.05
marlowe-semantics/acce04815e8fd51be93322888250060da173eccf3df3a605bd6bc6a456cde871 308.3 μs 292.8 μs 1.05
marlowe-semantics/a85173a832db3ea944fafc406dfe3fa3235254897d6d1d0e21bc380147687bd5 397.6 μs 378.6 μs 1.05
marlowe-semantics/7a758e17486d1a30462c32a5d5309bd1e98322a9dcbe277c143ed3aede9d265f 551.7 μs 522.9 μs 1.06
marlowe-semantics/75a8bb183688bce447e00f435a144c835435e40a5defc6f3b9be68b70b4a3db6 738.6 μs 692.9 μs 1.07
marlowe-semantics/7529b206a78becb793da74b78c04d9d33a2540a1abd79718e681228f4057403a 849.7 μs 804 μs 1.06
marlowe-semantics/74c67f2f182b9a0a66c62b95d6fac5ace3f7e71ea3abfc52ffbe3ecb93436ea2 845.7 μs 795.1 μs 1.06
marlowe-semantics/71965c9ccae31f1ffc1d85aa20a356d4ed97a420954018d8301ec4f9783be0d7 509.8 μs 477.7 μs 1.07
marlowe-semantics/70f65b21b77ddb451f3df9d9fb403ced3d10e1e953867cc4900cc25e5b9dec47 841 μs 789.5 μs 1.07
marlowe-semantics/6d88f7294dd2b5ce02c3dc609bc7715bd508009738401d264bf9b3eb7c6f49c1 521.5 μs 490.9 μs 1.06
marlowe-semantics/675d63836cad11b547d1b4cddd498f04c919d4342612accf40913f9ae9419fac 1108 μs 1038 μs 1.07
marlowe-semantics/66af9e473d75e3f464971f6879cc0f2ef84bafcb38fbfa1dbc31ac2053628a38 1329 μs 1248 μs 1.06
marlowe-semantics/64c3d5b43f005855ffc4d0950a02fd159aa1575294ea39061b81a194ebb9eaae 706.8 μs 664.9 μs 1.06
marlowe-semantics/5f3d46c57a56cef6764f96c9de9677ac6e494dd7a4e368d1c8dd9c1f7a4309a5 525.3 μs 489.8 μs 1.07
marlowe-semantics/5f306b4b24ff2b39dab6cdc9ac6ca9bb442c1dc6f4e7e412eeb5a3ced42fb642 807.3 μs 757.7 μs 1.07
marlowe-semantics/5f130d19918807b60eab4c03119d67878fb6c6712c28c54f5a25792049294acc 323 μs 302.4 μs 1.07
marlowe-semantics/5e2c68ac9f62580d626636679679b97109109df7ac1a8ce86d3e43dfb5e4f6bc 552 μs 525.5 μs 1.05
marlowe-semantics/5e274e0f593511543d41570a4b03646c1d7539062b5728182e073e5760561a66 1080 μs 1022.9999999999999 μs 1.06
marlowe-semantics/5d0a88250f13c49c20e146819357a808911c878a0e0a7d6f7fe1d4a619e06112 1118 μs 1045 μs 1.07
marlowe-semantics/5abae75af26f45658beccbe48f7c88e74efdfc0b8409ba1e98f95fa5b6caf999 522.6 μs 489 μs 1.07
marlowe-semantics/57728d8b19b0e06412786f3dfed9e1894cd0ad1d2bc2bd497ec0ecb68f989d2b 321.7 μs 300.9 μs 1.07
marlowe-semantics/56333d4e413dbf1a665463bf68067f63c118f38f7539b7ba7167d577c0c8b8ce 827.3 μs 775.9 μs 1.07
marlowe-semantics/55dfe42688ad683b638df1fa7700219f00f53b335a85a2825502ab1e0687197e 322.7 μs 301.4 μs 1.07
marlowe-semantics/53ed4db7ab33d6f907eec91a861d1188269be5ae1892d07ee71161bfb55a7cb7 397.6 μs 371.9 μs 1.07
marlowe-semantics/52df7c8dfaa5f801cd837faa65f2fd333665fff00a555ce8c55e36ddc003007a 386.8 μs 362.3 μs 1.07
marlowe-semantics/4f9e8d361b85e62db2350dd3ae77463540e7af0d28e1eb68faeecc45f4655f57 423.2 μs 402 μs 1.05
marlowe-semantics/4d7adf91bfc93cebe95a7e054ec17cfbb912b32bd8aecb48a228b50e02b055c8 743.9 μs 695.7 μs 1.07
marlowe-semantics/4c3efd13b6c69112a8a888372d56c86e60c232125976f29b1c3e21d9f537845c 1095 μs 1025 μs 1.07
marlowe-semantics/44a9e339fa25948b48637fe7e10dcfc6d1256319a7b5ce4202cb54dfef8e37e7 321.7 μs 301.5 μs 1.07
marlowe-semantics/3db496e6cd39a8b888a89d0de07dace4397878958cab3b9d9353978b08c36d8a 885.4 μs 832.9 μs 1.06
marlowe-semantics/3bb75b2e53eb13f718eacd3263ab4535f9137fabffc9de499a0de7cabb335479 321.8 μs 304.3 μs 1.06
marlowe-semantics/383683bfcecdab0f4df507f59631c702bd11a81ca3841f47f37633e8aacbb5de 813.9 μs 768.4 μs 1.06
marlowe-semantics/33c3efd79d9234a78262b52bc6bbf8124cb321a467dedb278328215167eca455 666.5 μs 632.1 μs 1.05
marlowe-semantics/331e4a1bb30f28d7073c54f9a13c10ae19e2e396c299a0ce101ee6bf4b2020db 495 μs 467.7 μs 1.06
marlowe-semantics/322acde099bc34a929182d5b894214fc87ec88446e2d10625119a9d17fa3ec3d 324.1 μs 306.2 μs 1.06
marlowe-semantics/30aa34dfbe89e0c43f569929a96c0d2b74c321d13fec0375606325eee9a34a6a 1236 μs 1164 μs 1.06
marlowe-semantics/2cb21612178a2d9336b59d06cbf80488577463d209a453048a66c6eee624a695 839.6 μs 795 μs 1.06
marlowe-semantics/28fdce478e179db0e38fb5f3f4105e940ece450b9ce8a0f42a6e313b752e6f2c 982.1 μs 932.3 μs 1.05
marlowe-semantics/26e24ee631a6d927ea4fb4fac530cfd82ff7636986014de2d2aaa460ddde0bc3 599.2 μs 565.6 μs 1.06
marlowe-semantics/238b21364ab5bdae3ddb514d7001c8feba128b4ddcf426852b441f9a9d02c882 320.6 μs 304.2 μs 1.05
marlowe-semantics/21953bf8798b28df60cb459db24843fb46782b19ba72dc4951941fb4c20d2263 377.4 μs 359.2 μs 1.05
marlowe-semantics/1d6e3c137149a440f35e0efc685b16bfb8052ebcf66ec4ad77e51c11501381c7 323 μs 305.6 μs 1.06
marlowe-semantics/1a573aed5c46d637919ccb5548dfc22a55c9fc38298d567d15ee9f2eea69d89e 952.9 μs 906.7 μs 1.05
marlowe-semantics/1a2f2540121f09321216090b2b1f211e3f020c2c133a1a3c3f3c232a26153a04 322.9 μs 302.2 μs 1.07
marlowe-semantics/18cefc240debc0fcab14efdd451adfd02793093efe7bc76d6322aed6ddb582ad 800.5 μs 757.5 μs 1.06
marlowe-semantics/12910f24d994d451ff379b12c9d1ecdb9239c9b87e5d7bea570087ec506935d5 528.5 μs 499.2 μs 1.06
marlowe-semantics/119fbea4164e2bf21d2b53aa6c2c4e79414fe55e4096f5ce2e804735a7fbaf91 815.7 μs 774.3 μs 1.05
marlowe-semantics/0f1d0110001b121d051e15140c0c05141d151c1f1d201c040f10091b020a0e1a 507.1 μs 481.7 μs 1.05
marlowe-semantics/0be82588e4e4bf2ef428d2f44b7687bbb703031d8de696d90ec789e70d6bc1d8 1453 μs 1382 μs 1.05
marlowe-semantics/0bcfd9487614104ec48de2ea0b2c0979866a95115748c026f9ec129384c262c4 1209 μs 1142 μs 1.06
marlowe-semantics/07070c070510030509010e050d00040907050e0a0d06030f1006030701020607 1089 μs 1034 μs 1.05
marlowe-semantics/0705030002040601010206030604080208020207000101060706050502040301 1085 μs 1025 μs 1.06
marlowe-semantics/0543a00ba1f63076c1db6bf94c6ff13ae7d266dd7544678743890b0e8e1add63 1118 μs 1049 μs 1.07
marlowe-semantics/04000f0b04051006000e060f09080d0b090d0104050a0b0f0506070f0a070008 791.1 μs 751.8 μs 1.05
marlowe-role-payout/f53e8cafe26647ccce51e4c31db13608aea1f39034c0f52dee2e5634ef66e747 198 μs 187.8 μs 1.05
marlowe-role-payout/d6bc8ac4155e22300085784148bbc9d9bbfea896e1009dd396610a90e3943032 208.9 μs 198.6 μs 1.05
marlowe-role-payout/c99ecc2146ce2066ba6dffc734923264f8794815acbc2ec74c2c2c42ba272e4d 221.4 μs 209.2 μs 1.06
marlowe-role-payout/c78eeba7681d2ab51b4758efa4c812cc041928837c6e7563d8283cce67ce2e02 192.7 μs 180.9 μs 1.07
marlowe-role-payout/c4d4c88c5fe378a25a034025994a0d0b1642f10c8e6e513f872327fa895bfc7e 192.5 μs 181.5 μs 1.06
marlowe-role-payout/c11490431db3a92efdda70933ba411a0423935e73a75c856e326dbcf6672f3bf 182.3 μs 171 μs 1.07
marlowe-role-payout/bd79f4a84db23b7c4cd219d498bd581e085cbc3437957e74a8862281a700700b 207.2 μs 194.2 μs 1.07
marlowe-role-payout/bd460b7549b70c52e37b312a4242041eac18fe4a266f018bcea0c78a9085a271 207.7 μs 195.5 μs 1.06
marlowe-role-payout/b869f3928200061abb1c3060425b9354b0e08cbf4400b340b8707c14b34317cd 267.1 μs 251.3 μs 1.06
marlowe-role-payout/b6243a5b4c353ce4852aa41705111d57867d2783eeef76f6d59beb2360da6e90 239.9 μs 228.2 μs 1.05
marlowe-role-payout/af2e072b5adfaa7211e0b341e1f7319c4f4e7364a4247c9247132a927e914753 213.1 μs 202.1 μs 1.05
marlowe-role-payout/a92b4072cb8601fa697e1150c08463b14ffced54eb963df08d322216e27373cb 180.1 μs 170 μs 1.06
marlowe-role-payout/a7cb09f417c3f089619fe25b7624392026382b458486129efcff18f8912bf302 180.1 μs 170.4 μs 1.06
marlowe-role-payout/a6f064b83b31032ea7f25921364727224707268e472a569f584cc6b1d8c017e8 180.1 μs 169.5 μs 1.06
marlowe-role-payout/a6664a2d2a82f370a34a36a45234f6b33120a39372331678a3b3690312560ce9 216.2 μs 203.2 μs 1.06
marlowe-role-payout/a27524cfad019df45e4e8316f927346d4cc39da6bdd294fb2c33c3f58e6a8994 179.8 μs 169.7 μs 1.06
marlowe-role-payout/a1b25347409c3993feca1a60b6fcaf93d1d4bbaae19ab06fdf50cedc26cee68d 173 μs 162.4 μs 1.07
marlowe-role-payout/a0fba5740174b5cd24036c8b008cb1efde73f1edae097b9325c6117a0ff40d3b 199.2 μs 186.7 μs 1.07
marlowe-role-payout/a004a989c005d59043f996500e110fa756ad1b85800b889d5815a0106388e1d7 192.4 μs 179.4 μs 1.07
marlowe-role-payout/996804e90f2c75fe68886fc8511304b8ab9b36785f8858f5cb098e91c159dde9 186.8 μs 174.7 μs 1.07
marlowe-role-payout/962c2c658b19904372984a56409707401e64e9b03c1986647134cfd329ec5139 194 μs 181.9 μs 1.07
marlowe-role-payout/8c0fa5d9d6724c5c72c67e055d4bfc36a385ded7c3c81c08cdbd8705829af6e6 215 μs 201.4 μs 1.07
marlowe-role-payout/87167fc5469adac97c1be749326fa79a6b7862ce68aa4abcb438e3c034bd0899 211.7 μs 197.2 μs 1.07
marlowe-role-payout/803eae94d62e2afc0e835c204af8362170301bc329e2d849d5f5a47dddf479ec 201.1 μs 189.7 μs 1.06
marlowe-role-payout/7b1dd76edc27f00eb382bf996378155baf74d6a7c6f3d5ec837c39d29784aade 179.4 μs 169.3 μs 1.06
marlowe-role-payout/73f044f34a30f26639c58bafe952047f74c7bf1eafebab5aadf5b73cfb9024ed 180.5 μs 169.5 μs 1.06
marlowe-role-payout/6d66bddb4269bdf77392d3894da5341cf019d39787522af4f83f01285991e93c 180.2 μs 169.3 μs 1.06
marlowe-role-payout/6c364699767a84059ffd99cf718562a8c09d96e343f23dc481e8ffda13af424f 180.6 μs 170.6 μs 1.06
marlowe-role-payout/6b7bc2b9002a71b33cfd535d43f26334a283d0b9ad189b7cd74baac232c3b9fc 173.1 μs 164.8 μs 1.05
marlowe-role-payout/674b0577409957172ad85223c765d17e94c27714276c49c38dfae0a47a561a1e 175.9 μs 167.5 μs 1.05
marlowe-role-payout/6621a69217f09d91f42876a9c0cecf79de0e29bdd5b16c82c6c52cf959092ec4 202.1 μs 190.7 μs 1.06
marlowe-role-payout/5efe992e306e31cc857c64a62436ad2f9325acc5b4a74a8cebccdfd853ce63d2 186.1 μs 174.1 μs 1.07
marlowe-role-payout/5d4c62a0671c65a14f6a15093e3efc4f1816d95a5a58fd92486bedaae8d9526b 211 μs 199.3 μs 1.06
marlowe-role-payout/5ade103e9530dd0d572fe1b053ea65ad925c6ebbe321e873ace8b804363fa82c 249 μs 236.3 μs 1.05
marlowe-role-payout/371c10d2526fc0f09dbe9ed59e44dcd949270b27dc42035addd7ff9f7e0d05e7 214.5 μs 203.4 μs 1.05
marlowe-role-payout/3565ee025317e065e8555eef288080276716366769aad89e03389f5ec4ce26d7 193.6 μs 184.2 μs 1.05
marlowe-role-payout/332c2b1c11383d1b373e1315201f1128010e0e1518332f273f141b23243f2a07 174.8 μs 166 μs 1.05
marlowe-role-payout/1a20b465d48a585ffd622bd8dc26a498a3c12f930ab4feab3a5064cfb3bc536a 200.2 μs 190.6 μs 1.05
marlowe-role-payout/0e97c9d9417354d9460f2eb35018d3904b7b035af16ab299258adab93be0911a 197.1 μs 187.4 μs 1.05
marlowe-role-payout/041a2c3b111139201a3a2c173c392b170e16370d300f2d28342d0f2f0e182e01 213 μs 198.5 μs 1.07
marlowe-role-payout/0405010105020401010304080005050800040301010800080207080704020206 209.6 μs 197.7 μs 1.06
marlowe-role-payout/0403020000030204010000030001000202010101000304030001040404030100 193.6 μs 183.2 μs 1.06
marlowe-role-payout/03d730a62332c51c7b70c16c64da72dd1c3ea36c26b41cd1a1e00d39fda3d6cc 208.1 μs 197.8 μs 1.05
marlowe-role-payout/031d56d71454e2c4216ffaa275c4a8b3eb631109559d0e56f44ea8489f57ba97 219.8 μs 206.4 μs 1.06
marlowe-role-payout/0303020000020001010201060303040208070100050401080304020801030001 182.3 μs 171.9 μs 1.06
marlowe-role-payout/0202010002010100020102020102020001010101020102010001010101000100 182.2 μs 172.5 μs 1.06
marlowe-role-payout/0201020201020000020000010201020001020200000002010200000101010100 195.6 μs 184.9 μs 1.06
marlowe-role-payout/01dcc372ea619cb9f23c45b17b9a0a8a16b7ca0e04093ef8ecce291667a99a4c 174 μs 164.7 μs 1.06
marlowe-role-payout/0101000100000101010000010101000100010101000001000001000000010101 211.6 μs 200.7 μs 1.05
marlowe-role-payout/0100000100010000000001000100010101000101000001000000010000010000 276.7 μs 260.4 μs 1.06
marlowe-role-payout/0004000402010401030101030100040000010104020201030001000204020401 197.2 μs 186.1 μs 1.06

This comment was automatically generated by workflow using github-action-benchmark.

CC: @IntersectMBO/plutus-core

Please sign in to comment.