Skip to content

Commit

Permalink
[Bench] Fix arbitrary evaluation nonsense (#5867)
Browse files Browse the repository at this point in the history
This unscrews another portion of benchmarks. We still have benchmarks that are screwed up (see [PLT-6541](https://input-output.atlassian.net/browse/PLT-6541)) See [this](#4914 (comment)) comment for an explanation of what went wrong.
  • Loading branch information
effectfully authored Apr 4, 2024
1 parent 4412a30 commit 56d6d7f
Show file tree
Hide file tree
Showing 10 changed files with 128 additions and 92 deletions.
2 changes: 2 additions & 0 deletions plutus-benchmark/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
## Plutus Benchmarks

When implementing evaluation benchmarks, make sure to use 'mkEvalCtx' and 'evaluateCekForBench' to mimic the behavior of the ledger. If you use something else for evaluation, the results are likely not going to be representative of what actually happens in production.

This directory contains four sets of benchmarks:

* `nofib`: Plutus versions of some of Haskell's `nofib` benchmarks from https://github.com/ghc/nofib.
Expand Down
29 changes: 13 additions & 16 deletions plutus-benchmark/cek-calibration/Main.hs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
Expand All @@ -16,13 +17,13 @@ module Main (main) where

import Prelude qualified as Haskell

import PlutusBenchmark.Common (benchTermCek, mkEvalCtx)
import PlutusCore
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults
import PlutusCore.Pretty qualified as PP
import PlutusLedgerApi.Common (EvaluationContext)
import PlutusTx qualified as Tx
import PlutusTx.Prelude as Tx
import UntypedPlutusCore as UPLC
import UntypedPlutusCore.Evaluation.Machine.Cek

import Control.Exception
import Control.Lens
Expand All @@ -32,13 +33,6 @@ import Criterion.Types qualified as C

type PlainTerm = UPLC.Term Name DefaultUni DefaultFun ()


benchCek :: UPLC.Term NamedDeBruijn DefaultUni DefaultFun () -> Benchmarkable
benchCek t = case runExcept @UPLC.FreeVariableError $ runQuoteT $ UPLC.unDeBruijnTerm t of
Left e -> throw e
Right t' -> whnf (unsafeEvaluateCekNoEmit defaultCekParameters) t'


{-# INLINABLE rev #-}
rev :: [()] -> [()]
rev l0 = rev' l0 []
Expand Down Expand Up @@ -74,11 +68,11 @@ mkListTerm n =
let (UPLC.Program _ _ code) = mkListProg n
in code

mkListBM :: Integer -> Benchmark
mkListBM n = bench (Haskell.show n) $ benchCek (mkListTerm n)
mkListBM :: EvaluationContext -> Integer -> Benchmark
mkListBM ctx n = bench (Haskell.show n) $ benchTermCek ctx (mkListTerm n)

mkListBMs :: [Integer] -> Benchmark
mkListBMs ns = bgroup "List" [mkListBM n | n <- ns]
mkListBMs :: EvaluationContext -> [Integer] -> Benchmark
mkListBMs ctx ns = bgroup "List" [mkListBM ctx n | n <- ns]

writePlc :: UPLC.Program NamedDeBruijn DefaultUni DefaultFun () -> Haskell.IO ()
writePlc p =
Expand All @@ -91,10 +85,13 @@ writePlc p =


main1 :: Haskell.IO ()
main1 =
defaultMainWith (defaultConfig { C.csvFile = Just "cek-lists.csv" }) $ [mkListBMs [0,10..1000]]
main1 = do
evalCtx <- evaluate mkEvalCtx
defaultMainWith
(defaultConfig { C.csvFile = Just "cek-lists.csv" })
[mkListBMs evalCtx [0,10..1000]]

main2:: Haskell.IO ()
main2 :: Haskell.IO ()
main2 = writePlc (mkListProg 999)

main :: Haskell.IO ()
Expand Down
61 changes: 53 additions & 8 deletions plutus-benchmark/common/PlutusBenchmark/Common.hs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ViewPatterns #-}

Expand All @@ -11,11 +12,14 @@ module PlutusBenchmark.Common
, toNamedDeBruijnTerm
, compiledCodeToTerm
, haskellValueToTerm
, benchTermCek
, benchProgramCek
, unsafeRunTermCek
, runTermCek
, cekResultMatchesHaskellValue
, mkEvalCtx
, evaluateCekLikeInProd
, evaluateCekForBench
, benchTermCek
, benchTermAgdaCek
, benchProgramAgdaCek
, TestSize (..)
Expand All @@ -29,17 +33,23 @@ where
import Paths_plutus_benchmark as Export
import PlutusBenchmark.ProtocolParameters as PP

import PlutusLedgerApi.Common qualified as LedgerApi

import PlutusTx qualified as Tx

import PlutusCore qualified as PLC
import PlutusCore.Default
import PlutusCore.Evaluation.Machine.ExBudget (ExBudget (..))
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults qualified as PLC
import PlutusCore.Evaluation.Machine.ExMemory (ExCPU (..), ExMemory (..))
import PlutusTx qualified as Tx

import UntypedPlutusCore qualified as UPLC
import UntypedPlutusCore.Evaluation.Machine.Cek as Cek
import UntypedPlutusCore.Evaluation.Machine.Cek qualified as UPLC

import MAlonzo.Code.Evaluator.Term (runUAgda)

import Control.DeepSeq (force)
import Criterion.Main
import Criterion.Types (Config (..))
import Data.ByteString qualified as BS
Expand Down Expand Up @@ -105,12 +115,6 @@ haskellValueToTerm
:: Tx.Lift DefaultUni a => a -> Term
haskellValueToTerm = compiledCodeToTerm . Tx.liftCodeDef


{- | Convert a de-Bruijn-named UPLC term to a CEK Benchmark -}
benchTermCek :: Term -> Benchmarkable
benchTermCek term =
nf unsafeRunTermCek $! term -- Or whnf?

{- | Convert a de-Bruijn-named UPLC term to a CEK Benchmark -}
benchProgramCek :: Program -> Benchmarkable
benchProgramCek (UPLC.Program _ _ term) =
Expand Down Expand Up @@ -156,6 +160,47 @@ cekResultMatchesHaskellValue
cekResultMatchesHaskellValue term matches value =
(unsafeRunTermCek term) `matches` (unsafeRunTermCek $ haskellValueToTerm value)

-- | Create the evaluation context for the benchmarks. This doesn't exactly match how it's done
-- on-chain, but that's okay because the evaluation context is cached by the ledger, so we're
-- deliberately not including it in the benchmarks.
mkEvalCtx :: LedgerApi.EvaluationContext
mkEvalCtx =
case PLC.defaultCostModelParams of
Just p ->
let errOrCtx =
-- The validation benchmarks were all created from PlutusV1 scripts
LedgerApi.mkDynEvaluationContext DefaultFunSemanticsVariant1 p
in case errOrCtx of
Right ec -> ec
Left err -> error $ show err
Nothing -> error "Couldn't get cost model params"

-- | Evaluate a term as it would be evaluated using the on-chain evaluator.
evaluateCekLikeInProd
:: LedgerApi.EvaluationContext
-> UPLC.Term PLC.NamedDeBruijn PLC.DefaultUni PLC.DefaultFun ()
-> Either
(UPLC.CekEvaluationException UPLC.NamedDeBruijn UPLC.DefaultUni UPLC.DefaultFun)
(UPLC.Term UPLC.NamedDeBruijn UPLC.DefaultUni UPLC.DefaultFun ())
evaluateCekLikeInProd evalCtx term = do
let (getRes, _, _) =
let -- The validation benchmarks were all created from PlutusV1 scripts
pv = LedgerApi.ledgerLanguageIntroducedIn LedgerApi.PlutusV1
in LedgerApi.evaluateTerm UPLC.restrictingEnormous pv LedgerApi.Quiet evalCtx term
getRes

-- | Evaluate a term and either throw if evaluation fails or discard the result and return '()'.
-- Useful for benchmarking.
evaluateCekForBench
:: LedgerApi.EvaluationContext
-> UPLC.Term PLC.NamedDeBruijn PLC.DefaultUni PLC.DefaultFun ()
-> ()
evaluateCekForBench evalCtx = either (error . show) (\_ -> ()) . evaluateCekLikeInProd evalCtx

benchTermCek :: LedgerApi.EvaluationContext -> Term -> Benchmarkable
benchTermCek evalCtx term =
let !term' = force term
in whnf (evaluateCekForBench evalCtx) term'

---------------- Run a term or program using the plutus-metatheory CEK evaluator ----------------

Expand Down
25 changes: 16 additions & 9 deletions plutus-benchmark/lists/bench/Bench.hs
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
{-# LANGUAGE BangPatterns #-}

{- | Plutus benchmarks for some simple list algorithms. See README.md for more information. -}

module Main (main) where

import Criterion.Main

import PlutusBenchmark.Common (benchTermCek, getConfig)

import PlutusBenchmark.Common (benchTermCek, getConfig, mkEvalCtx)
import PlutusBenchmark.Lists.Sort qualified as Sort

import PlutusBenchmark.Lists.Sum.Compiled qualified as Sum.Compiled
import PlutusBenchmark.Lists.Sum.HandWritten qualified as Sum.HandWritten
import PlutusLedgerApi.Common (EvaluationContext)

benchmarks :: [Benchmark]
benchmarks =
import Control.DeepSeq
import Control.Exception
import Data.Functor

benchmarks :: EvaluationContext -> [Benchmark]
benchmarks ctx =
[ bgroup "sort"
[ mkBMsForSort "ghcSort" Sort.mkWorstCaseGhcSortTerm
, mkBMsForSort "insertionSort" Sort.mkWorstCaseInsertionSortTerm
Expand All @@ -38,15 +43,17 @@ benchmarks =
]
where
mkBMsForSort name f =
bgroup name $ map (\n -> bench (show n) . benchTermCek . f $ n) sizesForSort
bgroup name $ sizesForSort <&> \n ->
bench (show n) $ benchTermCek ctx (f n)
sizesForSort = [10, 20..500]
mkBMsForSum name f =
bgroup name $ map (\n -> bench (show n) . benchTermCek . f $ [1..n]) sizesForSum
bgroup name $ sizesForSum <&> \n ->
bench (show n) $ benchTermCek ctx (f [1..n])
sizesForSum = [10, 50, 100, 500, 1000, 5000, 10000]

main :: IO ()
main = do
-- Run each benchmark for at least 15 seconds. Change this with -L or --timeout.
config <- getConfig 15.0
defaultMainWith config benchmarks

evalCtx <- evaluate $ force mkEvalCtx
defaultMainWith config $ benchmarks evalCtx
12 changes: 9 additions & 3 deletions plutus-benchmark/nofib/bench/BenchCek.hs
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
{-# LANGUAGE BangPatterns #-}

{- | Plutus benchmarks for the CEK machine based on some nofib examples. -}
module Main where

import PlutusBenchmark.Common (benchTermCek)
import Shared (benchWith)
import Shared (benchTermCek, benchWith, mkEvalCtx)

import Control.DeepSeq (force)
import Control.Exception (evaluate)

main :: IO ()
main = benchWith benchTermCek
main = do
evalCtx <- evaluate $ force mkEvalCtx
benchWith $ benchTermCek evalCtx
12 changes: 8 additions & 4 deletions plutus-benchmark/nofib/bench/Shared.hs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
{- | Shared code for benchmarking Plutus and Haskell versions of the Plutus nofib examples -}
module Shared (benchWith, mkBenchMarks)
where

import PlutusBenchmark.Common (Term, getConfig)
module Shared (
benchWith
, mkBenchMarks
, mkEvalCtx
, benchTermCek
) where

import PlutusBenchmark.Common (Term, benchTermCek, getConfig, mkEvalCtx)

import PlutusBenchmark.NoFib.Clausify qualified as Clausify
import PlutusBenchmark.NoFib.Knights qualified as Knights
Expand Down
20 changes: 13 additions & 7 deletions plutus-benchmark/plutus-benchmark.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,12 @@ library plutus-benchmark-common
, base >=4.9 && <5
, bytestring
, criterion
, deepseq
, directory
, filepath
, flat ^>=0.6
, plutus-core ^>=1.25
, plutus-ledger-api ^>=1.25
, plutus-metatheory
, plutus-tx ^>=1.25
, tasty
Expand Down Expand Up @@ -141,6 +143,7 @@ benchmark nofib
build-depends:
, base >=4.9 && <5
, criterion >=1.5.9.0
, deepseq
, nofib-internal
, plutus-benchmark-common

Expand Down Expand Up @@ -220,8 +223,10 @@ benchmark lists
build-depends:
, base >=4.9 && <5
, criterion >=1.5.9.0
, deepseq
, lists-internal
, plutus-benchmark-common
, plutus-ledger-api

test-suite plutus-benchmark-lists-tests
import: lang, ghc-version-support
Expand Down Expand Up @@ -262,7 +267,6 @@ benchmark validation
, optparse-applicative
, plutus-benchmark-common
, plutus-core ^>=1.25
, plutus-ledger-api ^>=1.25

---------------- validation-decode ----------------

Expand Down Expand Up @@ -319,13 +323,16 @@ benchmark cek-calibration
main-is: Main.hs
hs-source-dirs: cek-calibration
build-depends:
, base >=4.9 && <5
, criterion >=1.5.9.0
, base >=4.9 && <5
, criterion >=1.5.9.0
, deepseq
, lens
, mtl
, plutus-core ^>=1.25
, plutus-tx ^>=1.25
, plutus-tx-plugin ^>=1.25
, plutus-benchmark-common
, plutus-core ^>=1.25
, plutus-ledger-api ^>=1.25
, plutus-tx ^>=1.25
, plutus-tx-plugin ^>=1.25

---------------- Signature verification throughput ----------------

Expand Down Expand Up @@ -567,7 +574,6 @@ benchmark validation-agda-cek
, optparse-applicative
, plutus-benchmark-common
, plutus-core ^>=1.25
, plutus-ledger-api ^>=1.25

benchmark nofib-agda-cek
import: lang, ghc-version-support
Expand Down
12 changes: 2 additions & 10 deletions plutus-benchmark/validation/bench/BenchCek.hs
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
{- | Validation benchmarks for the CEK machine. -}

{-# LANGUAGE BangPatterns #-}
module Main where

import Common (benchWith, evaluateCekLikeInProd, mkEvalCtx, unsafeUnflat)
import Common (benchTermCek, benchWith, mkEvalCtx, unsafeUnflat)
import Control.DeepSeq (force)
import Control.Exception (evaluate)
import PlutusBenchmark.Common (toNamedDeBruijnTerm)
import UntypedPlutusCore as UPLC

import Criterion (whnf)

{-|
Benchmarks only for the CEK execution time of the data/*.flat validation scripts
Expand All @@ -23,9 +19,5 @@ main :: IO ()
main = do
evalCtx <- evaluate $ force mkEvalCtx
let mkCekBM file program =
-- don't count the undebruijn . unflat cost
-- `force` to try to ensure that deserialiation is not included in benchmarking time.
let !benchTerm = force . toNamedDeBruijnTerm . UPLC._progTerm $ unsafeUnflat file program
eval = either (error . show) (\_ -> ()) . evaluateCekLikeInProd evalCtx
in whnf eval benchTerm
benchTermCek evalCtx . toNamedDeBruijnTerm . UPLC._progTerm $ unsafeUnflat file program
benchWith mkCekBM
Loading

1 comment on commit 56d6d7f

@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: 56d6d7f Previous: 4412a30 Ratio
validation-stablecoin_1-4 201.8 μs 192 μs 1.05
validation-stablecoin_2-4 202.5 μs 192.8 μs 1.05
nofib-clausify/formula1 3939 μs 3749 μs 1.05
nofib-clausify/formula3 14140 μs 13430 μs 1.05
nofib-clausify/formula4 29480 μs 27710 μs 1.06
nofib-clausify/formula5 68370 μs 64790.00000000001 μs 1.06
nofib-knights/4x4 18980 μs 17930 μs 1.06
nofib-knights/6x6 50000 μs 46440 μs 1.08
nofib-knights/8x8 87960 μs 81150 μs 1.08
nofib-primetest/05digits 10110 μs 8824 μs 1.15
nofib-primetest/08digits 16290 μs 14150 μs 1.15
nofib-primetest/10digits 19530 μs 17090 μs 1.14
nofib-primetest/20digits 38500 μs 34080 μs 1.13
nofib-primetest/30digits 59050 μs 51750 μs 1.14
nofib-primetest/40digits 79570 μs 70270 μs 1.13
nofib-primetest/50digits 97280 μs 85740 μs 1.13
nofib-queens4x4/bt 5852 μs 5467 μs 1.07
nofib-queens4x4/bm 7553 μs 7176 μs 1.05
nofib-queens4x4/bjbt1 7184 μs 6749 μs 1.06
nofib-queens4x4/bjbt2 6678 μs 6259 μs 1.07
nofib-queens4x4/fc 15490 μs 14730 μs 1.05
nofib-queens5x5/bt 78440 μs 73120 μs 1.07
nofib-queens5x5/bjbt1 92030 μs 86320 μs 1.07
nofib-queens5x5/bjbt2 89030 μs 83260 μs 1.07
nofib-queens5x5/fc 196100 μs 186400 μs 1.05
marlowe-semantics/ffdd68a33afd86f8844c9f5e45b2bda5b035aa02274161b23d57709c0f8b8de6 1114 μs 879.6 μs 1.27
marlowe-semantics/f2a8fd2014922f0d8e01541205d47e9bb2d4e54333bdd408cbe7c47c55e73ae4 905.1 μs 659.7 μs 1.37
marlowe-semantics/ecb5e8308b57724e0f8533921693f111eba942123cf8660aac2b5bac21ec28f0 792 μs 603.5 μs 1.31
marlowe-semantics/eb4a605ed3a64961e9e66ad9631c2813dadf7131740212762ae4483ec749fe1d 370.1 μs 272 μs 1.36
marlowe-semantics/e9234d2671760874f3f660aae5d3416d18ce6dfd7af4231bdd41b9ec268bc7e1 1077 μs 872.8 μs 1.23
marlowe-semantics/e3afd22d01ff12f381cf915fd32358634e6c413f979f2492cf3339319d8cc079 369.1 μs 276 μs 1.34
marlowe-semantics/e34b48f80d49360e88c612f4016f7d68cb5678dd8cd5ddb981375a028b3a40a5 473.2 μs 358.1 μs 1.32
marlowe-semantics/e26c1cddba16e05fd10c34cbdb16ea6acdbac7c8323256c31c90c520ee6a1080 440.7 μs 346.4 μs 1.27
marlowe-semantics/dd11ae574eaeab0e9925319768989313a93913fdc347c704ddaa27042757d990 896.4 μs 699.7 μs 1.28
marlowe-semantics/dc241ac6ad1e04fb056d555d6a4f2d08a45d054c6f7f34355fcfeefebef479f3 565.4 μs 425.2 μs 1.33
marlowe-semantics/d64607eb8a1448595081547ea8780886fcbd9e06036460eea3705c88ea867e33 370.6 μs 272.3 μs 1.36
marlowe-semantics/d1c03759810747b7cab38c4296593b38567e11195d161b5bb0a2b58f89b2c65a 1213 μs 936.6 μs 1.30
marlowe-semantics/cf542b7df466b228ca2197c2aaa89238a8122f3330fe5b77b3222f570395d9f5 599.7 μs 449.7 μs 1.33
marlowe-semantics/ced1ea04649e093a501e43f8568ac3e6b37cd3eccec8cac9c70a4857b88a5eb8 989.6 μs 775.5 μs 1.28
marlowe-semantics/cdb9d5c233b288a5a9dcfbd8d5c1831a0bb46eec7a26fa31b80ae69d44805efc 1035 μs 811.3 μs 1.28
marlowe-semantics/ccab11ce1a8774135d0e3c9e635631b68af9e276b5dabc66ff669d5650d0be1c 1044 μs 932.6 μs 1.12
marlowe-semantics/c9efcb705ee057791f7c18a1de79c49f6e40ba143ce0579f1602fd780cabf153 966.7 μs 750.8 μs 1.29
marlowe-semantics/c4bb185380df6e9b66fc1ee0564f09a8d1253a51a0c0c7890f2214df9ac19274 889.8 μs 675.1 μs 1.32
marlowe-semantics/bb5345bfbbc460af84e784b900ec270df1948bb1d1e29eacecd022eeb168b315 1137 μs 891.7 μs 1.28
marlowe-semantics/b50170cea48ee84b80558c02b15c6df52faf884e504d2c410ad63ba46d8ca35c 899.8 μs 709.7 μs 1.27
marlowe-semantics/b21a4df3b0266ad3481a26d3e3d848aad2fcde89510b29cccce81971e38e0835 1594 μs 1242 μs 1.28
marlowe-semantics/ad6db94ed69b7161c7604568f44358e1cc11e81fea90e41afebd669e51bb60c8 705.2 μs 539.3 μs 1.31
marlowe-semantics/acce04815e8fd51be93322888250060da173eccf3df3a605bd6bc6a456cde871 356.3 μs 245.1 μs 1.45
marlowe-semantics/acb9c83c2b78dabef8674319ad69ba54912cd9997bdf2d8b2998c6bfeef3b122 776.3 μs 605.1 μs 1.28
marlowe-semantics/a9a853b6d083551f4ed2995551af287880ef42aee239a2d9bc5314d127cce592 620.4 μs 446.7 μs 1.39
marlowe-semantics/a85173a832db3ea944fafc406dfe3fa3235254897d6d1d0e21bc380147687bd5 456.1 μs 330.9 μs 1.38
marlowe-semantics/9fabc4fc3440cdb776b28c9bb1dd49c9a5b1605fe1490aa3f4f64a3fa8881b25 1277 μs 921.7 μs 1.39
marlowe-semantics/96e1a2fa3ceb9a402f2a5841a0b645f87b4e8e75beb636692478ec39f74ee221 371.9 μs 276.2 μs 1.35
marlowe-semantics/8d9ae67656a2911ab15a8e5301c960c69aa2517055197aff6b60a87ff718d66c 432.1 μs 334.5 μs 1.29
marlowe-semantics/8c7fdc3da6822b5112074380003524f50fb3a1ce6db4e501df1086773c6c0201 1359 μs 1067 μs 1.27
marlowe-semantics/82213dfdb6a812b40446438767c61a388d2c0cfd0cbf7fd4a372b0dc59fa17e1 1537 μs 1125 μs 1.37
marlowe-semantics/7cbc5644b745f4ea635aca42cce5e4a4b9d2e61afdb3ac18128e1688c07071ba 561 μs 445.2 μs 1.26
marlowe-semantics/7a758e17486d1a30462c32a5d5309bd1e98322a9dcbe277c143ed3aede9d265f 619.5 μs 448.1 μs 1.38
marlowe-semantics/75a8bb183688bce447e00f435a144c835435e40a5defc6f3b9be68b70b4a3db6 840.7 μs 631 μs 1.33
marlowe-semantics/7529b206a78becb793da74b78c04d9d33a2540a1abd79718e681228f4057403a 950.6 μs 736.8 μs 1.29
marlowe-semantics/74c67f2f182b9a0a66c62b95d6fac5ace3f7e71ea3abfc52ffbe3ecb93436ea2 948.1 μs 730 μs 1.30
marlowe-semantics/71965c9ccae31f1ffc1d85aa20a356d4ed97a420954018d8301ec4f9783be0d7 580.4 μs 434.3 μs 1.34
marlowe-semantics/70f65b21b77ddb451f3df9d9fb403ced3d10e1e953867cc4900cc25e5b9dec47 939.8 μs 708.8 μs 1.33
marlowe-semantics/6d88f7294dd2b5ce02c3dc609bc7715bd508009738401d264bf9b3eb7c6f49c1 593.8 μs 451.7 μs 1.31
marlowe-semantics/67ba5a9a0245ee3aff4f34852b9889b8c810fccd3dce2a23910bddd35c503b71 5837 μs 5303 μs 1.10
marlowe-semantics/675d63836cad11b547d1b4cddd498f04c919d4342612accf40913f9ae9419fac 1232 μs 947.5 μs 1.30
marlowe-semantics/66af9e473d75e3f464971f6879cc0f2ef84bafcb38fbfa1dbc31ac2053628a38 1507 μs 1085 μs 1.39
marlowe-semantics/65bc4b69b46d18fdff0fadbf00dd5ec2b3e03805fac9d5fb4ff2d3066e53fc7e 2464 μs 2210 μs 1.11
marlowe-semantics/64c3d5b43f005855ffc4d0950a02fd159aa1575294ea39061b81a194ebb9eaae 793.7 μs 612.2 μs 1.30
marlowe-semantics/5f3d46c57a56cef6764f96c9de9677ac6e494dd7a4e368d1c8dd9c1f7a4309a5 595.7 μs 450.5 μs 1.32
marlowe-semantics/5f306b4b24ff2b39dab6cdc9ac6ca9bb442c1dc6f4e7e412eeb5a3ced42fb642 907.9 μs 696.7 μs 1.30
marlowe-semantics/5f130d19918807b60eab4c03119d67878fb6c6712c28c54f5a25792049294acc 369.8 μs 276.6 μs 1.34
marlowe-semantics/5e2c68ac9f62580d626636679679b97109109df7ac1a8ce86d3e43dfb5e4f6bc 626.5 μs 474.3 μs 1.32
marlowe-semantics/5e274e0f593511543d41570a4b03646c1d7539062b5728182e073e5760561a66 1206 μs 925.8 μs 1.30
marlowe-semantics/5d0a88250f13c49c20e146819357a808911c878a0e0a7d6f7fe1d4a619e06112 1258 μs 926.2 μs 1.36
marlowe-semantics/5abae75af26f45658beccbe48f7c88e74efdfc0b8409ba1e98f95fa5b6caf999 590.4 μs 444.9 μs 1.33
marlowe-semantics/57728d8b19b0e06412786f3dfed9e1894cd0ad1d2bc2bd497ec0ecb68f989d2b 371.3 μs 272 μs 1.37
marlowe-semantics/56333d4e413dbf1a665463bf68067f63c118f38f7539b7ba7167d577c0c8b8ce 919 μs 718.4 μs 1.28
marlowe-semantics/55dfe42688ad683b638df1fa7700219f00f53b335a85a2825502ab1e0687197e 371.3 μs 271.9 μs 1.37
marlowe-semantics/53ed4db7ab33d6f907eec91a861d1188269be5ae1892d07ee71161bfb55a7cb7 457.6 μs 331.1 μs 1.38
marlowe-semantics/52df7c8dfaa5f801cd837faa65f2fd333665fff00a555ce8c55e36ddc003007a 447.1 μs 325.9 μs 1.37
marlowe-semantics/4f9e8d361b85e62db2350dd3ae77463540e7af0d28e1eb68faeecc45f4655f57 474.8 μs 371.1 μs 1.28
marlowe-semantics/4d7adf91bfc93cebe95a7e054ec17cfbb912b32bd8aecb48a228b50e02b055c8 843.6 μs 632.6 μs 1.33
marlowe-semantics/4c3efd13b6c69112a8a888372d56c86e60c232125976f29b1c3e21d9f537845c 1218 μs 938.6 μs 1.30
marlowe-semantics/44a9e339fa25948b48637fe7e10dcfc6d1256319a7b5ce4202cb54dfef8e37e7 370.7 μs 271.7 μs 1.36
marlowe-semantics/3db496e6cd39a8b888a89d0de07dace4397878958cab3b9d9353978b08c36d8a 1002 μs 742.3 μs 1.35
marlowe-semantics/3bb75b2e53eb13f718eacd3263ab4535f9137fabffc9de499a0de7cabb335479 371 μs 271.7 μs 1.37
marlowe-semantics/383683bfcecdab0f4df507f59631c702bd11a81ca3841f47f37633e8aacbb5de 910.2 μs 699.1 μs 1.30
marlowe-semantics/33c3efd79d9234a78262b52bc6bbf8124cb321a467dedb278328215167eca455 746.8 μs 578.5 μs 1.29
marlowe-semantics/331e4a1bb30f28d7073c54f9a13c10ae19e2e396c299a0ce101ee6bf4b2020db 561.9 μs 422.6 μs 1.33
marlowe-semantics/322acde099bc34a929182d5b894214fc87ec88446e2d10625119a9d17fa3ec3d 369.6 μs 276.2 μs 1.34
marlowe-semantics/30aa34dfbe89e0c43f569929a96c0d2b74c321d13fec0375606325eee9a34a6a 1353 μs 1064 μs 1.27
marlowe-semantics/2f58c9d884813042bce9cf7c66048767dff166785e8b5183c8139db2aa7312d1 898.8 μs 707.7 μs 1.27
marlowe-semantics/2cb21612178a2d9336b59d06cbf80488577463d209a453048a66c6eee624a695 946.7 μs 708.2 μs 1.34
marlowe-semantics/28fdce478e179db0e38fb5f3f4105e940ece450b9ce8a0f42a6e313b752e6f2c 1103 μs 818.5 μs 1.35
marlowe-semantics/2797d7ac77c1b6aff8e42cf9a47fa86b1e60f22719a996871ad412cbe4de78b5 1905 μs 1701 μs 1.12
marlowe-semantics/26e24ee631a6d927ea4fb4fac530cfd82ff7636986014de2d2aaa460ddde0bc3 668.8 μs 520.2 μs 1.29
marlowe-semantics/238b21364ab5bdae3ddb514d7001c8feba128b4ddcf426852b441f9a9d02c882 371.2 μs 271.9 μs 1.37
marlowe-semantics/21953bf8798b28df60cb459db24843fb46782b19ba72dc4951941fb4c20d2263 432.2 μs 332.3 μs 1.30
marlowe-semantics/202d273721330b31193405101e0637202e2a0f1140211c3e3f171e26312b0220 5833 μs 5494 μs 1.06
marlowe-semantics/1f0f02191604101e1f201016171604060d010d1d1c150e110a110e1006160a0d 1062 μs 936.5 μs 1.13
marlowe-semantics/1d6e3c137149a440f35e0efc685b16bfb8052ebcf66ec4ad77e51c11501381c7 370.7 μs 276 μs 1.34
marlowe-semantics/1d56060c3b271226064c672a282663643b1b0823471c67737f0b076870331260 928.8 μs 705.1 μs 1.32
marlowe-semantics/1a573aed5c46d637919ccb5548dfc22a55c9fc38298d567d15ee9f2eea69d89e 1056 μs 831.8 μs 1.27
marlowe-semantics/1a2f2540121f09321216090b2b1f211e3f020c2c133a1a3c3f3c232a26153a04 370 μs 276.3 μs 1.34
marlowe-semantics/18cefc240debc0fcab14efdd451adfd02793093efe7bc76d6322aed6ddb582ad 899.6 μs 680.5 μs 1.32
marlowe-semantics/12910f24d994d451ff379b12c9d1ecdb9239c9b87e5d7bea570087ec506935d5 602.8 μs 449.1 μs 1.34
marlowe-semantics/119fbea4164e2bf21d2b53aa6c2c4e79414fe55e4096f5ce2e804735a7fbaf91 914.7 μs 681.4 μs 1.34
marlowe-semantics/0f1d0110001b121d051e15140c0c05141d151c1f1d201c040f10091b020a0e1a 574.1 μs 434 μs 1.32
marlowe-semantics/0be82588e4e4bf2ef428d2f44b7687bbb703031d8de696d90ec789e70d6bc1d8 1613 μs 1253 μs 1.29
marlowe-semantics/0bcfd9487614104ec48de2ea0b2c0979866a95115748c026f9ec129384c262c4 1354 μs 1020 μs 1.33
marlowe-semantics/07070c070510030509010e050d00040907050e0a0d06030f1006030701020607 1210 μs 930.4 μs 1.30
marlowe-semantics/0705030002040601010206030604080208020207000101060706050502040301 1240 μs 869 μs 1.43
marlowe-semantics/0543a00ba1f63076c1db6bf94c6ff13ae7d266dd7544678743890b0e8e1add63 1270 μs 912 μs 1.39
marlowe-semantics/04000f0b04051006000e060f09080d0b090d0104050a0b0f0506070f0a070008 889.6 μs 670.7 μs 1.33
marlowe-semantics/0104010200020000040103020102020004040300030304040400010301040303 934.9 μs 701.7 μs 1.33
marlowe-semantics/0101080808040600020306010000000302050807010208060100070207080202 913.2 μs 705 μs 1.30
marlowe-semantics/0101020201010201010200010102000201000201010102000102010201010000 371.1 μs 271.9 μs 1.36
marlowe-semantics/0101010001010101010101000100010100000001010000010001000001000101 1028 μs 847.6 μs 1.21
marlowe-semantics/004025fd712d6c325ffa12c16d157064192992faf62e0b991d7310a2f91666b8 963.5 μs 726.9 μs 1.33
marlowe-semantics/0003040402030103010203030303000200000104030002040304020400000102 1214 μs 954.1 μs 1.27
marlowe-semantics/0001000101000000010101000001000001010101010100000001000001010000 522.7 μs 411.5 μs 1.27
marlowe-semantics/0000020002010200020101020201000100010001020101020201010000020102 392.8 μs 290.3 μs 1.35
marlowe-role-payout/ff38b1ec89952d0247630f107a90cbbeb92ecbfcd19b284f60255718e4ec7548 248.3 μs 174.2 μs 1.43
marlowe-role-payout/fc8c5f45ffcdb024c21e0f34b22c23de8045a94d5e1a5bda1555c45ddb059f82 220.3 μs 149.3 μs 1.48
marlowe-role-payout/f7275afb60e33a550df13a132102e7e925dd28965a4efbe510a89b077ff9417f 211.3 μs 144.2 μs 1.47
marlowe-role-payout/f53e8cafe26647ccce51e4c31db13608aea1f39034c0f52dee2e5634ef66e747 228 μs 159.2 μs 1.43
marlowe-role-payout/f2932e4ca4bbb94b0a9ffbe95fcb7bd5639d9751d75d56d5e14efa5bbed981df 207.2 μs 141 μs 1.47
marlowe-role-payout/f1a1e6a487f91feca5606f72bbb1e948c71abf043c6a0ea83bfea9ec6a0f08d8 210.4 μs 143.6 μs 1.47
marlowe-role-payout/ee3962fbd7373360f46decef3c9bda536a0b1daf6cda3b8a4bcfd6deeb5b4c53 241.2 μs 167.3 μs 1.44
marlowe-role-payout/ec4712ee820eb959a43ebedfab6735f2325fa52994747526ffd2a4f4f84dd58e 238.5 μs 165.6 μs 1.44
marlowe-role-payout/eabeeae18131af89fa57936c0e9eb8d2c7adba534f7e1a517d75410028fa0d6c 211.8 μs 143.8 μs 1.47
marlowe-role-payout/df487b2fd5c1583fa33644423849bc1ab5f02f37edc0c235f34ef01cb12604f6 218.4 μs 149.8 μs 1.46
marlowe-role-payout/dc45c5f1b700b1334db99f50823321daaef0e6925b9b2fabbc9df7cde65af62e 220 μs 149 μs 1.48
marlowe-role-payout/da353bf9219801fa1bf703fc161497570954e9af7e10ffe95c911a9ef97e77bd 218.7 μs 148.5 μs 1.47
marlowe-role-payout/d6bc8ac4155e22300085784148bbc9d9bbfea896e1009dd396610a90e3943032 240.2 μs 167.3 μs 1.44
marlowe-role-payout/d5cda74eb0947e025e02fb8ed365df39d0a43e4b42cd3573ac2d8fcb29115997 230.8 μs 160.4 μs 1.44
marlowe-role-payout/cc1e82927f6c65b3e912200ae30588793d2066e1d4a6627c21955944ac9bd528 238.5 μs 165.9 μs 1.44
marlowe-role-payout/cb2ab8e22d1f64e8d204dece092e90e9bf1fa8b2a6e9cba5012dbe4978065832 211.6 μs 143.9 μs 1.47
marlowe-role-payout/caa409c40e39aed9b0f59214b4baa178c375526dea6026b4552b88d2cc729716 203.2 μs 135.3 μs 1.50
marlowe-role-payout/c99ecc2146ce2066ba6dffc734923264f8794815acbc2ec74c2c2c42ba272e4d 254.8 μs 183.9 μs 1.39
marlowe-role-payout/c78eeba7681d2ab51b4758efa4c812cc041928837c6e7563d8283cce67ce2e02 226.7 μs 155.7 μs 1.46
marlowe-role-payout/c4d4c88c5fe378a25a034025994a0d0b1642f10c8e6e513f872327fa895bfc7e 225.5 μs 157.3 μs 1.43
marlowe-role-payout/c11490431db3a92efdda70933ba411a0423935e73a75c856e326dbcf6672f3bf 211 μs 144.6 μs 1.46
marlowe-role-payout/bd79f4a84db23b7c4cd219d498bd581e085cbc3437957e74a8862281a700700b 241.9 μs 166.7 μs 1.45
marlowe-role-payout/bd460b7549b70c52e37b312a4242041eac18fe4a266f018bcea0c78a9085a271 239.6 μs 167.7 μs 1.43
marlowe-role-payout/bcdbc576d63b0454100ad06893812edafc2e7e4934fec1b44e2d06eb34f36eb8 211.8 μs 143.6 μs 1.47
marlowe-role-payout/b869f3928200061abb1c3060425b9354b0e08cbf4400b340b8707c14b34317cd 295.5 μs 218 μs 1.36
marlowe-role-payout/b6243a5b4c353ce4852aa41705111d57867d2783eeef76f6d59beb2360da6e90 276.9 μs 200.3 μs 1.38
marlowe-role-payout/b43564af5f13cc5208b92b1ad6d45369446f378d3891e5cb3e353b30d4f3fb10 212.5 μs 143.7 μs 1.48
marlowe-role-payout/af2e072b5adfaa7211e0b341e1f7319c4f4e7364a4247c9247132a927e914753 245.8 μs 170.5 μs 1.44
marlowe-role-payout/a92b4072cb8601fa697e1150c08463b14ffced54eb963df08d322216e27373cb 212.2 μs 143.6 μs 1.48
marlowe-role-payout/a7cb09f417c3f089619fe25b7624392026382b458486129efcff18f8912bf302 210.3 μs 143.5 μs 1.47
marlowe-role-payout/a6f064b83b31032ea7f25921364727224707268e472a569f584cc6b1d8c017e8 212.1 μs 143.2 μs 1.48
marlowe-role-payout/a6664a2d2a82f370a34a36a45234f6b33120a39372331678a3b3690312560ce9 251 μs 181.7 μs 1.38
marlowe-role-payout/a27524cfad019df45e4e8316f927346d4cc39da6bdd294fb2c33c3f58e6a8994 210 μs 143.1 μs 1.47
marlowe-role-payout/a1b25347409c3993feca1a60b6fcaf93d1d4bbaae19ab06fdf50cedc26cee68d 200.8 μs 138.4 μs 1.45
marlowe-role-payout/a0fba5740174b5cd24036c8b008cb1efde73f1edae097b9325c6117a0ff40d3b 232.8 μs 161.7 μs 1.44
marlowe-role-payout/a004a989c005d59043f996500e110fa756ad1b85800b889d5815a0106388e1d7 221.9 μs 153.3 μs 1.45
marlowe-role-payout/996804e90f2c75fe68886fc8511304b8ab9b36785f8858f5cb098e91c159dde9 215.6 μs 148.4 μs 1.45
marlowe-role-payout/962c2c658b19904372984a56409707401e64e9b03c1986647134cfd329ec5139 228.7 μs 156.8 μs 1.46
marlowe-role-payout/8c0fa5d9d6724c5c72c67e055d4bfc36a385ded7c3c81c08cdbd8705829af6e6 246.7 μs 175.4 μs 1.41
marlowe-role-payout/87167fc5469adac97c1be749326fa79a6b7862ce68aa4abcb438e3c034bd0899 247.4 μs 175.2 μs 1.41
marlowe-role-payout/803eae94d62e2afc0e835c204af8362170301bc329e2d849d5f5a47dddf479ec 235.7 μs 166.1 μs 1.42
marlowe-role-payout/7b1dd76edc27f00eb382bf996378155baf74d6a7c6f3d5ec837c39d29784aade 212.2 μs 144.1 μs 1.47
marlowe-role-payout/73f044f34a30f26639c58bafe952047f74c7bf1eafebab5aadf5b73cfb9024ed 210.5 μs 143.3 μs 1.47
marlowe-role-payout/6d66bddb4269bdf77392d3894da5341cf019d39787522af4f83f01285991e93c 212.1 μs 143.5 μs 1.48
marlowe-role-payout/6c364699767a84059ffd99cf718562a8c09d96e343f23dc481e8ffda13af424f 210 μs 143.4 μs 1.46
marlowe-role-payout/6b7bc2b9002a71b33cfd535d43f26334a283d0b9ad189b7cd74baac232c3b9fc 201.6 μs 135.6 μs 1.49
marlowe-role-payout/674b0577409957172ad85223c765d17e94c27714276c49c38dfae0a47a561a1e 204.2 μs 139.6 μs 1.46
marlowe-role-payout/6621a69217f09d91f42876a9c0cecf79de0e29bdd5b16c82c6c52cf959092ec4 232.1 μs 160.5 μs 1.45
marlowe-role-payout/622a7f3bc611b5149253c9189da022a9ff296f60a5b7c172a6dc286faa7284fa 251.3 μs 175.8 μs 1.43
marlowe-role-payout/5efe992e306e31cc857c64a62436ad2f9325acc5b4a74a8cebccdfd853ce63d2 216.6 μs 148.4 μs 1.46
marlowe-role-payout/5d4c62a0671c65a14f6a15093e3efc4f1816d95a5a58fd92486bedaae8d9526b 239.6 μs 170.1 μs 1.41
marlowe-role-payout/5ade103e9530dd0d572fe1b053ea65ad925c6ebbe321e873ace8b804363fa82c 287.3 μs 207.3 μs 1.39
marlowe-role-payout/5a2aae344e569a2c644dd9fa8c7b1f129850937eb562b7748c275f9e40bed596 209.7 μs 142.9 μs 1.47
marlowe-role-payout/5a0725d49c733130eda8bc6ed5234f7f6ff8c9dd2d201e8806125e5fbcc081f9 222.3 μs 152.7 μs 1.46
marlowe-role-payout/4fbcfdb577a56b842d6f6938187a783f71d9da7519353e3da3ef0c564e1eb344 255.2 μs 180.9 μs 1.41
marlowe-role-payout/4dd7755b6ca1f0c9747c1fc0ee4da799f6f1c07108e980bd9f820911ad711ff2 275 μs 194.6 μs 1.41
marlowe-role-payout/49b8275d0cb817be40865694ab05e3cfe5fc35fb43b78e7de68c1f3519b536bd 217.6 μs 149.2 μs 1.46
marlowe-role-payout/47364cfaf2c00f7d633283dce6cf84e4fd4e8228c0a0aa50e7c55f35c3ecaa1c 210.5 μs 143.4 μs 1.47
marlowe-role-payout/46f8d00030436e4da490a86b331fa6c3251425fb8c19556080e124d75bad7bd6 210.6 μs 142.4 μs 1.48
marlowe-role-payout/452e17d16222a427707fa83f63ffb79f606cc25c755a18b1e3274c964ed5ec99 254 μs 175.2 μs 1.45
marlowe-role-payout/4299c7fcf093a5dbfe114c188e32ca199b571a7c25cb7f766bf49f12dab308be 230.4 μs 157.4 μs 1.46
marlowe-role-payout/4121d88f14387d33ac5e1329618068e3848445cdd66b29e5ba382be2e02a174a 245.1 μs 172.1 μs 1.42
marlowe-role-payout/3897ef714bba3e6821495b706c75f8d64264c3fdaa58a3826c808b5a768c303d 214.8 μs 147.2 μs 1.46
marlowe-role-payout/371c10d2526fc0f09dbe9ed59e44dcd949270b27dc42035addd7ff9f7e0d05e7 248.3 μs 174.5 μs 1.42
marlowe-role-payout/36866914aa07cf62ef36cf2cd64c7f240e3371e27bb9fff5464301678e809c40 207.2 μs 140.5 μs 1.47
marlowe-role-payout/3569299fc986f5354d02e627a9eaa48ab46d5af52722307a0af72bae87e256dc 207.6 μs 141.1 μs 1.47
marlowe-role-payout/3565ee025317e065e8555eef288080276716366769aad89e03389f5ec4ce26d7 222.5 μs 153.7 μs 1.45
marlowe-role-payout/332c2b1c11383d1b373e1315201f1128010e0e1518332f273f141b23243f2a07 200.9 μs 139 μs 1.45
marlowe-role-payout/224ce46046fab9a17be4197622825f45cc0c59a6bd1604405148e43768c487ef 210.2 μs 141.7 μs 1.48
marlowe-role-payout/21a1426fb3fb3019d5dc93f210152e90b0a6e740ef509b1cdd423395f010e0ca 231.3 μs 160.4 μs 1.44
marlowe-role-payout/211e1b6c10260c4620074d2e372c260d38643a3d605f63772524034f0a4a7632 219.9 μs 149.7 μs 1.47
marlowe-role-payout/1a20b465d48a585ffd622bd8dc26a498a3c12f930ab4feab3a5064cfb3bc536a 228.8 μs 158.2 μs 1.45
marlowe-role-payout/195f522b596360690d04586a2563470f2214163435331a6622311f7323433f1c 203.4 μs 139.9 μs 1.45
marlowe-role-payout/159e5a1bf16fe984b5569be7011b61b5e98f5d2839ca7e1b34c7f2afc7ffb58e 211.6 μs 143.3 μs 1.48
marlowe-role-payout/121a0a1b12030616111f02121a0e070716090a0e031c071419121f141409031d 207.3 μs 143 μs 1.45
marlowe-role-payout/1138a04a83edc0579053f9ffa9394b41df38230121fbecebee8c039776a88c0c 210 μs 141.8 μs 1.48
marlowe-role-payout/0f010d040810040b10020e040f0e030b0a0d100f0c080c0c05000d04100c100f 242 μs 166.9 μs 1.45
marlowe-role-payout/0e97c9d9417354d9460f2eb35018d3904b7b035af16ab299258adab93be0911a 230.9 μs 157.1 μs 1.47
marlowe-role-payout/0e72f62b0f922e31a2340baccc768104025400cf7fdd7dae62fbba5fc770936d 233.7 μs 162.6 μs 1.44
marlowe-role-payout/0e00171d0f1e1f14070d0a00091f07101808021d081e1b120219081312081e15 209.8 μs 144.5 μs 1.45
marlowe-role-payout/0dbb692d2bf22d25eeceac461cfebf616f54003077a8473abc0457f18e025960 249.7 μs 175.7 μs 1.42
marlowe-role-payout/0d0f01050a0a0a0b0b050d0404090e0d0506000d0a041003040e0f100e0a0408 218.4 μs 151.6 μs 1.44
marlowe-role-payout/0c9d3634aeae7038f839a1262d1a8bc724dc77af9426459417a56ec73240f0e0 218 μs 150.6 μs 1.45
marlowe-role-payout/0bdca1cb8fa7e38e09062557b82490714052e84e2054e913092cd84ac071b961 239.9 μs 170.1 μs 1.41
marlowe-role-payout/07658a6c898ad6d624c37df1e49e909c2e9349ba7f4c0a6be5f166fe239bfcae 202.4 μs 135.9 μs 1.49
marlowe-role-payout/06317060a8e488b1219c9dae427f9ce27918a9e09ee8ac424afa33ca923f7954 219.9 μs 152.5 μs 1.44
marlowe-role-payout/057ebc80922f16a5f4bf13e985bf586b8cff37a2f6fe0f3ce842178c16981027 207.9 μs 140.3 μs 1.48
marlowe-role-payout/04f592afc6e57c633b9c55246e7c82e87258f04e2fb910c37d8e2417e9db46e5 284 μs 206.6 μs 1.37
marlowe-role-payout/041a2c3b111139201a3a2c173c392b170e16370d300f2d28342d0f2f0e182e01 245.4 μs 173.2 μs 1.42
marlowe-role-payout/0405010105020401010304080005050800040301010800080207080704020206 244.7 μs 168.7 μs 1.45
marlowe-role-payout/0403020000030204010000030001000202010101000304030001040404030100 223.6 μs 152.7 μs 1.46
marlowe-role-payout/03d730a62332c51c7b70c16c64da72dd1c3ea36c26b41cd1a1e00d39fda3d6cc 239.2 μs 167.4 μs 1.43
marlowe-role-payout/031d56d71454e2c4216ffaa275c4a8b3eb631109559d0e56f44ea8489f57ba97 254.1 μs 178.1 μs 1.43
marlowe-role-payout/0303020000020001010201060303040208070100050401080304020801030001 209.3 μs 141.6 μs 1.48
marlowe-role-payout/0202010002010100020102020102020001010101020102010001010101000100 211.5 μs 143.8 μs 1.47
marlowe-role-payout/0201020201020000020000010201020001020200000002010200000101010100 227.1 μs 154 μs 1.47
marlowe-role-payout/01dcc372ea619cb9f23c45b17b9a0a8a16b7ca0e04093ef8ecce291667a99a4c 202.5 μs 137.5 μs 1.47
marlowe-role-payout/0101000100000101010000010101000100010101000001000001000000010101 241.3 μs 170.5 μs 1.42
marlowe-role-payout/0100000100010000000001000100010101000101000001000000010000010000 310.7 μs 230.8 μs 1.35
marlowe-role-payout/0004000402010401030101030100040000010104020201030001000204020401 230.5 μs 157.8 μs 1.46

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

CC: @input-output-hk/plutus-core

Please sign in to comment.