Skip to content

Commit

Permalink
[Builtins] Add pattern matching builtins (#6530)
Browse files Browse the repository at this point in the history
The main change is replacing

```haskell
data BuiltinRuntime val
    = BuiltinCostedResult ExBudgetStream ~(BuiltinResult val)
    | <...>
```

with

```haskell
data BuiltinRuntime val
    = BuiltinCostedResult ExBudgetStream ~(BuiltinResult (HeadSpine val))
    | <...>
```

where `HeadSpine` is a fancy way of saying `NonEmpty`:

```haskell
-- | A non-empty spine. Isomorphic to 'NonEmpty', except is strict and is defined as a single
-- recursive data type.
data Spine a
    = SpineLast a
    | SpineCons a (Spine a)

-- | The head-spine form of an iterated application. Provides O(1) access to the head of the
-- application. Isomorphic to @nonempty@, except is strict and the no-spine case is made a separate
-- constructor for performance reasons (it only takes a single pattern match to access the head when
-- there's no spine this way, while otherwise we'd also need to match on the spine to ensure that
-- it's empty -- and the no-spine case is by far the most common one, hence we want to optimize it).
data HeadSpine a
    = HeadOnly a
    | HeadSpine a (Spine a)
```

(we define a separate type, because we want strictness, and you don't see any bangs, because it's in a module with `StrictData` enabled).

The idea is that a builtin application can return a function applied to a bunch of arguments, which is exactly what we need to be able to express `caseList`

```haskell
caseList xs0 f z = case xs0 of
   []   -> z
   x:xs -> f x xs
```

as a builtin:

```haskell
-- | Take a function and a list of arguments and apply the former to the latter.
headSpine :: Opaque val asToB -> [val] -> Opaque (HeadSpine val) b
headSpine (Opaque f) = Opaque . \case
    []      -> HeadOnly f
    x0 : xs ->
        -- It's critical to use 'foldr' here, so that deforestation kicks in.
        -- See Note [Definition of foldl'] in "GHC.List" and related Notes around for an explanation
        -- of the trick.
        HeadSpine f $ foldr (\x2 r x1 -> SpineCons x1 $ r x2) SpineLast xs x0

instance uni ~ DefaultUni => ToBuiltinMeaning uni DefaultFun where
    <...>
    toBuiltinMeaning _ver CaseList =
        let caseListDenotation
                :: Opaque val (LastArg a b)
                -> Opaque val (a -> [a] -> b)
                -> SomeConstant uni [a]
                -> BuiltinResult (Opaque (HeadSpine val) b)
            caseListDenotation z f (SomeConstant (Some (ValueOf uniListA xs0))) = do
                case uniListA of
                    DefaultUniList uniA -> pure $ case xs0 of
                        []     -> headSpine z []                                             -- [1]
                        x : xs -> headSpine f [fromValueOf uniA x, fromValueOf uniListA xs]  -- [2]
                    _ ->
                        -- See Note [Structural vs operational errors within builtins].
                        throwing _StructuralUnliftingError "Expected a list but got something else"
            {-# INLINE caseListDenotation #-}
        in makeBuiltinMeaning
            caseListDenotation
            (runCostingFunThreeArguments . unimplementedCostingFun)
```

Being able to express [1] (representing `z`) and [2] (representing `f x xs`) is precisely what this PR enables.

Adding support for the new functionality to the CEK machine is trivial. All we need is a way to push a `Spine` of arguments onto the context:

```haskell
    -- | Push arguments onto the stack. The first argument will be the most recent entry.
    pushArgs
        :: Spine (CekValue uni fun ann)
        -> Context uni fun ann
        -> Context uni fun ann
    pushArgs args ctx = foldr FrameAwaitFunValue ctx args
```

and a `HeadSpine` version of `returnCek`:

```haskell
    -- | Evaluate a 'HeadSpine' by pushing the arguments (if any) onto the stack and proceeding with
    -- the returning phase of the CEK machine.
    returnCekHeadSpine
        :: Context uni fun ann
        -> HeadSpine (CekValue uni fun ann)
        -> CekM uni fun s (Term NamedDeBruijn uni fun ())
    returnCekHeadSpine ctx (HeadOnly  x)    = returnCek ctx x
    returnCekHeadSpine ctx (HeadSpine f xs) = returnCek (pushArgs xs ctx) f
```

Then replacing

```haskell
                BuiltinSuccess x ->
                    returnCek ctx x
```

with

```haskell
                BuiltinSuccess fXs ->
                    returnCekHeadSpine ctx fXs
```

(and similarly for `BuiltinSuccessWithLogs`) will do the trick.

We used to define `caseList` in terms of `IfThenElse`, `NullList` and either `HeadList` or `TailList` depending on the result of `NullList`, i.e. three builtin calls in the worst and in the best case. Then we introduced `ChooseList`, which replaced both `IfThenElse` and `NullList` in `caseList` thus bringing total amount of builtin calls down to 2 in all cases. This turned out to have a [substantial](#4119 (review)) impact on performance. This PR allows us to bring total number of builtin calls per `caseList` invokation down to 1 -- the `CaseList` builtin itself.
  • Loading branch information
effectfully authored Oct 18, 2024
1 parent 5eda9f0 commit 557a2c7
Show file tree
Hide file tree
Showing 328 changed files with 3,832 additions and 3,087 deletions.
32 changes: 16 additions & 16 deletions plutus-benchmark/ed25519-costs/test/9.6/ed25519-costs.golden
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
n Script size CPU usage Memory usage
----------------------------------------------------------------------
0 486 (3.0%) 4490441 (0.0%) 21722 (0.2%)
10 2213 (13.5%) 647515741 (6.5%) 520552 (3.7%)
20 3940 (24.0%) 1290541041 (12.9%) 1019382 (7.3%)
30 5667 (34.6%) 1933566341 (19.3%) 1518212 (10.8%)
40 7394 (45.1%) 2576591641 (25.8%) 2017042 (14.4%)
50 9120 (55.7%) 3219616941 (32.2%) 2515872 (18.0%)
60 10847 (66.2%) 3862642241 (38.6%) 3014702 (21.5%)
70 12574 (76.7%) 4505667541 (45.1%) 3513532 (25.1%)
80 14300 (87.3%) 5148692841 (51.5%) 4012362 (28.7%)
90 16027 (97.8%) 5791718141 (57.9%) 4511192 (32.2%)
100 17754 (108.4%) 6434743441 (64.3%) 5010022 (35.8%)
110 19481 (118.9%) 7077768741 (70.8%) 5508852 (39.3%)
120 21207 (129.4%) 7720794041 (77.2%) 6007682 (42.9%)
130 22934 (140.0%) 8363819341 (83.6%) 6506512 (46.5%)
140 24661 (150.5%) 9006844641 (90.1%) 7005342 (50.0%)
150 26388 (161.1%) 9649869941 (96.5%) 7504172 (53.6%)
0 364 (2.2%) 400002176482 (4000.0%) 400000012902 (2857142.9%)
10 2091 (12.8%) 10400582982252 (104005.8%) 10400000261092 (74285716.2%)
20 3818 (23.3%) 20401163788022 (204011.6%) 20400000509282 (145714289.4%)
30 5545 (33.8%) 30401744593792 (304017.4%) 30400000757472 (217142862.6%)
40 7272 (44.4%) 40402325399562 (404023.3%) 40400001005662 (288571435.8%)
50 8998 (54.9%) 50402906205332 (504029.1%) 50400001253852 (360000009.0%)
60 10725 (65.5%) 60403487011102 (604034.9%) 60400001502042 (431428582.2%)
70 12452 (76.0%) 70404067816872 (704040.7%) 70400001750232 (502857155.4%)
80 14178 (86.5%) 80404648622642 (804046.5%) 80400001998422 (574285728.6%)
90 15905 (97.1%) 90405229428412 (904052.3%) 90400002246612 (645714301.8%)
100 17632 (107.6%) 100405810234182 (1004058.1%) 100400002494802 (717142875.0%)
110 19359 (118.2%) 110406391039952 (1104063.9%) 110400002742992 (788571448.2%)
120 21085 (128.7%) 120406971845722 (1204069.7%) 120400002991182 (860000021.4%)
130 22812 (139.2%) 130407552651492 (1304075.5%) 130400003239372 (931428594.6%)
140 24539 (149.8%) 140408133457262 (1404081.3%) 140400003487562 (1002857167.8%)
150 26266 (160.3%) 150408714263032 (1504087.1%) 150400003735752 (1074285741.0%)

Off-chain version succeeded on 100 inputs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ matchDataList l nilCase consCase =
where
handleConstr tag values =
if tag == 0 then nilCase
else if tag == 1 then consCase (BI.head values) (BI.head (BI.tail values))
else if tag == 1 then B.matchList values error (\h t -> consCase h (BI.head t))
else error ()

{-# INLINABLE foldLeftData #-}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Control.Monad.Except
import Data.Either
import PlutusCore.Compiler.Erase (eraseTerm)
import PlutusCore.StdLib.Data.List qualified as BuiltinList
import PlutusCore.StdLib.Data.MatchOption (MatchOption (UseCase))
import PlutusCore.StdLib.Data.ScottList qualified as ScottList
import PlutusCore.Version qualified as PLC
import PlutusTx qualified as Tx
Expand All @@ -22,11 +23,11 @@ mkBuiltinList l = compiledCodeToTerm (Tx.liftCodeDef $ BI.BuiltinList l)

mkSumLeftBuiltinTerm :: [Integer] -> Term
mkSumLeftBuiltinTerm l =
UPLC.Apply () (debruijnTermUnsafe $ eraseTerm BuiltinList.sum) (mkBuiltinList l)
UPLC.Apply () (debruijnTermUnsafe $ eraseTerm (BuiltinList.sum UseCase)) (mkBuiltinList l)

mkSumRightBuiltinTerm :: [Integer] -> Term
mkSumRightBuiltinTerm l =
UPLC.Apply () (debruijnTermUnsafe $ eraseTerm BuiltinList.sumr) (mkBuiltinList l)
UPLC.Apply () (debruijnTermUnsafe $ eraseTerm (BuiltinList.sumr UseCase)) (mkBuiltinList l)

mkScottList :: [Integer] -> Term
mkScottList l = compiledCodeToTerm (Tx.liftCode PLC.plcVersion100 l)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 199606904
| mem: 859952})
({cpu: 13100114647000
| mem: 13100000559240})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 16664628194
| mem: 71518232})
({cpu: 1030109969691100
| mem: 1030100047858200})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 59797074
| mem: 259492})
({cpu: 4100033399800
| mem: 4100000165920})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 4254600144
| mem: 18263632})
({cpu: 265102531486600
| mem: 265100012173000})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 123874594
| mem: 533932})
({cpu: 10100073112900
| mem: 10100000394000})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 279116232
| mem: 1124130})
({cpu: 20100196027082
| mem: 20100000942802})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 128674594
| mem: 563932})
({cpu: 10100077912900
| mem: 10100000424000})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 283916232
| mem: 1154130})
({cpu: 20100200827082
| mem: 20100000972802})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 193314074
| mem: 924490})
({cpu: 3900182104674
| mem: 3900000902990})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 282840136
| mem: 1423504})
({cpu: 5700263611088
| mem: 5700001377860})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 207116188
| mem: 999654})
({cpu: 4700192221958
| mem: 4700000967314})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 167775938
| mem: 790422})
({cpu: 3500158228140
| mem: 3500000774178})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 189185946
| mem: 898332})
({cpu: 3700178626534
| mem: 3700000879296})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 175996754
| mem: 827072})
({cpu: 3500166448956
| mem: 3500000810828})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 174835055
| mem: 820470})
({cpu: 3500165287257
| mem: 3500000804226})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 219110344
| mem: 1057176})
({cpu: 4700203854488
| mem: 4700001024508})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 203687877
| mem: 979844})
({cpu: 4100191466863
| mem: 4100000955552})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 187486226
| mem: 888810})
({cpu: 4100175265212
| mem: 4100000864518})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 208438582
| mem: 1001594})
({cpu: 4300195205954
| mem: 4300000974510})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 209583269
| mem: 1015770})
({cpu: 4300196350641
| mem: 4300000988686})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 248425580
| mem: 1226698})
({cpu: 5300231219760
| mem: 5300001186638})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 172228760
| mem: 811944})
({cpu: 3500162680962
| mem: 3500000795700})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 185720220
| mem: 883608})
({cpu: 3700175160808
| mem: 3700000864572})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 165359050
| mem: 762766})
({cpu: 3500155811252
| mem: 3500000746522})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 208590300
| mem: 1017842})
({cpu: 4300195357672
| mem: 4300000990758})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 181772232
| mem: 861582})
({cpu: 4100169551218
| mem: 4100000837290})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 183648969
| mem: 887610})
({cpu: 3900172439569
| mem: 3900000866110})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 212688840
| mem: 1034214})
({cpu: 4900197144622
| mem: 4900000999410})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 176487250
| mem: 837470})
({cpu: 3700165927838
| mem: 3700000818434})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 196423582
| mem: 941520})
({cpu: 4100184202568
| mem: 4100000917228})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 193314074
| mem: 924490})
({cpu: 3900182104674
| mem: 3900000902990})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 205534138
| mem: 992840})
({cpu: 4100193313124
| mem: 4100000968548})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 174383314
| mem: 816474})
({cpu: 3500164835516
| mem: 3500000800230})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 171544008
| mem: 805550})
({cpu: 3500161996210
| mem: 3500000789306})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 175532372
| mem: 824970})
({cpu: 3500165984574
| mem: 3500000808726})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 171066985
| mem: 805342})
({cpu: 3500161519187
| mem: 3500000789098})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 192648930
| mem: 912938})
({cpu: 4100180427916
| mem: 4100000888646})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 184034135
| mem: 869422})
({cpu: 3700173474723
| mem: 3700000850386})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 194780751
| mem: 933912})
({cpu: 4100182559737
| mem: 4100000909620})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 174383314
| mem: 816474})
({cpu: 3500164835516
| mem: 3500000800230})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 167763297
| mem: 792316})
({cpu: 3500158215499
| mem: 3500000776072})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 185882258
| mem: 885306})
({cpu: 3700175322846
| mem: 3700000866270})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 172228684
| mem: 811944})
({cpu: 3500162680886
| mem: 3500000795700})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 172228684
| mem: 811944})
({cpu: 3500162680886
| mem: 3500000795700})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 211560158
| mem: 1026112})
({cpu: 4300198689156
| mem: 4300000999356})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 179459590
| mem: 848156})
({cpu: 3900168250190
| mem: 3900000826656})
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
({cpu: 209395908
| mem: 1020966})
({cpu: 4700194863304
| mem: 4700000988954})
Loading

1 comment on commit 557a2c7

@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: 557a2c7 Previous: 5eda9f0 Ratio
validation-auction_1-1 254.9 μs 176.7 μs 1.44
validation-auction_1-2 910.3 μs 631.2 μs 1.44
validation-auction_1-3 906 μs 626.3 μs 1.45
validation-auction_1-4 329.7 μs 229 μs 1.44
validation-auction_2-1 255.3 μs 177.5 μs 1.44
validation-auction_2-2 908.1 μs 633.2 μs 1.43
validation-auction_2-3 1189 μs 827.1 μs 1.44
validation-auction_2-4 903 μs 626.8 μs 1.44
validation-auction_2-5 330.7 μs 228.5 μs 1.45
validation-crowdfunding-success-1 296.3 μs 206.6 μs 1.43
validation-crowdfunding-success-2 296.1 μs 207 μs 1.43
validation-crowdfunding-success-3 295.9 μs 206.9 μs 1.43
validation-currency-1 356.6 μs 247.4 μs 1.44
validation-future-pay-out-1 355.4 μs 305.1 μs 1.16
validation-future-pay-out-2 764 μs 610.4 μs 1.25
validation-future-pay-out-3 763.2 μs 546.6 μs 1.40
validation-future-pay-out-4 1156 μs 822.1 μs 1.41
validation-future-settle-early-1 358 μs 275.8 μs 1.30
validation-future-settle-early-3 766.1 μs 540 μs 1.42
validation-future-settle-early-4 859.5 μs 611.9 μs 1.40
validation-game-sm-success_1-1 550.6 μs 388.4 μs 1.42
validation-game-sm-success_1-2 284 μs 200.3 μs 1.42
validation-game-sm-success_1-3 907.4 μs 643.4 μs 1.41
validation-game-sm-success_1-4 331.6 μs 236 μs 1.41
validation-game-sm-success_2-1 552.3 μs 436.4 μs 1.27
validation-multisig-sm-3 553 μs 394.3 μs 1.40
validation-multisig-sm-4 556.5 μs 396.2 μs 1.40
validation-multisig-sm-5 792.5 μs 556.8 μs 1.42
validation-multisig-sm-6 556.7 μs 399.6 μs 1.39
validation-multisig-sm-7 545.9 μs 385.8 μs 1.41
validation-multisig-sm-8 554.7 μs 499.4 μs 1.11
validation-stablecoin_2-3 1341 μs 1093 μs 1.23
validation-stablecoin_2-4 296.1 μs 219.6 μs 1.35
validation-token-account-1 244.2 μs 220.5 μs 1.11
validation-decode-auction_2-2 741.1 μs 541 μs 1.37
validation-decode-auction_2-4 576.2 μs 540.9 μs 1.07
validation-decode-auction_2-5 270.6 μs 193.7 μs 1.40
validation-decode-crowdfunding-success-1 327.8 μs 258.6 μs 1.27
validation-decode-crowdfunding-success-3 329.5 μs 242.1 μs 1.36
validation-decode-currency-1 325.2 μs 249.9 μs 1.30
validation-decode-escrow-redeem_1-1 439.2 μs 328.7 μs 1.34
validation-decode-escrow-redeem_1-2 443.5 μs 345.7 μs 1.28
validation-decode-escrow-redeem_2-1 440.1 μs 315.4 μs 1.40
validation-decode-escrow-redeem_2-2 440.4 μs 314.2 μs 1.40
validation-decode-stablecoin_1-4 228.9 μs 160.1 μs 1.43
validation-decode-stablecoin_1-5 1179 μs 847.5 μs 1.39
validation-decode-stablecoin_1-6 225 μs 163.4 μs 1.38
validation-decode-stablecoin_2-1 1182 μs 849.5 μs 1.39
validation-decode-stablecoin_2-2 228.9 μs 173.9 μs 1.32
nofib-clausify/formula3 15750 μs 11270 μs 1.40
nofib-clausify/formula4 35990 μs 26000 μs 1.38
nofib-clausify/formula5 76290 μs 54870 μs 1.39
nofib-knights/4x4 25080 μs 18300 μs 1.37
nofib-knights/6x6 66100 μs 46960 μs 1.41
nofib-knights/8x8 116200 μs 82560 μs 1.41
nofib-primetest/05digits 14560 μs 10410 μs 1.40
nofib-primetest/10digits 23740 μs 20340 μs 1.17
nofib-queens4x4/bm 9591 μs 7215 μs 1.33
marlowe-semantics/0101010001010101010101000100010100000001010000010001000001000101 1318 μs 947.5 μs 1.39
marlowe-semantics/0101020201010201010200010102000201000201010102000102010201010000 427.6 μs 305.9 μs 1.40
marlowe-semantics/0101080808040600020306010000000302050807010208060100070207080202 1081 μs 780.3 μs 1.39
marlowe-semantics/0104010200020000040103020102020004040300030304040400010301040303 998.3 μs 795.7 μs 1.25
marlowe-semantics/dd11ae574eaeab0e9925319768989313a93913fdc347c704ddaa27042757d990 1073 μs 812.8 μs 1.32
marlowe-semantics/e26c1cddba16e05fd10c34cbdb16ea6acdbac7c8323256c31c90c520ee6a1080 522.5 μs 459.2 μs 1.14
marlowe-semantics/e3afd22d01ff12f381cf915fd32358634e6c413f979f2492cf3339319d8cc079 427 μs 309.6 μs 1.38
marlowe-semantics/e9234d2671760874f3f660aae5d3416d18ce6dfd7af4231bdd41b9ec268bc7e1 1362 μs 973.7 μs 1.40
marlowe-semantics/eb4a605ed3a64961e9e66ad9631c2813dadf7131740212762ae4483ec749fe1d 428.4 μs 304.9 μs 1.41
marlowe-semantics/ecb5e8308b57724e0f8533921693f111eba942123cf8660aac2b5bac21ec28f0 933.2 μs 678 μs 1.38
marlowe-semantics/f2a8fd2014922f0d8e01541205d47e9bb2d4e54333bdd408cbe7c47c55e73ae4 1038 μs 762.8 μs 1.36
marlowe-semantics/f339f59bdf92495ed2b14e2e4d3705972b4dda59aa929cffe0f1ff5355db8d79 6517 μs 4767 μs 1.37
marlowe-role-payout/0101000100000101010000010101000100010101000001000001000000010101 273.5 μs 199.6 μs 1.37
marlowe-role-payout/01dcc372ea619cb9f23c45b17b9a0a8a16b7ca0e04093ef8ecce291667a99a4c 229.1 μs 165.5 μs 1.38
marlowe-role-payout/0201020201020000020000010201020001020200000002010200000101010100 261.5 μs 188.6 μs 1.39
marlowe-role-payout/0dbb692d2bf22d25eeceac461cfebf616f54003077a8473abc0457f18e025960 280.3 μs 203.9 μs 1.37
marlowe-role-payout/0f010d040810040b10020e040f0e030b0a0d100f0c080c0c05000d04100c100f 277.8 μs 225.8 μs 1.23
marlowe-role-payout/1138a04a83edc0579053f9ffa9394b41df38230121fbecebee8c039776a88c0c 245.3 μs 173.9 μs 1.41
marlowe-role-payout/121a0a1b12030616111f02121a0e070716090a0e031c071419121f141409031d 237 μs 169.2 μs 1.40
marlowe-role-payout/159e5a1bf16fe984b5569be7011b61b5e98f5d2839ca7e1b34c7f2afc7ffb58e 241.8 μs 175.4 μs 1.38
marlowe-role-payout/195f522b596360690d04586a2563470f2214163435331a6622311f7323433f1c 235.3 μs 171.3 μs 1.37
marlowe-role-payout/1a20b465d48a585ffd622bd8dc26a498a3c12f930ab4feab3a5064cfb3bc536a 261.3 μs 190.6 μs 1.37
marlowe-role-payout/211e1b6c10260c4620074d2e372c260d38643a3d605f63772524034f0a4a7632 250.4 μs 183.2 μs 1.37
marlowe-role-payout/21a1426fb3fb3019d5dc93f210152e90b0a6e740ef509b1cdd423395f010e0ca 263.1 μs 193.6 μs 1.36
marlowe-role-payout/224ce46046fab9a17be4197622825f45cc0c59a6bd1604405148e43768c487ef 245.3 μs 174 μs 1.41
marlowe-role-payout/332c2b1c11383d1b373e1315201f1128010e0e1518332f273f141b23243f2a07 233.3 μs 166.2 μs 1.40
marlowe-role-payout/3565ee025317e065e8555eef288080276716366769aad89e03389f5ec4ce26d7 253 μs 184.3 μs 1.37
marlowe-role-payout/3569299fc986f5354d02e627a9eaa48ab46d5af52722307a0af72bae87e256dc 239.6 μs 171.5 μs 1.40
marlowe-role-payout/36866914aa07cf62ef36cf2cd64c7f240e3371e27bb9fff5464301678e809c40 239.7 μs 171.9 μs 1.39
marlowe-role-payout/371c10d2526fc0f09dbe9ed59e44dcd949270b27dc42035addd7ff9f7e0d05e7 283.4 μs 208.4 μs 1.36
marlowe-role-payout/3897ef714bba3e6821495b706c75f8d64264c3fdaa58a3826c808b5a768c303d 245.7 μs 179.1 μs 1.37
marlowe-role-payout/4121d88f14387d33ac5e1329618068e3848445cdd66b29e5ba382be2e02a174a 278.8 μs 204.4 μs 1.36
marlowe-role-payout/4299c7fcf093a5dbfe114c188e32ca199b571a7c25cb7f766bf49f12dab308be 264.5 μs 189.6 μs 1.40
marlowe-role-payout/452e17d16222a427707fa83f63ffb79f606cc25c755a18b1e3274c964ed5ec99 287.5 μs 211.5 μs 1.36
marlowe-role-payout/46f8d00030436e4da490a86b331fa6c3251425fb8c19556080e124d75bad7bd6 242.8 μs 172.2 μs 1.41
marlowe-role-payout/47364cfaf2c00f7d633283dce6cf84e4fd4e8228c0a0aa50e7c55f35c3ecaa1c 243.1 μs 173.1 μs 1.40
marlowe-role-payout/49b8275d0cb817be40865694ab05e3cfe5fc35fb43b78e7de68c1f3519b536bd 249.8 μs 179 μs 1.40
marlowe-role-payout/4dd7755b6ca1f0c9747c1fc0ee4da799f6f1c07108e980bd9f820911ad711ff2 312.5 μs 230.2 μs 1.36
marlowe-role-payout/4fbcfdb577a56b842d6f6938187a783f71d9da7519353e3da3ef0c564e1eb344 289.6 μs 212.9 μs 1.36
marlowe-role-payout/5a0725d49c733130eda8bc6ed5234f7f6ff8c9dd2d201e8806125e5fbcc081f9 253 μs 182.9 μs 1.38
marlowe-role-payout/5a2aae344e569a2c644dd9fa8c7b1f129850937eb562b7748c275f9e40bed596 242.3 μs 172.6 μs 1.40
marlowe-role-payout/5ade103e9530dd0d572fe1b053ea65ad925c6ebbe321e873ace8b804363fa82c 328.6 μs 240.1 μs 1.37
marlowe-role-payout/5d4c62a0671c65a14f6a15093e3efc4f1816d95a5a58fd92486bedaae8d9526b 277.4 μs 202.3 μs 1.37
marlowe-role-payout/5efe992e306e31cc857c64a62436ad2f9325acc5b4a74a8cebccdfd853ce63d2 251.5 μs 178.4 μs 1.41
marlowe-role-payout/622a7f3bc611b5149253c9189da022a9ff296f60a5b7c172a6dc286faa7284fa 287.6 μs 207.5 μs 1.39
marlowe-role-payout/6621a69217f09d91f42876a9c0cecf79de0e29bdd5b16c82c6c52cf959092ec4 265.8 μs 191.2 μs 1.39
marlowe-role-payout/674b0577409957172ad85223c765d17e94c27714276c49c38dfae0a47a561a1e 233.5 μs 170.2 μs 1.37
marlowe-role-payout/6b7bc2b9002a71b33cfd535d43f26334a283d0b9ad189b7cd74baac232c3b9fc 231.2 μs 166.1 μs 1.39
marlowe-role-payout/6c364699767a84059ffd99cf718562a8c09d96e343f23dc481e8ffda13af424f 243.1 μs 172.3 μs 1.41
marlowe-role-payout/6d66bddb4269bdf77392d3894da5341cf019d39787522af4f83f01285991e93c 242.1 μs 174.9 μs 1.38
marlowe-role-payout/73f044f34a30f26639c58bafe952047f74c7bf1eafebab5aadf5b73cfb9024ed 242.7 μs 173.1 μs 1.40
marlowe-role-payout/7b1dd76edc27f00eb382bf996378155baf74d6a7c6f3d5ec837c39d29784aade 241.6 μs 175.9 μs 1.37
marlowe-role-payout/803eae94d62e2afc0e835c204af8362170301bc329e2d849d5f5a47dddf479ec 269.5 μs 194.5 μs 1.39
marlowe-role-payout/87167fc5469adac97c1be749326fa79a6b7862ce68aa4abcb438e3c034bd0899 282 μs 204.4 μs 1.38
marlowe-role-payout/8c0fa5d9d6724c5c72c67e055d4bfc36a385ded7c3c81c08cdbd8705829af6e6 280.3 μs 205.4 μs 1.36
marlowe-role-payout/962c2c658b19904372984a56409707401e64e9b03c1986647134cfd329ec5139 261.9 μs 188.3 μs 1.39
marlowe-role-payout/996804e90f2c75fe68886fc8511304b8ab9b36785f8858f5cb098e91c159dde9 249 μs 179.6 μs 1.39
marlowe-role-payout/a004a989c005d59043f996500e110fa756ad1b85800b889d5815a0106388e1d7 253.7 μs 186.3 μs 1.36
marlowe-role-payout/a0fba5740174b5cd24036c8b008cb1efde73f1edae097b9325c6117a0ff40d3b 268.2 μs 192.7 μs 1.39
marlowe-role-payout/a1b25347409c3993feca1a60b6fcaf93d1d4bbaae19ab06fdf50cedc26cee68d 231.4 μs 166.8 μs 1.39
marlowe-role-payout/a27524cfad019df45e4e8316f927346d4cc39da6bdd294fb2c33c3f58e6a8994 242.5 μs 172.3 μs 1.41
marlowe-role-payout/ec4712ee820eb959a43ebedfab6735f2325fa52994747526ffd2a4f4f84dd58e 273.6 μs 238.9 μs 1.15
marlowe-role-payout/ee3962fbd7373360f46decef3c9bda536a0b1daf6cda3b8a4bcfd6deeb5b4c53 277.1 μs 201.2 μs 1.38
marlowe-role-payout/f1a1e6a487f91feca5606f72bbb1e948c71abf043c6a0ea83bfea9ec6a0f08d8 243.1 μs 172.4 μs 1.41
marlowe-role-payout/f2932e4ca4bbb94b0a9ffbe95fcb7bd5639d9751d75d56d5e14efa5bbed981df 239.5 μs 171.8 μs 1.39
marlowe-role-payout/f53e8cafe26647ccce51e4c31db13608aea1f39034c0f52dee2e5634ef66e747 261.9 μs 189.5 μs 1.38
marlowe-role-payout/f7275afb60e33a550df13a132102e7e925dd28965a4efbe510a89b077ff9417f 241.6 μs 175.5 μs 1.38
marlowe-role-payout/fc8c5f45ffcdb024c21e0f34b22c23de8045a94d5e1a5bda1555c45ddb059f82 249 μs 183.1 μs 1.36
marlowe-role-payout/ff38b1ec89952d0247630f107a90cbbeb92ecbfcd19b284f60255718e4ec7548 284.3 μs 209.1 μs 1.36

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

CC: @IntersectMBO/plutus-core

Please sign in to comment.