Skip to content

Significant performance regressions in the benchmark suite of effectful between 9.4.4 and 9.6.1-alpha1

Steps to reproduce:

  1. git clone https://github.com/haskell-effectful/effectful.git
  2. cd effectful
  3. git checkout ghc-22758
  4. cabal run -w ghc-9.4.4 bench -- --csv 944.csv
  5. cabal run -w ghc-9.6.0.20230111 bench -- --baseline 944.csv

A few benchmarks are faster, but almost everything else is slower.

In particular both the countdown and filesize benchmarks are significantly slower (note that this includes reference implementation and implementation that uses mtl only).

Run from (4) on my machine:
All
  concurrency
    shallow
      unmask 1x
        async (IO):                         OK (0.17s)
          301  ns ±  22 ns, 1.4 KB allocated,   1 B  copied, 7.0 MB peak memory, 19% more than baseline
        async (Eff):                        OK (0.15s)
          526  ns ±  42 ns, 2.2 KB allocated,   2 B  copied, 7.0 MB peak memory,       same as baseline
        Fork (localUnliftIO/withLiftMapIO): OK (0.13s)
          944  ns ±  90 ns, 3.3 KB allocated,   4 B  copied, 7.0 MB peak memory, 19% more than baseline
        Fork (localUnlift/withLiftMap):     OK (0.17s)
          1.21 μs ±  83 ns, 4.3 KB allocated,   6 B  copied, 7.0 MB peak memory, 18% more than baseline
        Fork (localLiftUnliftIO):           OK (0.15s)
          1.09 μs ± 101 ns, 3.7 KB allocated,  52 B  copied, 7.0 MB peak memory, 18% more than baseline
        Fork (localLiftUnlift):             OK (0.23s)
          1.66 μs ±  86 ns, 5.9 KB allocated, 104 B  copied, 7.0 MB peak memory, 30% more than baseline
      unmask 10x
        async (IO):                         OK (0.21s)
          389  ns ±  23 ns, 1.6 KB allocated,   1 B  copied, 7.0 MB peak memory, 23% more than baseline
        async (Eff):                        OK (0.19s)
          685  ns ±  41 ns, 2.7 KB allocated,   3 B  copied, 7.0 MB peak memory, 25% less than baseline
        Fork (localUnliftIO/withLiftMapIO): OK (0.16s)
          1.15 μs ±  87 ns, 3.9 KB allocated,   5 B  copied, 7.0 MB peak memory,       same as baseline
        Fork (localUnlift/withLiftMap):     OK (0.21s)
          1.54 μs ±  99 ns, 5.1 KB allocated,   7 B  copied, 7.0 MB peak memory,       same as baseline
        Fork (localLiftUnliftIO):           OK (0.14s)
          2.08 μs ± 167 ns, 6.1 KB allocated,  55 B  copied, 7.0 MB peak memory, 15% more than baseline
        Fork (localLiftUnlift):             OK (0.23s)
          3.34 μs ± 173 ns,  11 KB allocated, 111 B  copied, 7.0 MB peak memory, 25% more than baseline
      unmask 100x
        async (IO):                         OK (0.22s)
          1.62 μs ±  89 ns,  36 KB allocated,  47 B  copied,  11 MB peak memory, 17% more than baseline
        async (Eff):                        OK (0.17s)
          2.51 μs ± 171 ns,  40 KB allocated,  49 B  copied,  11 MB peak memory, 43% less than baseline
        Fork (localUnliftIO/withLiftMapIO): OK (0.13s)
          3.63 μs ± 344 ns,  41 KB allocated,  49 B  copied,  11 MB peak memory, 29% less than baseline
        Fork (localUnlift/withLiftMap):     OK (0.16s)
          4.71 μs ± 427 ns,  46 KB allocated,  50 B  copied,  11 MB peak memory, 21% less than baseline
        Fork (localLiftUnliftIO):           OK (0.20s)
          11.7 μs ± 687 ns,  63 KB allocated, 100 B  copied,  11 MB peak memory, 13% more than baseline
        Fork (localLiftUnlift):             OK (0.17s)
          20.3 μs ± 1.5 μs,  90 KB allocated, 180 B  copied,  11 MB peak memory, 24% more than baseline
    deep
      unmask 1x
        async (Eff):                        OK (0.21s)
          3.13 μs ± 173 ns,  14 KB allocated,  23 B  copied,  11 MB peak memory,  8% more than baseline
        Fork (localUnliftIO/withLiftMapIO): OK (0.12s)
          3.58 μs ± 333 ns,  15 KB allocated,  26 B  copied,  11 MB peak memory, 16% more than baseline
        Fork (localUnlift/withLiftMap):     OK (0.14s)
          4.13 μs ± 330 ns,  18 KB allocated,  31 B  copied,  11 MB peak memory, 20% more than baseline
        Fork (localLiftUnliftIO):           OK (0.13s)
          3.80 μs ± 339 ns,  16 KB allocated,  77 B  copied,  11 MB peak memory, 19% more than baseline
        Fork (localLiftUnlift):             OK (0.17s)
          4.92 μs ± 366 ns,  21 KB allocated, 136 B  copied,  11 MB peak memory, 26% more than baseline
      unmask 10x
        async (Eff):                        OK (0.22s)
          3.28 μs ± 173 ns,  15 KB allocated,  19 B  copied,  11 MB peak memory,       same as baseline
        Fork (localUnliftIO/withLiftMapIO): OK (0.13s)
          3.79 μs ± 362 ns,  16 KB allocated,  26 B  copied,  11 MB peak memory,       same as baseline
        Fork (localUnlift/withLiftMap):     OK (0.15s)
          4.39 μs ± 337 ns,  19 KB allocated,  32 B  copied,  11 MB peak memory, 12% more than baseline
        Fork (localLiftUnliftIO):           OK (0.16s)
          4.66 μs ± 342 ns,  18 KB allocated,  89 B  copied,  11 MB peak memory, 16% more than baseline
        Fork (localLiftUnlift):             OK (0.11s)
          6.64 μs ± 662 ns,  26 KB allocated, 157 B  copied,  11 MB peak memory, 27% more than baseline
      unmask 100x
        async (Eff):                        OK (0.18s)
          5.08 μs ± 383 ns,  52 KB allocated,  84 B  copied,  11 MB peak memory, 21% less than baseline
        Fork (localUnliftIO/withLiftMapIO): OK (0.21s)
          6.21 μs ± 362 ns,  54 KB allocated,  85 B  copied,  11 MB peak memory, 13% less than baseline
        Fork (localUnlift/withLiftMap):     OK (0.13s)
          7.50 μs ± 694 ns,  59 KB allocated,  87 B  copied,  11 MB peak memory,  9% less than baseline
        Fork (localLiftUnliftIO):           OK (0.13s)
          14.5 μs ± 1.4 μs,  74 KB allocated, 174 B  copied,  11 MB peak memory, 14% more than baseline
        Fork (localLiftUnlift):             OK (0.20s)
          24.2 μs ± 1.6 μs, 104 KB allocated, 340 B  copied,  11 MB peak memory, 28% more than baseline
  unlifting
    reference
      dummy:                                OK (0.24s)
        213  ps ±  10 ps,   0 B  allocated,   0 B  copied,  11 MB peak memory,       same as baseline
      async:                                OK (0.20s)
        359  ns ±  21 ns, 1.6 KB allocated,   1 B  copied,  11 MB peak memory, 16% more than baseline
      concurrently:                         OK (0.26s)
        480  ns ±  21 ns, 2.9 KB allocated,   3 B  copied,  11 MB peak memory, 30% more than baseline
    shallow
      dummy
        noop:                               OK (0.24s)
          54.7 ns ± 4.1 ns, 334 B  allocated,   0 B  copied,  11 MB peak memory,       same as baseline
        seq:                                OK (0.20s)
          88.3 ns ± 5.6 ns, 428 B  allocated,   0 B  copied,  11 MB peak memory, 12% more than baseline
        conc
          Async:                            OK (0.18s)
            158  ns ±  11 ns, 640 B  allocated,   0 B  copied,  11 MB peak memory, 21% more than baseline
          ephemeral/limited:                OK (0.20s)
            178  ns ±  11 ns, 992 B  allocated,   0 B  copied,  11 MB peak memory, 18% more than baseline
          ephemeral/unlimited:              OK (0.19s)
            172  ns ±  13 ns, 940 B  allocated,   0 B  copied,  11 MB peak memory, 17% more than baseline
          persistent/limited:               OK (0.23s)
            208  ns ±  10 ns, 1.0 KB allocated,   0 B  copied,  11 MB peak memory, 32% more than baseline
          persistent/unlimited:             OK (0.23s)
            209  ns ±  12 ns, 1.0 KB allocated,   0 B  copied,  11 MB peak memory, 39% more than baseline
      async
        Async:                              OK (0.17s)
          627  ns ±  42 ns, 2.4 KB allocated,   2 B  copied,  11 MB peak memory, 15% more than baseline
        ephemeral/limited:                  OK (0.23s)
          822  ns ±  44 ns, 2.8 KB allocated,   3 B  copied,  11 MB peak memory, 34% more than baseline
        ephemeral/unlimited:                OK (0.23s)
          842  ns ±  44 ns, 3.0 KB allocated,   3 B  copied,  11 MB peak memory, 28% more than baseline
        persistent/limited:                 OK (0.13s)
          937  ns ±  86 ns, 3.2 KB allocated,  51 B  copied,  11 MB peak memory, 33% more than baseline
        persistent/unlimited:               OK (0.16s)
          1.12 μs ±  87 ns, 3.6 KB allocated, 249 B  copied,  11 MB peak memory, 32% more than baseline
      concurrently
        Async:                              OK (0.21s)
          768  ns ±  47 ns, 4.0 KB allocated,   5 B  copied,  11 MB peak memory, 17% more than baseline
        ephemeral/limited:                  OK (0.14s)
          979  ns ±  84 ns, 4.4 KB allocated,   4 B  copied,  11 MB peak memory, 26% more than baseline
        ephemeral/unlimited:                OK (0.14s)
          1.03 μs ±  84 ns, 4.6 KB allocated,   5 B  copied,  11 MB peak memory, 30% more than baseline
        persistent/limited:                 OK (0.17s)
          1.25 μs ±  91 ns, 5.2 KB allocated, 103 B  copied,  11 MB peak memory, 32% more than baseline
        persistent/unlimited:               OK (0.21s)
          1.56 μs ±  97 ns, 5.8 KB allocated, 469 B  copied,  11 MB peak memory, 34% more than baseline
    deep
      dummy
        noop:                               OK (0.27s)
          1.97 μs ± 106 ns,  10 KB allocated,  12 B  copied,  11 MB peak memory, 10% more than baseline
        seq:                                OK (0.14s)
          2.01 μs ± 166 ns,  10 KB allocated,  12 B  copied,  11 MB peak memory,  9% more than baseline
        conc
          Async:                            OK (0.14s)
            2.05 μs ± 174 ns,  11 KB allocated,   8 B  copied,  11 MB peak memory, 10% more than baseline
          ephemeral/limited:                OK (0.16s)
            2.46 μs ± 195 ns,  13 KB allocated,  16 B  copied,  11 MB peak memory, 14% more than baseline
          ephemeral/unlimited:              OK (0.17s)
            2.49 μs ± 170 ns,  13 KB allocated,  16 B  copied,  11 MB peak memory, 17% more than baseline
          persistent/limited:               OK (0.17s)
            2.45 μs ± 167 ns,  13 KB allocated,  14 B  copied,  11 MB peak memory, 13% more than baseline
          persistent/unlimited:             OK (0.17s)
            2.49 μs ± 216 ns,  13 KB allocated,  15 B  copied,  11 MB peak memory, 16% more than baseline
      async
        Async:                              OK (0.22s)
          3.25 μs ± 165 ns,  14 KB allocated,  32 B  copied,  11 MB peak memory, 14% more than baseline
        ephemeral/limited:                  OK (0.23s)
          3.41 μs ± 211 ns,  15 KB allocated,  23 B  copied,  11 MB peak memory, 15% more than baseline
        ephemeral/unlimited:                OK (0.13s)
          3.78 μs ± 355 ns,  17 KB allocated,  30 B  copied,  11 MB peak memory, 18% more than baseline
        persistent/limited:                 OK (0.12s)
          3.49 μs ± 345 ns,  15 KB allocated,  62 B  copied,  11 MB peak memory, 13% more than baseline
        persistent/unlimited:               OK (0.14s)
          4.08 μs ± 338 ns,  17 KB allocated, 281 B  copied,  11 MB peak memory, 20% more than baseline
      concurrently
        Async:                              OK (0.13s)
          3.79 μs ± 338 ns,  17 KB allocated,  13 B  copied,  11 MB peak memory, 19% more than baseline
        ephemeral/limited:                  OK (0.14s)
          3.98 μs ± 349 ns,  18 KB allocated,  26 B  copied,  11 MB peak memory, 20% more than baseline
        ephemeral/unlimited:                OK (0.15s)
          4.42 μs ± 334 ns,  20 KB allocated,  58 B  copied,  11 MB peak memory, 27% more than baseline
        persistent/limited:                 OK (0.15s)
          4.19 μs ± 384 ns,  19 KB allocated, 116 B  copied,  11 MB peak memory, 18% more than baseline
        persistent/unlimited:               OK (0.17s)
          4.93 μs ± 335 ns,  21 KB allocated, 504 B  copied,  11 MB peak memory, 24% more than baseline
  countdown
    1000
      reference (pure):                     OK (0.21s)
        3.00 μs ± 169 ns,  16 KB allocated,  10 B  copied,  11 MB peak memory,       same as baseline
      reference (ST):                       OK (0.15s)
        18.2 μs ± 1.4 μs,  15 KB allocated,  11 B  copied,  11 MB peak memory,       same as baseline
      effectful (local/static)
        shallow:                            OK (0.23s)
          6.60 μs ± 348 ns,  16 KB allocated,  12 B  copied,  11 MB peak memory,  5% more than baseline
        deep:                               OK (0.13s)
          7.39 μs ± 685 ns,  20 KB allocated,  19 B  copied,  11 MB peak memory,       same as baseline
      effectful (local/static/state)
        shallow:                            OK (0.21s)
          6.17 μs ± 429 ns,  16 KB allocated,  11 B  copied,  11 MB peak memory, 10% more than baseline
        deep:                               OK (0.11s)
          6.91 μs ± 679 ns,  20 KB allocated,  21 B  copied,  11 MB peak memory,       same as baseline
      effectful (local/static/stateM)
        shallow:                            OK (0.19s)
          45.5 μs ± 2.9 μs, 133 KB allocated, 100 B  copied,  11 MB peak memory, 65% more than baseline
        deep:                               OK (0.20s)
          47.8 μs ± 3.1 μs, 137 KB allocated, 159 B  copied,  11 MB peak memory, 70% more than baseline
      effectful (local/dynamic)
        shallow:                            OK (0.19s)
          44.8 μs ± 2.8 μs, 101 KB allocated,  78 B  copied,  11 MB peak memory, 85% more than baseline
        deep:                               OK (0.19s)
          45.2 μs ± 3.0 μs, 105 KB allocated, 129 B  copied,  11 MB peak memory, 79% more than baseline
      effectful (local/dynamic/double)
        shallow:                            OK (0.18s)
          82.5 μs ± 6.3 μs, 234 KB allocated, 193 B  copied,  11 MB peak memory, 89% more than baseline
        deep:                               OK (0.18s)
          84.1 μs ± 5.9 μs, 239 KB allocated, 309 B  copied,  11 MB peak memory, 88% more than baseline
      effectful (shared/static)
        shallow:                            OK (0.14s)
          72.1 μs ± 6.0 μs, 115 KB allocated,  88 B  copied,  11 MB peak memory, 120% more than baseline
        deep:                               OK (0.16s)
          73.5 μs ± 6.8 μs, 119 KB allocated, 141 B  copied,  11 MB peak memory, 113% more than baseline
      effectful (shared/dynamic)
        shallow:                            OK (0.23s)
          109  μs ± 5.4 μs, 177 KB allocated, 139 B  copied,  11 MB peak memory, 134% more than baseline
        deep:                               OK (0.23s)
          111  μs ± 6.9 μs, 182 KB allocated, 226 B  copied,  11 MB peak memory, 134% more than baseline
      effectful (shared/dynamic/double)
        shallow:                            OK (0.16s)
          150  μs ±  12 μs, 310 KB allocated, 236 B  copied,  11 MB peak memory, 131% more than baseline
        deep:                               OK (0.16s)
          150  μs ±  12 μs, 310 KB allocated, 393 B  copied,  11 MB peak memory, 130% more than baseline
      freer-simple
        shallow:                            OK (0.16s)
          75.1 μs ± 5.4 μs, 209 KB allocated, 143 B  copied,  11 MB peak memory, 70% more than baseline
        deep:                               OK (0.15s)
          140  μs ±  11 μs, 1.0 MB allocated, 749 B  copied,  11 MB peak memory, 37% more than baseline
      mtl
        shallow:                            OK (0.23s)
          213  μs ±  12 μs, 477 KB allocated, 333 B  copied,  11 MB peak memory, 201% more than baseline
        deep:                               OK (0.19s)
          1.45 ms ± 106 μs, 3.0 MB allocated, 2.4 KB copied,  11 MB peak memory, 179% more than baseline
      fused-effects
        shallow:                            OK (0.17s)
          312  μs ±  22 μs, 713 KB allocated, 489 B  copied,  11 MB peak memory, 102% more than baseline
        deep:                               OK (0.15s)
          2.31 ms ± 174 μs, 5.2 MB allocated, 4.0 KB copied,  11 MB peak memory, 85% more than baseline
      polysemy
        shallow:                            OK (0.14s)
          511  μs ±  46 μs, 1.4 MB allocated, 1.0 KB copied,  11 MB peak memory, 140% more than baseline
        deep:                               OK (0.23s)
          856  μs ±  50 μs, 3.7 MB allocated, 3.7 KB copied,  11 MB peak memory, 155% more than baseline
    2000
      reference (pure):                     OK (0.27s)
        7.63 μs ± 421 ns,  31 KB allocated,  20 B  copied,  11 MB peak memory,       same as baseline
      reference (ST):                       OK (0.16s)
        36.3 μs ± 2.9 μs,  30 KB allocated,  20 B  copied,  11 MB peak memory,       same as baseline
      effectful (local/static)
        shallow:                            OK (0.23s)
          13.1 μs ± 828 ns,  31 KB allocated,  21 B  copied,  11 MB peak memory,       same as baseline
        deep:                               OK (0.24s)
          13.9 μs ± 662 ns,  35 KB allocated,  38 B  copied,  11 MB peak memory,       same as baseline
      effectful (local/static/state)
        shallow:                            OK (0.21s)
          12.2 μs ± 754 ns,  31 KB allocated,  21 B  copied,  11 MB peak memory,  9% more than baseline
        deep:                               OK (0.23s)
          12.9 μs ± 773 ns,  35 KB allocated,  37 B  copied,  11 MB peak memory,  8% more than baseline
      effectful (local/static/stateM)
        shallow:                            OK (0.20s)
          90.8 μs ± 6.7 μs, 263 KB allocated, 185 B  copied,  11 MB peak memory, 61% more than baseline
        deep:                               OK (0.21s)
          94.9 μs ± 5.5 μs, 266 KB allocated, 293 B  copied,  11 MB peak memory, 61% more than baseline
      effectful (local/dynamic)
        shallow:                            OK (0.19s)
          89.0 μs ± 5.3 μs, 203 KB allocated, 148 B  copied,  11 MB peak memory, 86% more than baseline
        deep:                               OK (0.20s)
          90.3 μs ± 5.8 μs, 208 KB allocated, 244 B  copied,  11 MB peak memory, 83% more than baseline
      effectful (local/dynamic/double)
        shallow:                            OK (0.18s)
          162  μs ±  13 μs, 468 KB allocated, 362 B  copied,  11 MB peak memory, 84% more than baseline
        deep:                               OK (0.18s)
          165  μs ±  11 μs, 468 KB allocated, 577 B  copied,  11 MB peak memory, 87% more than baseline
      effectful (shared/static)
        shallow:                            OK (0.16s)
          145  μs ±  14 μs, 229 KB allocated, 165 B  copied,  11 MB peak memory, 121% more than baseline
        deep:                               OK (0.16s)
          145  μs ±  12 μs, 239 KB allocated, 272 B  copied,  11 MB peak memory, 117% more than baseline
      effectful (shared/dynamic)
        shallow:                            OK (0.23s)
          218  μs ±  11 μs, 354 KB allocated, 262 B  copied,  11 MB peak memory, 138% more than baseline
        deep:                               OK (0.24s)
          220  μs ±  11 μs, 363 KB allocated, 438 B  copied,  11 MB peak memory, 140% more than baseline
      effectful (shared/dynamic/double)
        shallow:                            OK (0.16s)
          298  μs ±  22 μs, 619 KB allocated, 479 B  copied,  11 MB peak memory, 127% more than baseline
        deep:                               OK (0.16s)
          301  μs ±  21 μs, 619 KB allocated, 768 B  copied,  11 MB peak memory, 127% more than baseline
      freer-simple
        shallow:                            OK (0.18s)
          161  μs ±  11 μs, 419 KB allocated, 263 B  copied,  11 MB peak memory, 63% more than baseline
        deep:                               OK (0.17s)
          300  μs ±  22 μs, 2.1 MB allocated, 1.4 KB copied,  11 MB peak memory, 45% more than baseline
      mtl
        shallow:                            OK (0.23s)
          424  μs ±  25 μs, 953 KB allocated, 615 B  copied,  11 MB peak memory, 201% more than baseline
        deep:                               OK (0.19s)
          2.90 ms ± 182 μs, 6.0 MB allocated, 4.5 KB copied,  11 MB peak memory, 175% more than baseline
      fused-effects
        shallow:                            OK (0.17s)
          625  μs ±  48 μs, 1.4 MB allocated, 900 B  copied,  11 MB peak memory, 109% more than baseline
        deep:                               OK (0.30s)
          4.59 ms ± 194 μs,  10 MB allocated, 7.2 KB copied,  12 MB peak memory, 86% more than baseline
      polysemy
        shallow:                            OK (0.14s)
          1.03 ms ±  92 μs, 2.8 MB allocated, 1.9 KB copied,  12 MB peak memory, 140% more than baseline
        deep:                               OK (0.23s)
          1.73 ms ±  87 μs, 7.4 MB allocated, 7.3 KB copied,  12 MB peak memory, 158% more than baseline
    3000
      reference (pure):                     OK (0.21s)
        11.4 μs ± 658 ns,  46 KB allocated,  27 B  copied,  12 MB peak memory,       same as baseline
      reference (ST):                       OK (0.24s)
        54.7 μs ± 2.7 μs,  46 KB allocated,  28 B  copied,  12 MB peak memory,       same as baseline
      effectful (local/static)
        shallow:                            OK (0.18s)
          19.5 μs ± 1.4 μs,  47 KB allocated,  30 B  copied,  12 MB peak memory,       same as baseline
        deep:                               OK (0.18s)
          19.8 μs ± 1.3 μs,  51 KB allocated,  43 B  copied,  13 MB peak memory,       same as baseline
      effectful (local/static/state)
        shallow:                            OK (0.29s)
          16.3 μs ± 728 ns,  47 KB allocated,  30 B  copied,  13 MB peak memory,       same as baseline
        deep:                               OK (0.16s)
          17.2 μs ± 1.3 μs,  51 KB allocated,  43 B  copied,  13 MB peak memory,       same as baseline
      effectful (local/static/stateM)
        shallow:                            OK (0.16s)
          139  μs ±  13 μs, 398 KB allocated, 259 B  copied,  13 MB peak memory, 62% more than baseline
        deep:                               OK (0.16s)
          142  μs ±  13 μs, 398 KB allocated, 432 B  copied,  13 MB peak memory, 63% more than baseline
      effectful (local/dynamic)
        shallow:                            OK (0.15s)
          133  μs ±  12 μs, 303 KB allocated, 207 B  copied,  13 MB peak memory, 81% more than baseline
        deep:                               OK (0.15s)
          135  μs ±  11 μs, 303 KB allocated, 343 B  copied,  13 MB peak memory, 80% more than baseline
      effectful (local/dynamic/double)
        shallow:                            OK (0.14s)
          244  μs ±  21 μs, 701 KB allocated, 504 B  copied,  13 MB peak memory, 81% more than baseline
        deep:                               OK (0.14s)
          248  μs ±  23 μs, 701 KB allocated, 834 B  copied,  13 MB peak memory, 82% more than baseline
      effectful (shared/static)
        shallow:                            OK (0.24s)
          217  μs ±  11 μs, 350 KB allocated, 230 B  copied,  13 MB peak memory, 123% more than baseline
        deep:                               OK (0.24s)
          218  μs ±  11 μs, 350 KB allocated, 380 B  copied,  13 MB peak memory, 117% more than baseline
      effectful (shared/dynamic)
        shallow:                            OK (0.18s)
          328  μs ±  25 μs, 537 KB allocated, 373 B  copied,  13 MB peak memory, 135% more than baseline
        deep:                               OK (0.18s)
          323  μs ±  27 μs, 538 KB allocated, 622 B  copied,  13 MB peak memory, 132% more than baseline
      effectful (shared/dynamic/double)
        shallow:                            OK (0.24s)
          434  μs ±  22 μs, 926 KB allocated, 661 B  copied,  13 MB peak memory, 116% more than baseline
        deep:                               OK (0.24s)
          439  μs ±  23 μs, 939 KB allocated, 1.1 KB copied,  13 MB peak memory, 116% more than baseline
      freer-simple
        shallow:                            OK (0.12s)
          219  μs ±  22 μs, 615 KB allocated, 356 B  copied,  13 MB peak memory, 73% more than baseline
        deep:                               OK (0.23s)
          426  μs ±  25 μs, 3.1 MB allocated, 1.8 KB copied,  13 MB peak memory, 36% more than baseline
      mtl
        shallow:                            OK (0.17s)
          622  μs ±  45 μs, 1.4 MB allocated, 846 B  copied,  13 MB peak memory, 191% more than baseline
        deep:                               OK (0.28s)
          4.22 ms ± 183 μs, 8.9 MB allocated, 6.2 KB copied,  13 MB peak memory, 168% more than baseline
      fused-effects
        shallow:                            OK (0.25s)
          923  μs ±  50 μs, 2.1 MB allocated, 1.2 KB copied,  14 MB peak memory, 94% more than baseline
        deep:                               OK (0.22s)
          6.68 ms ± 356 μs,  16 MB allocated,  10 KB copied,  14 MB peak memory, 74% more than baseline
      polysemy
        shallow:                            OK (0.19s)
          1.48 ms ±  95 μs, 4.2 MB allocated, 2.6 KB copied,  15 MB peak memory, 129% more than baseline
        deep:                               OK (0.17s)
          2.48 ms ± 219 μs,  11 MB allocated, 9.3 KB copied,  15 MB peak memory, 142% more than baseline
  filesize
    1000
      reference:                            OK (0.32s)
        2.43 ms ±  89 μs, 5.7 MB allocated, 687 KB copied,  21 MB peak memory, 87% more than baseline
      effectful
        shallow:                            OK (0.17s)
          2.43 ms ± 190 μs, 5.8 MB allocated, 352 KB copied,  21 MB peak memory, 95% more than baseline
        deep:                               OK (0.17s)
          2.43 ms ± 209 μs, 5.8 MB allocated, 357 KB copied,  21 MB peak memory, 96% more than baseline
      freer-simple
        shallow:                            OK (0.22s)
          3.30 ms ± 290 μs, 8.6 MB allocated, 759 KB copied,  21 MB peak memory, 101% more than baseline
        deep:                               OK (0.23s)
          3.44 ms ± 249 μs,  10 MB allocated, 869 KB copied,  21 MB peak memory, 96% more than baseline
      mtl
        shallow:                            OK (0.22s)
          3.28 ms ± 193 μs, 7.2 MB allocated, 583 KB copied,  21 MB peak memory, 112% more than baseline
        deep:                               OK (0.22s)
          6.87 ms ± 586 μs,  15 MB allocated, 1.3 MB copied,  21 MB peak memory, 126% more than baseline
      fused-effects
        shallow:                            OK (0.18s)
          5.40 ms ± 538 μs,  12 MB allocated, 1.2 MB copied,  21 MB peak memory, 107% more than baseline
        deep:                               OK (0.16s)
          10.1 ms ± 822 μs,  23 MB allocated, 1.3 MB copied,  21 MB peak memory, 87% more than baseline
      polysemy
        shallow:                            OK (0.21s)
          6.51 ms ± 630 μs,  17 MB allocated, 1.6 MB copied,  22 MB peak memory, 71% more than baseline
        deep:                               OK (0.24s)
          7.46 ms ± 378 μs,  22 MB allocated, 2.2 MB copied,  23 MB peak memory, 76% more than baseline
    2000
      reference:                            OK (0.17s)
        5.10 ms ± 348 μs,  11 MB allocated, 2.5 MB copied,  23 MB peak memory, 85% more than baseline
      effectful
        shallow:                            OK (0.33s)
          5.07 ms ± 183 μs,  12 MB allocated, 1.6 MB copied,  23 MB peak memory, 92% more than baseline
        deep:                               OK (0.33s)
          5.07 ms ± 198 μs,  12 MB allocated, 1.6 MB copied,  23 MB peak memory, 93% more than baseline
      freer-simple
        shallow:                            OK (0.22s)
          6.84 ms ± 397 μs,  17 MB allocated, 2.5 MB copied,  24 MB peak memory, 106% more than baseline
        deep:                               OK (0.23s)
          7.15 ms ± 401 μs,  21 MB allocated, 2.6 MB copied,  24 MB peak memory, 99% more than baseline
      mtl
        shallow:                            OK (0.23s)
          6.98 ms ± 371 μs,  14 MB allocated, 2.5 MB copied,  24 MB peak memory, 112% more than baseline
        deep:                               OK (0.22s)
          13.8 ms ± 1.3 ms,  29 MB allocated, 3.2 MB copied,  24 MB peak memory, 119% more than baseline
      fused-effects
        shallow:                            OK (0.17s)
          10.9 ms ± 1.1 ms,  24 MB allocated, 2.9 MB copied,  24 MB peak memory, 99% more than baseline
        deep:                               OK (0.32s)
          20.6 ms ± 1.4 ms,  46 MB allocated, 4.0 MB copied,  24 MB peak memory, 91% more than baseline
      polysemy
        shallow:                            OK (0.21s)
          13.3 ms ± 1.3 ms,  35 MB allocated, 4.2 MB copied,  25 MB peak memory, 68% more than baseline
        deep:                               OK (0.24s)
          15.1 ms ± 956 μs,  44 MB allocated, 4.9 MB copied,  26 MB peak memory, 73% more than baseline
    3000
      reference:                            OK (0.25s)
        7.78 ms ± 655 μs,  17 MB allocated, 3.9 MB copied,  27 MB peak memory, 84% more than baseline
      effectful
        shallow:                            OK (0.25s)
          7.79 ms ± 408 μs,  17 MB allocated, 2.9 MB copied,  27 MB peak memory, 92% more than baseline
        deep:                               OK (0.25s)
          7.84 ms ± 407 μs,  17 MB allocated, 2.9 MB copied,  27 MB peak memory, 94% more than baseline
      freer-simple
        shallow:                            OK (0.33s)
          10.3 ms ± 529 μs,  26 MB allocated, 4.1 MB copied,  28 MB peak memory, 102% more than baseline
        deep:                               OK (0.35s)
          10.8 ms ± 638 μs,  31 MB allocated, 4.1 MB copied,  28 MB peak memory, 100% more than baseline
      mtl
        shallow:                            OK (0.34s)
          10.7 ms ± 695 μs,  22 MB allocated, 4.2 MB copied,  28 MB peak memory, 117% more than baseline
        deep:                               OK (0.15s)
          21.0 ms ± 2.0 ms,  43 MB allocated, 5.3 MB copied,  28 MB peak memory, 131% more than baseline
      fused-effects
        shallow:                            OK (0.26s)
          16.8 ms ± 710 μs,  36 MB allocated, 5.4 MB copied,  28 MB peak memory, 108% more than baseline
        deep:                               OK (0.10s)
          30.8 ms ± 2.7 ms,  68 MB allocated, 4.5 MB copied,  28 MB peak memory, 94% more than baseline
      polysemy
        shallow:                            OK (0.31s)
          20.2 ms ± 942 μs,  52 MB allocated, 7.0 MB copied,  31 MB peak memory, 67% more than baseline
        deep:                               OK (0.35s)
          22.6 ms ± 710 μs,  67 MB allocated, 7.1 MB copied,  31 MB peak memory, 72% more than baseline

All 181 tests passed (35.39s)
Edited by Andrzej Rybczak
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information