Skip to content

chore(ci): parallelize bench#541

Draft
spiral-ladder wants to merge 1 commit into
masterfrom
bing/parbench
Draft

chore(ci): parallelize bench#541
spiral-ladder wants to merge 1 commit into
masterfrom
bing/parbench

Conversation

@spiral-ladder

@spiral-ladder spiral-ladder commented Jul 15, 2026

Copy link
Copy Markdown
Member

attempt at speeding up ci similar to #539

i kinda thnk splitting up the jobs is useful even as a signal as to which benchmark is slowest, seems like pmt is

@spiral-ladder spiral-ladder self-assigned this Jul 15, 2026
@github-actions github-actions Bot added the CI label Jul 15, 2026
@spiral-ladder spiral-ladder changed the title ci: parallelize bench chore(ci): parallelize bench Jul 15, 2026
- name: Post aggregated comment
uses: actions/github-script@v7
with:
script: |

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

this is really ugly though but reasonably short (~30 LOC)? i dk how i feel about this

@github-actions

Copy link
Copy Markdown
Contributor

Performance Report

Commit: 449e6b5

ssz
…(truncated)…
      575 runs  0.556 s
    ✔ floor - Math.floor (512)                                         2.856033e+9 ops/s   0.3501360 ns/op        -        575 runs  0.553 s
    ✔ floor - << 0 (512)                                               2.854566e+9 ops/s   0.3503160 ns/op        -        572 runs  0.553 s

packages/ssz/test/perf/misc/switch_if_cost.test.ts
  big if vs obj
    ✔ fnIf(0)                                                          6.634727e+8 ops/s    1.507221 ns/op        -        131 runs  0.705 s
    ✔ fnSwitch(0)                                                      4.019501e+8 ops/s    2.487871 ns/op        -         83 runs  0.707 s
    ✔ fnObj(0)                                                         2.857282e+9 ops/s   0.3499830 ns/op        -        576 runs  0.556 s
    ✔ fnArr(0)                                                         2.852994e+9 ops/s   0.3505090 ns/op        -        570 runs  0.557 s
    ✔ fnIf(4)                                                          4.593306e+8 ops/s    2.177081 ns/op        -         94 runs  0.706 s
    ✔ fnSwitch(4)                                                      4.592749e+8 ops/s    2.177345 ns/op        -         94 runs  0.706 s
    ✔ fnObj(4)                                                         2.857069e+9 ops/s   0.3500090 ns/op        -        576 runs  0.553 s
    ✔ fnArr(4)                                                         2.856612e+9 ops/s   0.3500650 ns/op        -        575 runs  0.553 s
    ✔ fnIf(9)                                                          3.216548e+8 ops/s    3.108923 ns/op        -         67 runs  0.712 s
    ✔ fnSwitch(9)                                                      4.592808e+8 ops/s    2.177317 ns/op        -         94 runs  0.708 s
    ✔ fnObj(9)                                                         2.855919e+9 ops/s   0.3501500 ns/op        -        571 runs  0.553 s
    ✔ fnArr(9)                                                         2.856629e+9 ops/s   0.3500630 ns/op        -        575 runs  0.553 s

packages/ssz/test/perf/propertyGet.test.ts
  SSZ get property
    ✔ Container {a,b,vec} - as struct x100000                             28705.11 ops/s    34.83700 us/op        -       7313 runs  0.304 s
    ✔ Container {a,b,vec} - as tree x100000                               1458.621 ops/s    685.5790 us/op        -        292 runs  0.703 s
    ✔ Container {a,vec,b} - as struct x100000                             12824.95 ops/s    77.97300 us/op        -       2781 runs  0.303 s
    ✔ Container {a,vec,b} - as tree x100000                               823.4187 ops/s    1.214449 ms/op        -        168 runs  0.705 s

packages/ssz/test/perf/proxy.test.ts
  Access object properties in generated objects
    ✔ get 2 props x1000000 - rawObject                                    3212.232 ops/s    311.3100 us/op        -        648 runs  0.533 s
    ✔ get 2 props x1000000 - proxy                                        12.52354 ops/s    79.84961 ms/op        -         11 runs   1.44 s
    ✔ get 2 props x1000000 - customObj                                    3211.366 ops/s    311.3940 us/op        -        646 runs  0.532 s

packages/ssz/test/perf/serdes.test.ts
  SSZ (de)serialize
    ✔ Simple object binary -> struct                                       2304147 ops/s    434.0000 ns/op        -     335883 runs  0.391 s
    ✔ Simple object binary -> tree_backed                                  1075269 ops/s    930.0000 ns/op        -     201297 runs  0.360 s
    ✔ Simple object struct -> tree_backed                                 705716.3 ops/s    1.417000 us/op        -     141582 runs  0.347 s
    ✔ Simple object tree_backed -> struct                                 835421.9 ops/s    1.197000 us/op        -     158012 runs  0.364 s
    ✔ Simple object struct -> binary                                       1277139 ops/s    783.0000 ns/op        -     274550 runs  0.491 s
    ✔ Simple object tree_backed -> binary                                 991080.3 ops/s    1.009000 us/op        -     171861 runs  0.356 s
    ✔ aggregationBits binary -> struct                                     2702703 ops/s    370.0000 ns/op        -     477289 runs  0.526 s
    ✔ aggregationBits binary -> tree_backed                               570125.4 ops/s    1.754000 us/op        -     115984 runs  0.345 s
    ✔ aggregationBits struct -> tree_backed                               417885.5 ops/s    2.393000 us/op        -     161229 runs  0.573 s
    ✔ aggregationBits tree_backed -> struct                                1230012 ops/s    813.0000 ns/op        -     207101 runs  0.372 s
    ✔ aggregationBits struct -> binary                                     1779359 ops/s    562.0000 ns/op        -     245806 runs  0.380 s
    ✔ aggregationBits tree_backed -> binary                                1394700 ops/s    717.0000 ns/op        -     296985 runs  0.497 s
    ✔ List(uint8) 100000 binary -> struct                                 1320.249 ops/s    757.4330 us/op        -        361 runs  0.805 s
    ✔ List(uint8) 100000 binary -> tree_backed                            4342.068 ops/s    230.3050 us/op        -       1224 runs  0.554 s
    ✔ List(uint8) 100000 struct -> tree_backed                            618.2048 ops/s    1.617587 ms/op        -        259 runs  0.908 s
    ✔ List(uint8) 100000 tree_backed -> struct                            1172.406 ops/s    852.9470 us/op        -        216 runs  0.704 s
    ✔ List(uint8) 100000 struct -> binary                                 709.1082 ops/s    1.410222 ms/op        -        144 runs  0.705 s
    ✔ List(uint8) 100000 tree_backed -> binary                            4658.703 ops/s    214.6520 us/op        -       3472 runs   1.30 s
    ✔ List(uint64Number) 100000 binary -> struct                          915.6050 ops/s    1.092174 ms/op        -        259 runs  0.805 s
    ✔ List(uint64Number) 100000 binary -> tree_backed                     514.6185 ops/s    1.943187 ms/op        -        135 runs  0.813 s
    ✔ List(uint64Number) 100000 struct -> tree_backed                     265.2723 ops/s    3.769712 ms/op        -        159 runs   1.24 s
    ✔ List(uint64Number) 100000 tree_backed -> struct                     490.0685 ops/s    2.040531 ms/op        -        141 runs  0.808 s
    ✔ List(uint64Number) 100000 struct -> binary                          370.7098 ops/s    2.697528 ms/op        -        186 runs   1.02 s
    ✔ List(uint64Number) 100000 tree_backed -> binary                     468.0375 ops/s    2.136581 ms/op        -         95 runs  0.705 s
    ✔ List(Uint64Bigint) 100000 binary -> struct                          624.4871 ops/s    1.601314 ms/op        -        156 runs  0.808 s
    ✔ List(Uint64Bigint) 100000 binary -> tree_backed                     517.2318 ops/s    1.933369 ms/op        -        135 runs  0.806 s
    ✔ List(Uint64Bigint) 100000 struct -> tree_backed                     286.1707 ops/s    3.494418 ms/op        -         82 runs  0.816 s
    ✔ List(Uint64Bigint) 100000 tree_backed -> struct                     345.6099 ops/s    2.893436 ms/op        -         95 runs  0.820 s
    ✔ List(Uint64Bigint) 100000 struct -> binary                          475.4556 ops/s    2.103246 ms/op        -        262 runs   1.12 s
    ✔ List(Uint64Bigint) 100000 tree_backed -> binary                     1051.283 ops/s    951.2190 us/op        -        285 runs  0.806 s
    ✔ Vector(Root) 100000 binary -> struct                                84.82069 ops/s    11.78958 ms/op        -         45 runs   1.14 s
    ✔ Vector(Root) 100000 binary -> tree_backed                           55.03565 ops/s    18.17004 ms/op        -         19 runs  0.864 s
    ✔ Vector(Root) 100000 struct -> tree_backed                           48.53152 ops/s    20.60516 ms/op        -         47 runs   1.78 s
    ✔ Vector(Root) 100000 tree_backed -> struct                           37.44103 ops/s    26.70867 ms/op        -         10 runs  0.785 s
    ✔ Vector(Root) 100000 struct -> binary                                189.8167 ops/s    5.268241 ms/op        -         59 runs  0.816 s
    ✔ Vector(Root) 100000 tree_backed -> binary                           91.15646 ops/s    10.97015 ms/op        -         20 runs  0.732 s
    ✔ List(Validator) 100000 binary -> struct                             13.93116 ops/s    71.78153 ms/op        -         17 runs   2.00 s
    ✔ List(Validator) 100000 binary -> tree_backed                        5.017168 ops/s    199.3156 ms/op        -         10 runs   2.88 s
    ✔ List(Validator) 100000 struct -> tree_backed                        4.304804 ops/s    232.2986 ms/op        -         10 runs   3.07 s
    ✔ List(Validator) 100000 tree_backed -> struct                        7.269641 ops/s    137.5584 ms/op        -         10 runs   2.07 s
    ✔ List(Validator) 100000 struct -> binary                             22.41058 ops/s    44.62178 ms/op        -         19 runs   1.35 s
    ✔ List(Validator) 100000 tree_backed -> binary                        14.13142 ops/s    70.76428 ms/op        -         11 runs   1.29 s
    ✔ List(Validator-NS) 100000 binary -> struct                          14.65633 ops/s    68.22989 ms/op        -         11 runs   1.39 s
    ✔ List(Validator-NS) 100000 binary -> tree_backed                     10.44271 ops/s    95.76059 ms/op        -         11 runs   1.83 s
    ✔ List(Validator-NS) 100000 struct -> tree_backed                     9.299082 ops/s    107.5375 ms/op        -         10 runs   2.01 s
    ✔ List(Validator-NS) 100000 tree_backed -> struct                     12.07623 ops/s    82.80727 ms/op        -         13 runs   1.90 s
    ✔ List(Validator-NS) 100000 struct -> binary                          88.93563 ops/s    11.24409 ms/op        -         47 runs   1.07 s
    ✔ List(Validator-NS) 100000 tree_backed -> binary                     44.78319 ops/s    22.32981 ms/op        -         22 runs   1.00 s

packages/ssz/test/perf/stateTransitionOps/processAttestations.test.ts
  processAttestations
    ✔ get epochStatuses - MutableVector                                   7969.906 ops/s    125.4720 us/op        -       1564 runs  0.568 s
    ✔ get epochStatuses - ViewDU                                          5747.093 ops/s    174.0010 us/op        -       1152 runs  0.409 s
    ✔ set epochStatuses - ListTreeView                                    547.5783 ops/s    1.826223 ms/op        -        108 runs  0.714 s
    ✔ set epochStatuses - ListTreeView - set()                            2292.926 ops/s    436.1240 us/op        -        462 runs  0.654 s
    ✔ set epochStatuses - ListTreeView - commit()                         1311.697 ops/s    762.3710 us/op        -        110 runs   1.42 s

packages/ssz/test/perf/tree.test.ts
  tree
    ✔ bitstring                                                            2188704 ops/s    456.8914 ns/op        -         10 runs   5.48 s
    ✔ bit mask                                                         1.386413e+8 ops/s    7.212859 ns/op        -         29 runs  0.712 s

packages/ssz/test/perf/uint.test.ts
  Uint64 types
    ✔ struct - increase slot to 1000000                                   2856.629 ops/s    350.0630 us/op        -        575 runs  0.703 s
    ✔ UintNumberType - increase slot to 1000000                           36.24415 ops/s    27.59066 ms/op        -         13 runs  0.886 s
    ✔ UintBigintType - increase slot to 1000000                           6.070058 ops/s    164.7431 ms/op        -         10 runs   2.32 s

packages/ssz/test/perf/uintFromBytes.test.ts
  Uint64 deserialize
    UintNumberType DataView Tree
      ✔ UintBigint8 x 100000 tree_deserialize                               222.7729 ops/s    4.488876 ms/op        -         47 runs  0.714 s
      ✔ UintBigint8 x 100000 tree_serialize                                 800.0403 ops/s    1.249937 ms/op        -        155 runs  0.704 s
      ✔ UintBigint16 x 100000 tree_deserialize                              221.1114 ops/s    4.522607 ms/op        -         46 runs  0.710 s
      ✔ UintBigint16 x 100000 tree_serialize                                777.9740 ops/s    1.285390 ms/op        -        154 runs  0.707 s
      ✔ UintBigint32 x 100000 tree_deserialize                              208.4353 ops/s    4.797652 ms/op        -         64 runs  0.815 s
      ✔ UintBigint32 x 100000 tree_serialize                                618.7066 ops/s    1.616275 ms/op        -        123 runs  0.705 s
      ✔ UintBigint64 x 100000 tree_deserialize                              180.6259 ops/s    5.536304 ms/op        -         37 runs  0.713 s
      ✔ UintBigint64 x 100000 tree_serialize                                605.8319 ops/s    1.650623 ms/op        -        120 runs  0.706 s
    UintNumberType DataView
      ✔ UintBigint8 x 100000 value_deserialize                              2405.477 ops/s    415.7180 us/op        -        485 runs  0.654 s
      ✔ UintBigint8 x 100000 value_serialize                                2315.941 ops/s    431.7900 us/op        -        655 runs  0.762 s
      ✔ UintBigint16 x 100000 value_deserialize                             2055.638 ops/s    486.4670 us/op        -        411 runs  0.693 s
      ✔ UintBigint16 x 100000 value_serialize                               2494.910 ops/s    400.8160 us/op        -        469 runs  0.635 s
      ✔ UintBigint32 x 100000 value_deserialize                             2116.550 ops/s    472.4670 us/op        -        422 runs  0.688 s
      ✔ UintBigint32 x 100000 value_serialize                               2333.031 ops/s    428.6270 us/op        -        632 runs  0.788 s
      ✔ UintBigint64 x 100000 value_deserialize                             1890.059 ops/s    529.0840 us/op        -        380 runs  0.703 s
      ✔ UintBigint64 x 100000 value_serialize                               1852.130 ops/s    539.9190 us/op        -        521 runs  0.804 s
    UintBigintType DataView
      ✔ UintBigint8 x 100000 deserialize                                    501.4630 ops/s    1.994165 ms/op        -        129 runs  0.813 s
      ✔ UintBigint8 x 100000 serialize                                      657.5906 ops/s    1.520703 ms/op        -        135 runs  0.707 s
      ✔ UintBigint16 x 100000 deserialize                                   480.2405 ops/s    2.082290 ms/op        -        124 runs  0.814 s
      ✔ UintBigint16 x 100000 serialize                                     339.4889 ops/s    2.945604 ms/op        -         70 runs  0.724 s
      ✔ UintBigint32 x 100000 deserialize                                   517.7264 ops/s    1.931522 ms/op        -        133 runs  0.808 s
      ✔ UintBigint32 x 100000 serialize                                     377.9864 ops/s    2.645598 ms/op        -         77 runs  0.708 s
      ✔ UintBigint64 x 100000 deserialize                                   487.6312 ops/s    2.050730 ms/op        -        133 runs  0.808 s
      ✔ UintBigint64 x 100000 serialize                                     866.6382 ops/s    1.153884 ms/op        -        478 runs   1.22 s
      ✔ UintBigint128 x 100000 deserialize                                  416.3733 ops/s    2.401691 ms/op        -        112 runs  0.807 s
      ✔ UintBigint128 x 100000 serialize                                    82.32577 ops/s    12.14687 ms/op        -         19 runs  0.735 s
      ✔ UintBigint256 x 100000 deserialize                                  326.5031 ops/s    3.062758 ms/op        -         88 runs  0.814 s
      ✔ UintBigint256 x 100000 serialize                                    26.22282 ops/s    38.13473 ms/op        -         10 runs  0.918 s
    General TypedArray tests
      ✔ Slice from Uint8Array x25000                                        1057.422 ops/s    945.6960 us/op        -        203 runs  0.704 s
      ✔ Slice from ArrayBuffer x25000                                       94.67161 ops/s    10.56283 ms/op        -         46 runs   1.03 s
      ✔ Slice from ArrayBuffer x25000 + new Uint8Array                      60.24643 ops/s    16.59849 ms/op        -         18 runs  0.826 s
      ✔ Copy Uint8Array 100000 iterate                                      1047.904 ops/s    954.2860 us/op        -        459 runs   1.01 s
      ✔ Copy Uint8Array 100000 slice                                        4738.236 ops/s    211.0490 us/op        -       2814 runs   1.19 s
      ✔ Copy Uint8Array 100000 Uint8Array.prototype.slice.call              11145.66 ops/s    89.72100 us/op        -       3182 runs  0.836 s
      ✔ Copy Buffer 100000 Uint8Array.prototype.slice.call                  11205.86 ops/s    89.23900 us/op        -       4651 runs  0.937 s
      ✔ Copy Uint8Array 100000 slice + set                                  5684.434 ops/s    175.9190 us/op        -       2151 runs  0.964 s
      ✔ Copy Uint8Array 100000 subarray + set                               10863.43 ops/s    92.05200 us/op        -       4795 runs  0.831 s
      ✔ Copy Uint8Array 100000 slice arrayBuffer                            11194.45 ops/s    89.33000 us/op        -       3929 runs  0.759 s
      ✔ Uint64 deserialize 100000 - iterate Uint8Array                      762.7346 ops/s    1.311072 ms/op        -        201 runs  0.806 s
      ✔ Uint64 deserialize 100000 - by Uint32A                              760.8173 ops/s    1.314376 ms/op        -        200 runs  0.808 s
      ✔ Uint64 deserialize 100000 - by DataView.getUint32 x2                662.4219 ops/s    1.509612 ms/op        -        178 runs  0.807 s
      ✔ Uint64 deserialize 100000 - by DataView.getBigUint64                254.5907 ops/s    3.927874 ms/op        -         49 runs  0.708 s
      ✔ Uint64 deserialize 100000 - by byte                                 63.30222 ops/s    15.79724 ms/op        -         15 runs  0.750 s


  265 passing
  0 failed
  0 pending
persistent-merkle-tree
> root@ benchmark:files /home/runner/work/ssz/ssz
> NODE_OPTIONS='--max_old_space_size=4096 --loader=ts-node/esm' benchmark --config .benchrc.yaml 'packages/persistent-merkle-tree/test/perf/**/*.test.ts' --skipPostComment

(node:2755) ExperimentalWarning: `--experimental-loader` may be removed in the future; instead use `register()`:
--import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; register("ts-node/esm", pathToFileURL("./"));'
(Use `node --trace-warnings ...` to show where the warning was created)
Connected to historyProvider: S3HistoryProvider, Bucket lodestar-benchmarks
(node:2755) NOTE: The AWS SDK for JavaScript (v2) will enter maintenance mode
on September 8, 2024 and reach end-of-support on September 8, 2025.

Please migrate your code to use AWS SDK for JavaScript (v3).
For more information, check blog post at https://a.co/cUPnyil
(node:2755) [DEP0180] DeprecationWarning: fs.Stats constructor is deprecated.
(Use `node --trace-deprecation ...` to show where the warning was created)
No previous benchmark found for latestCommitInBranch 'master'
Start                rss  0MB             heapTotal  0MB             heapUsed +0.004216MB      external +0.00004MB       arrayBuffers  0MB            
Create validator tree rss +95.584256MB     heapTotal +95.608832MB     heapUsed +41.909232MB     external -0.332797MB      arrayBuffers -0.332797MB     
Calculate tree root  rss +52.297728MB     heapTotal +29.360128MB     heapUsed +14.23756MB      external +1.019392MB      arrayBuffers +1.019392MB     
packages/persistent-merkle-tree/test/perf/gindex.test.ts
  gindices at depth
    ✔ getGindicesAtDepth                                                  316555.9 ops/s    3.159000 us/op        -      75370 runs  0.330 s
    ✔ iterateAtDepth                                                      176740.9 ops/s    5.658000 us/op        -      46341 runs  0.316 s

  gindex bits
    ✔ getGindexBits                                                        2958580 ops/s    338.0000 ns/op        -     408409 runs  0.396 s
    ✔ gindexIterator                                                       1328021 ops/s    753.0000 ns/op        -     245560 runs  0.367 s

packages/persistent-merkle-tree/test/perf/hashComputation.test.ts
  HashComputationLevel
    ✔ HashComputationLevel.push then loop                                 35.83997 ops/s    27.90181 ms/op        -         13 runs  0.870 s
    ✔ HashComputation[] push then loop                                    25.31383 ops/s    39.50410 ms/op        -         15 runs   1.18 s

packages/persistent-merkle-tree/test/perf/hasher.test.ts
  hasher
    hashtree
      ✔ hash 2 32 bytes Uint8Array 500000 times - hashtree                  5.730951 ops/s    174.4911 ms/op        -         10 runs   19.3 s
      ✔ batch hash 16 x 64 Uint8Array 31250 times - hashtree                37.70616 ops/s    26.52087 ms/op        -         10 runs   3.19 s
      ✔ hashTwoObjects 500000 times - hashtree                              5.411389 ops/s    184.7954 ms/op        -         10 runs   20.3 s
      ✔ executeHashComputations - hashtree                                  172.7347 ops/s    5.789224 ms/op        -         19 runs   2.44 s
    as-sha256
      ✔ hash 2 32 bytes Uint8Array 500000 times - as-sha256                 2.549361 ops/s    392.2552 ms/op        -         10 runs   43.2 s
      ✔ batch hash 16 x 64 Uint8Array 31250 times - as-sha256               2.480965 ops/s    403.0690 ms/op        -         10 runs   44.2 s
      ✔ hashTwoObjects 500000 times - as-sha256                             2.560854 ops/s    390.4947 ms/op        -         10 runs   43.0 s
      ✔ executeHashComputations - as-sha256                                 35.74456 ops/s    27.97629 ms/op        -         10 runs   1.35 s
    noble
      ✔ hash 2 32 bytes Uint8Array 500000 times - noble                     1.135907 ops/s    880.3536 ms/op        -          6 runs   61.5 s
      ✔ batch hash 16 x 64 Uint8Array 31250 times - noble                   1.176649 ops/s    849.8713 ms/op        -          7 runs   68.0 s
      ✔ hashTwoObjects 500000 times - noble                                0.8360684 ops/s    1.196074  s/op        -          4 runs   60.1 s
      ✔ executeHashComputations - noble                                     35.91724 ops/s    27.84178 ms/op        -         11 runs   1.45 s

  hashtree
    ✔ getHashComputations                                                 768.8718 ops/s    1.300607 ms/op        -         31 runs   8.10 s
    ✔ executeHashComputations                                             178.9028 ops/s    5.589628 ms/op        -         14 runs   2.38 s
    ✔ get root                                                            78.18043 ops/s    12.79092 ms/op        -         13 runs   1.69 s

packages/persistent-merkle-tree/test/perf/node.test.ts
  HashObject LeafNode
    ✔ getNodeH() x7812.5 avg hindex                                       81900.08 ops/s    12.21000 us/op        -      21210 runs  0.309 s
    ✔ getNodeH() x7812.5 index 0                                          213128.7 ops/s    4.692000 us/op        -      57380 runs  0.316 s
    ✔ getNodeH() x7812.5 index 7                                          213356.1 ops/s    4.687000 us/op        -      57425 runs  0.317 s
    ✔ getNodeH() x7812.5 index 7 with key array                           213356.1 ops/s    4.687000 us/op        -      58030 runs  0.318 s
    ✔ new LeafNode() x7812.5                                              3895.522 ops/s    256.7050 us/op        -        777 runs  0.472 s

  Node batchHash
    ✔ getHashComputations 250000 nodes                                    99.30734 ops/s    10.06975 ms/op        -         10 runs   33.6 s
    ✔ batchHash 250000 nodes                                              18.90772 ops/s    52.88845 ms/op        -         10 runs   12.0 s
    ✔ get root 250000 nodes                                               10.25386 ops/s    97.52426 ms/op        -         10 runs   10.3 s
    ✔ getHashComputations 500000 nodes                                    53.25615 ops/s    18.77717 ms/op        -         10 runs   39.4 s
    ✔ batchHash 500000 nodes                                              7.594753 ops/s    131.6699 ms/op        -         10 runs   16.8 s
    ✔ get root 500000 nodes                                               5.137861 ops/s    194.6335 ms/op        -         10 runs   16.6 s
    ✔ getHashComputations 1000000 nodes                                   25.15026 ops/s    39.76102 ms/op        -         10 runs   45.2 s
    ✔ batchHash 1000000 nodes                                             4.487332 ops/s    222.8496 ms/op        -         10 runs   28.4 s
    ✔ get root 1000000 nodes                                              2.578085 ops/s    387.8848 ms/op        -         10 runs   30.4 s

packages/persistent-merkle-tree/test/perf/proof.test.ts
  Proofs
    ✔ multiproof - depth 15, 1 requested leaves                           169981.3 ops/s    5.883000 us/op        -      65582 runs  0.530 s
    ✔ tree offset multiproof - depth 15, 1 requested leaves               67759.86 ops/s    14.75800 us/op        -      17420 runs  0.308 s
    ✔ compact multiproof - depth 15, 1 requested leaves                   494071.1 ops/s    2.024000 us/op        -      36766 runs  0.313 s
    ✔ multiproof - depth 15, 2 requested leaves                           111495.1 ops/s    8.969000 us/op        -      26186 runs  0.310 s
    ✔ tree offset multiproof - depth 15, 2 requested leaves               56663.64 ops/s    17.64800 us/op        -      15235 runs  0.307 s
    ✔ compact multiproof - depth 15, 2 requested leaves                   490918.0 ops/s    2.037000 us/op        -      26980 runs  0.310 s
    ✔ multiproof - depth 15, 3 requested leaves                           76528.66 ops/s    13.06700 us/op        -      20686 runs  0.308 s
    ✔ tree offset multiproof - depth 15, 3 requested leaves               43353.85 ops/s    23.06600 us/op        -      11503 runs  0.306 s
    ✔ compact multiproof - depth 15, 3 requested leaves                   439560.4 ops/s    2.275000 us/op        -      19430 runs  0.308 s
    ✔ multiproof - depth 15, 4 requested leaves                           57146.12 ops/s    17.49900 us/op        -      15373 runs  0.307 s
    ✔ tree offset multiproof - depth 15, 4 requested leaves               35026.27 ops/s    28.55000 us/op        -       9146 runs  0.305 s
    ✔ compact multiproof - depth 15, 4 requested leaves                   382263.0 ops/s    2.616000 us/op        -      14943 runs  0.306 s

packages/persistent-merkle-tree/test/perf/subtree.test.ts
  packedRootsBytesToLeafNodes
    ✔ packedRootsBytesToLeafNodes bytes 4000 offset 0                     220994.5 ops/s    4.525000 us/op        -      57739 runs  0.319 s
    ✔ packedRootsBytesToLeafNodes bytes 4000 offset 1                     220994.5 ops/s    4.525000 us/op        -      58096 runs  0.319 s
    ✔ packedRootsBytesToLeafNodes bytes 4000 offset 2                     220994.5 ops/s    4.525000 us/op        -      58115 runs  0.319 s
    ✔ packedRootsBytesToLeafNodes bytes 4000 offset 3                     220410.0 ops/s    4.537000 us/op        -      56522 runs  0.318 s

  subtreeFillToContents
    ✔ subtreeFillToContents depth 40 count 250000                         58.04594 ops/s    17.22773 ms/op        -         18 runs  0.917 s

packages/persistent-merkle-tree/test/perf/tree.test.ts
  Track the performance of different Tree methods
    ✔ setRoot - gindexBitstring                                           57.69962 ops/s    17.33114 ms/op        -         13 runs  0.739 s
    ✔ setRoot - gindex                                                    56.56776 ops/s    17.67791 ms/op        -         13 runs  0.743 s
    ✔ getRoot - gindexBitstring                                           600.6958 ops/s    1.664736 ms/op        -        122 runs  0.706 s
    ✔ getRoot - gindex                                                    443.2874 ops/s    2.255873 ms/op        -         91 runs  0.708 s
    ✔ getHashObject then setHashObject                                    46.17726 ops/s    21.65568 ms/op        -         11 runs  0.742 s
    ✔ setNodeWithFn                                                       58.27502 ops/s    17.16001 ms/op        -         13 runs  0.731 s

packages/persistent-merkle-tree/test/perf/tree/depthSmall.test.ts
  Tree opts with low depth
    ✔ getNodeAtDepth depth 0 x100000                                      4667.554 ops/s    214.2450 us/op        -        941 runs  0.432 s
    ✔ setNodeAtDepth depth 0 x100000                                      541.8424 ops/s    1.845555 ms/op        -        162 runs  0.807 s
    ✔ getNodesAtDepth depth 0 x100000                                     3565.164 ops/s    280.4920 us/op        -        719 runs  0.494 s
    ✔ setNodesAtDepth depth 0 x100000                                     1444.050 ops/s    692.4970 us/op        -        431 runs  0.805 s
    ✔ getNodeAtDepth depth 1 x100000                                      3569.325 ops/s    280.1650 us/op        -        717 runs  0.498 s
    ✔ setNodeAtDepth depth 1 x100000                                      156.1996 ops/s    6.402067 ms/op        -         33 runs  0.713 s
    ✔ getNodesAtDepth depth 1 x100000                                     2459.746 ops/s    406.5460 us/op        -        496 runs  0.612 s
    ✔ setNodesAtDepth depth 1 x100000                                     183.9035 ops/s    5.437634 ms/op        -         39 runs  0.716 s
    ✔ getNodeAtDepth depth 2 x100000                                      1607.193 ops/s    622.2030 us/op        -        457 runs  0.805 s
    ✔ setNodeAtDepth depth 2 x100000                                      80.59970 ops/s    12.40699 ms/op        -         19 runs  0.747 s
    ✔ getNodesAtDepth depth 2 x100000                                     60.85120 ops/s    16.43353 ms/op        -         15 runs  0.760 s
    ✔ setNodesAtDepth depth 2 x100000                                     47.41206 ops/s    21.09168 ms/op        -         11 runs  0.741 s

packages/persistent-merkle-tree/test/perf/tree/getNodes.test.ts
  tree / getNodesAtDepth
    ✔ tree.getNodesAtDepth - gindexes                                     227.2788 ops/s    4.399882 ms/op        -         45 runs  0.708 s
    ✔ tree.getNodesAtDepth - push all nodes                               1005.173 ops/s    994.8540 us/op        -        271 runs  0.806 s
    ✔ tree.getNodesAtDepth - navigation                                   6478.950 ops/s    154.3460 us/op        -       1291 runs  0.376 s

packages/persistent-merkle-tree/test/perf/tree/setNodes.test.ts
  tree / setNodes
    ✔ tree.setNodesAtDepth - indexes                                      1559.530 ops/s    641.2190 us/op        -        312 runs  0.703 s

packages/persistent-merkle-tree/test/perf/treeDepth.test.ts
  Tree
    ✔ set at depth 8                                                       1582278 ops/s    632.0000 ns/op        -     281950 runs  0.378 s
    ✔ set at depth 16                                                      1072961 ops/s    932.0000 ns/op        -     218432 runs  0.359 s
    ✔ set at depth 32                                                     632111.3 ops/s    1.582000 us/op        -     143253 runs  0.341 s
    ✔ iterateNodesAtDepth 8 256                                           77399.38 ops/s    12.92000 us/op        -      20830 runs  0.308 s
    ✔ getNodesAtDepth 8 256                                               315357.9 ops/s    3.171000 us/op        -      82461 runs  0.325 s
    ✔ iterateNodesAtDepth 16 65536                                        255.7052 ops/s    3.910753 ms/op        -         50 runs  0.707 s
    ✔ getNodesAtDepth 16 65536                                            1050.062 ops/s    952.3250 us/op        -        207 runs  0.707 s
    ✔ iterateNodesAtDepth 32 250000                                       68.31547 ops/s    14.63797 ms/op        -         15 runs  0.736 s
    ✔ getNodesAtDepth 32 250000                                           281.4865 ops/s    3.552568 ms/op        -         56 runs  0.710 s
    ✔ iterateNodesAtDepth 40 250000                                       68.64518 ops/s    14.56767 ms/op        -         15 runs  0.726 s
    ✔ getNodesAtDepth 40 250000                                           280.4147 ops/s    3.566147 ms/op        -         55 runs  0.708 s

packages/persistent-merkle-tree/test/perf/validators.test.ts
  Track the performance of validators
    ✔ 250000 validators root getter                                       10.07083 ops/s    99.29664 ms/op        -         10 runs   1.68 s
    ✔ 250000 validators batchHash()                                       20.55016 ops/s    48.66143 ms/op        -         11 runs   1.18 s
    ✔ 250000 validators hashComputations                                  104.0522 ops/s    9.610560 ms/op        -         15 runs  0.976 s


  88 passing
  0 failed
  0 pending
as-sha256
> root@ benchmark:files /home/runner/work/ssz/ssz
> NODE_OPTIONS='--max_old_space_size=4096 --loader=ts-node/esm' benchmark --config .benchrc.yaml 'packages/as-sha256/test/perf/**/*.test.ts' --skipPostComment

(node:2738) ExperimentalWarning: `--experimental-loader` may be removed in the future; instead use `register()`:
--import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; register("ts-node/esm", pathToFileURL("./"));'
(Use `node --trace-warnings ...` to show where the warning was created)
Connected to historyProvider: S3HistoryProvider, Bucket lodestar-benchmarks
(node:2738) NOTE: The AWS SDK for JavaScript (v2) will enter maintenance mode
on September 8, 2024 and reach end-of-support on September 8, 2025.

Please migrate your code to use AWS SDK for JavaScript (v3).
For more information, check blog post at https://a.co/cUPnyil
(node:2738) [DEP0180] DeprecationWarning: fs.Stats constructor is deprecated.
(Use `node --trace-deprecation ...` to show where the warning was created)
No previous benchmark found for latestCommitInBranch 'master'
packages/as-sha256/test/perf/index.test.ts
  digestTwoHashObjects vs digest64 vs digest
    ✔ digestTwoHashObjects 50023 times                                    26.66676 ops/s    37.49987 ms/op        -         10 runs  0.878 s
    ✔ digest2Bytes32 50023 times                                          24.40041 ops/s    40.98292 ms/op        -         10 runs  0.946 s
    ✔ digest 50023 times                                                  24.83142 ops/s    40.27156 ms/op        -         10 runs  0.931 s

  digest different Buffers
    ✔ input length 32                                                      1138952 ops/s    878.0000 ns/op        -     266144 runs  0.499 s
    ✔ input length 64                                                     982318.3 ops/s    1.018000 us/op        -     201963 runs  0.374 s
    ✔ input length 128                                                    584112.1 ops/s    1.712000 us/op        -     126570 runs  0.339 s
    ✔ input length 256                                                    394011.0 ops/s    2.538000 us/op        -      99392 runs  0.330 s
    ✔ input length 512                                                    236071.8 ops/s    4.236000 us/op        -      62879 runs  0.321 s
    ✔ input length 1024                                                   123380.6 ops/s    8.105000 us/op        -      33618 runs  0.312 s

  hash - compare to java
    ✔ digest 1000000 times                                                1.644816 ops/s    607.9708 ms/op        -         10 runs   6.76 s

  utils
    ✔ hashObjectToByteArray 50023 times                                   913.1778 ops/s    1.095077 ms/op        -        185 runs  0.704 s
    ✔ byteArrayToHashObject 50023 times                                   833.8142 ops/s    1.199308 ms/op        -        250 runs  0.806 s

packages/as-sha256/test/perf/simd.test.ts
  digest64 vs batchHash4UintArray64s vs digest64HashObjects vs batchHash4HashObjectInputs
    ✔ digest64 200092 times                                               6.230983 ops/s    160.4883 ms/op        -         10 runs   2.28 s
    ✔ hash 200092 times using batchHash4UintArray64s                      6.021812 ops/s    166.0630 ms/op        -         10 runs   2.17 s
    ✔ digest64HashObjects 200092 times                                    6.681544 ops/s    149.6660 ms/op        -         10 runs   2.10 s
    ✔ hash 200092 times using batchHash4HashObjectInputs                  7.219222 ops/s    138.5191 ms/op        -         10 runs   1.98 s


  16 passing
  0 failed
  0 pending

@spiral-ladder
spiral-ladder marked this pull request as ready for review July 15, 2026 19:01
@spiral-ladder
spiral-ladder requested a review from a team as a code owner July 15, 2026 19:01
@spiral-ladder
spiral-ladder marked this pull request as draft July 15, 2026 19:02
@spiral-ladder

Copy link
Copy Markdown
Member Author

the comment is botched, converting back to draft first

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant