Skip to content

Conversation

@wemeetagain
Copy link
Member

Motivation

Description

  • Use snappy-wasm for compressing / uncompressing gossip payloads
  • Add more snappy vs snappyjs vs snappy-wasm benchmarks

TODO

  • deploy this branch on our test fleet - deployed on feat3
  network / gossip / snappy
    compress
      ✔ 100 bytes - compress - snappyjs                                     335566.9 ops/s    2.980032 us/op        -        685 runs   2.54 s
      ✔ 100 bytes - compress - snappy                                       388610.3 ops/s    2.573272 us/op        -        870 runs   2.74 s
      ✔ 100 bytes - compress - snappy-wasm                                  583254.0 ops/s    1.714519 us/op        -        476 runs   1.32 s
      ✔ 100 bytes - compress - snappy-wasm - prealloc                        1586695 ops/s    630.2410 ns/op        -        481 runs  0.804 s
      ✔ 200 bytes - compress - snappyjs                                     298272.8 ops/s    3.352636 us/op        -        213 runs   1.22 s
      ✔ 200 bytes - compress - snappy                                       419528.0 ops/s    2.383631 us/op        -        926 runs   2.71 s
      ✔ 200 bytes - compress - snappy-wasm                                  472468.5 ops/s    2.116543 us/op        -        577 runs   1.72 s
      ✔ 200 bytes - compress - snappy-wasm - prealloc                        1430445 ops/s    699.0830 ns/op        -        868 runs   1.11 s
      ✔ 300 bytes - compress - snappyjs                                     265124.9 ops/s    3.771807 us/op        -        137 runs   1.02 s
      ✔ 300 bytes - compress - snappy                                       361683.9 ops/s    2.764845 us/op        -       1332 runs   4.18 s
      ✔ 300 bytes - compress - snappy-wasm                                  443688.4 ops/s    2.253834 us/op        -        859 runs   2.44 s
      ✔ 300 bytes - compress - snappy-wasm - prealloc                        1213825 ops/s    823.8420 ns/op        -        370 runs  0.807 s
      ✔ 400 bytes - compress - snappyjs                                     262168.5 ops/s    3.814341 us/op        -        358 runs   1.87 s
      ✔ 400 bytes - compress - snappy                                       382494.9 ops/s    2.614414 us/op        -       1562 runs   4.58 s
      ✔ 400 bytes - compress - snappy-wasm                                  406373.2 ops/s    2.460792 us/op        -        797 runs   2.46 s
      ✔ 400 bytes - compress - snappy-wasm - prealloc                        1111715 ops/s    899.5110 ns/op        -        450 runs  0.906 s
      ✔ 500 bytes - compress - snappyjs                                     229213.1 ops/s    4.362753 us/op        -        359 runs   2.07 s
      ✔ 500 bytes - compress - snappy                                       373695.8 ops/s    2.675973 us/op        -       2050 runs   5.99 s
      ✔ 500 bytes - compress - snappy-wasm                                  714917.4 ops/s    1.398763 us/op        -        960 runs   1.84 s
      ✔ 500 bytes - compress - snappy-wasm - prealloc                        1054619 ops/s    948.2100 ns/op        -        427 runs  0.907 s
      ✔ 1000 bytes - compress - snappyjs                                    148702.3 ops/s    6.724847 us/op        -        171 runs   1.65 s
      ✔ 1000 bytes - compress - snappy                                      423688.1 ops/s    2.360227 us/op        -        525 runs   1.74 s
      ✔ 1000 bytes - compress - snappy-wasm                                 524350.6 ops/s    1.907121 us/op        -        273 runs   1.03 s
      ✔ 1000 bytes - compress - snappy-wasm - prealloc                      685191.5 ops/s    1.459446 us/op        -        349 runs   1.01 s
      ✔ 10000 bytes - compress - snappyjs                                   21716.92 ops/s    46.04704 us/op        -         16 runs   1.24 s
      ✔ 10000 bytes - compress - snappy                                     98051.32 ops/s    10.19874 us/op        -        184 runs   2.39 s
      ✔ 10000 bytes - compress - snappy-wasm                                114681.8 ops/s    8.719783 us/op        -         49 runs  0.937 s
      ✔ 10000 bytes - compress - snappy-wasm - prealloc                     111203.6 ops/s    8.992518 us/op        -         49 runs  0.953 s
      ✔ 100000 bytes - compress - snappyjs                                  2947.313 ops/s    339.2921 us/op        -         12 runs   4.74 s
      ✔ 100000 bytes - compress - snappy                                    14963.78 ops/s    66.82801 us/op        -         70 runs   5.19 s
      ✔ 100000 bytes - compress - snappy-wasm                               19868.33 ops/s    50.33136 us/op        -         14 runs   1.21 s
      ✔ 100000 bytes - compress - snappy-wasm - prealloc                    24579.34 ops/s    40.68457 us/op        -         13 runs   1.06 s
    uncompress
      ✔ 100 bytes - uncompress - snappyjs                                   589201.6 ops/s    1.697212 us/op        -        242 runs  0.911 s
      ✔ 100 bytes - uncompress - snappy                                     537424.1 ops/s    1.860728 us/op        -        220 runs  0.910 s
      ✔ 100 bytes - uncompress - snappy-wasm                                634966.2 ops/s    1.574887 us/op        -        194 runs  0.808 s
      ✔ 100 bytes - uncompress - snappy-wasm - prealloc                      1846964 ops/s    541.4290 ns/op        -        559 runs  0.804 s
      ✔ 200 bytes - uncompress - snappyjs                                   395141.8 ops/s    2.530737 us/op        -        281 runs   1.22 s
      ✔ 200 bytes - uncompress - snappy                                     536862.6 ops/s    1.862674 us/op        -        274 runs   1.01 s
      ✔ 200 bytes - uncompress - snappy-wasm                                420251.6 ops/s    2.379527 us/op        -        129 runs  0.810 s
      ✔ 200 bytes - uncompress - snappy-wasm - prealloc                      1746167 ops/s    572.6830 ns/op        -        529 runs  0.804 s
      ✔ 300 bytes - uncompress - snappyjs                                   441676.2 ops/s    2.264102 us/op        -        898 runs   2.53 s
      ✔ 300 bytes - uncompress - snappy                                     551313.2 ops/s    1.813851 us/op        -        336 runs   1.11 s
      ✔ 300 bytes - uncompress - snappy-wasm                                494773.0 ops/s    2.021129 us/op        -        203 runs  0.912 s
      ✔ 300 bytes - uncompress - snappy-wasm - prealloc                      1528680 ops/s    654.1590 ns/op        -        465 runs  0.805 s
      ✔ 400 bytes - uncompress - snappyjs                                   383746.1 ops/s    2.605890 us/op        -        235 runs   1.11 s
      ✔ 400 bytes - uncompress - snappy                                     515986.6 ops/s    1.938035 us/op        -        158 runs  0.809 s
      ✔ 400 bytes - uncompress - snappy-wasm                                392947.8 ops/s    2.544867 us/op        -        322 runs   1.32 s
      ✔ 400 bytes - uncompress - snappy-wasm - prealloc                      1425978 ops/s    701.2730 ns/op        -        721 runs   1.01 s
      ✔ 500 bytes - uncompress - snappyjs                                   330727.5 ops/s    3.023637 us/op        -        173 runs   1.02 s
      ✔ 500 bytes - uncompress - snappy                                     513874.1 ops/s    1.946002 us/op        -        157 runs  0.806 s
      ✔ 500 bytes - uncompress - snappy-wasm                                389263.0 ops/s    2.568957 us/op        -        161 runs  0.914 s
      ✔ 500 bytes - uncompress - snappy-wasm - prealloc                      1330936 ops/s    751.3510 ns/op        -        672 runs   1.01 s
      ✔ 1000 bytes - uncompress - snappyjs                                  241393.9 ops/s    4.142606 us/op        -        126 runs   1.03 s
      ✔ 1000 bytes - uncompress - snappy                                    491119.6 ops/s    2.036164 us/op        -        201 runs  0.911 s
      ✔ 1000 bytes - uncompress - snappy-wasm                               361794.5 ops/s    2.764000 us/op        -        148 runs  0.910 s
      ✔ 1000 bytes - uncompress - snappy-wasm - prealloc                    959026.5 ops/s    1.042724 us/op        -        390 runs  0.909 s
      ✔ 10000 bytes - uncompress - snappyjs                                 40519.03 ops/s    24.67976 us/op        -         16 runs  0.913 s
      ✔ 10000 bytes - uncompress - snappy                                   202537.6 ops/s    4.937355 us/op        -        796 runs   4.43 s
      ✔ 10000 bytes - uncompress - snappy-wasm                              165017.6 ops/s    6.059960 us/op        -         52 runs  0.822 s
      ✔ 10000 bytes - uncompress - snappy-wasm - prealloc                   175061.5 ops/s    5.712277 us/op        -        130 runs   1.25 s
      ✔ 100000 bytes - uncompress - snappyjs                                4030.391 ops/s    248.1149 us/op        -         12 runs   3.71 s
      ✔ 100000 bytes - uncompress - snappy                                  35459.43 ops/s    28.20124 us/op        -         41 runs   1.67 s
      ✔ 100000 bytes - uncompress - snappy-wasm                             22449.16 ops/s    44.54509 us/op        -         13 runs   1.11 s
      ✔ 100000 bytes - uncompress - snappy-wasm - prealloc                  27169.50 ops/s    36.80598 us/op        -         13 runs  0.997 s

Closes #4170

**Motivation**

Benchmarks show `snappy-wasm` is faster at compressing and uncompressing
than `snappyjs`.

**Description**

- Use `snappy-wasm` for compressing / uncompressing gossip payloads
- Add more `snappy` vs `snappyjs` vs `snappy-wasm` benchmarks

**TODO**
- [x] deploy this branch on our test fleet - deployed on feat3

```
  network / gossip / snappy
    compress
      ✔ 100 bytes - compress - snappyjs                                     335566.9 ops/s    2.980032 us/op        -        685 runs   2.54 s
      ✔ 100 bytes - compress - snappy                                       388610.3 ops/s    2.573272 us/op        -        870 runs   2.74 s
      ✔ 100 bytes - compress - snappy-wasm                                  583254.0 ops/s    1.714519 us/op        -        476 runs   1.32 s
      ✔ 100 bytes - compress - snappy-wasm - prealloc                        1586695 ops/s    630.2410 ns/op        -        481 runs  0.804 s
      ✔ 200 bytes - compress - snappyjs                                     298272.8 ops/s    3.352636 us/op        -        213 runs   1.22 s
      ✔ 200 bytes - compress - snappy                                       419528.0 ops/s    2.383631 us/op        -        926 runs   2.71 s
      ✔ 200 bytes - compress - snappy-wasm                                  472468.5 ops/s    2.116543 us/op        -        577 runs   1.72 s
      ✔ 200 bytes - compress - snappy-wasm - prealloc                        1430445 ops/s    699.0830 ns/op        -        868 runs   1.11 s
      ✔ 300 bytes - compress - snappyjs                                     265124.9 ops/s    3.771807 us/op        -        137 runs   1.02 s
      ✔ 300 bytes - compress - snappy                                       361683.9 ops/s    2.764845 us/op        -       1332 runs   4.18 s
      ✔ 300 bytes - compress - snappy-wasm                                  443688.4 ops/s    2.253834 us/op        -        859 runs   2.44 s
      ✔ 300 bytes - compress - snappy-wasm - prealloc                        1213825 ops/s    823.8420 ns/op        -        370 runs  0.807 s
      ✔ 400 bytes - compress - snappyjs                                     262168.5 ops/s    3.814341 us/op        -        358 runs   1.87 s
      ✔ 400 bytes - compress - snappy                                       382494.9 ops/s    2.614414 us/op        -       1562 runs   4.58 s
      ✔ 400 bytes - compress - snappy-wasm                                  406373.2 ops/s    2.460792 us/op        -        797 runs   2.46 s
      ✔ 400 bytes - compress - snappy-wasm - prealloc                        1111715 ops/s    899.5110 ns/op        -        450 runs  0.906 s
      ✔ 500 bytes - compress - snappyjs                                     229213.1 ops/s    4.362753 us/op        -        359 runs   2.07 s
      ✔ 500 bytes - compress - snappy                                       373695.8 ops/s    2.675973 us/op        -       2050 runs   5.99 s
      ✔ 500 bytes - compress - snappy-wasm                                  714917.4 ops/s    1.398763 us/op        -        960 runs   1.84 s
      ✔ 500 bytes - compress - snappy-wasm - prealloc                        1054619 ops/s    948.2100 ns/op        -        427 runs  0.907 s
      ✔ 1000 bytes - compress - snappyjs                                    148702.3 ops/s    6.724847 us/op        -        171 runs   1.65 s
      ✔ 1000 bytes - compress - snappy                                      423688.1 ops/s    2.360227 us/op        -        525 runs   1.74 s
      ✔ 1000 bytes - compress - snappy-wasm                                 524350.6 ops/s    1.907121 us/op        -        273 runs   1.03 s
      ✔ 1000 bytes - compress - snappy-wasm - prealloc                      685191.5 ops/s    1.459446 us/op        -        349 runs   1.01 s
      ✔ 10000 bytes - compress - snappyjs                                   21716.92 ops/s    46.04704 us/op        -         16 runs   1.24 s
      ✔ 10000 bytes - compress - snappy                                     98051.32 ops/s    10.19874 us/op        -        184 runs   2.39 s
      ✔ 10000 bytes - compress - snappy-wasm                                114681.8 ops/s    8.719783 us/op        -         49 runs  0.937 s
      ✔ 10000 bytes - compress - snappy-wasm - prealloc                     111203.6 ops/s    8.992518 us/op        -         49 runs  0.953 s
      ✔ 100000 bytes - compress - snappyjs                                  2947.313 ops/s    339.2921 us/op        -         12 runs   4.74 s
      ✔ 100000 bytes - compress - snappy                                    14963.78 ops/s    66.82801 us/op        -         70 runs   5.19 s
      ✔ 100000 bytes - compress - snappy-wasm                               19868.33 ops/s    50.33136 us/op        -         14 runs   1.21 s
      ✔ 100000 bytes - compress - snappy-wasm - prealloc                    24579.34 ops/s    40.68457 us/op        -         13 runs   1.06 s
    uncompress
      ✔ 100 bytes - uncompress - snappyjs                                   589201.6 ops/s    1.697212 us/op        -        242 runs  0.911 s
      ✔ 100 bytes - uncompress - snappy                                     537424.1 ops/s    1.860728 us/op        -        220 runs  0.910 s
      ✔ 100 bytes - uncompress - snappy-wasm                                634966.2 ops/s    1.574887 us/op        -        194 runs  0.808 s
      ✔ 100 bytes - uncompress - snappy-wasm - prealloc                      1846964 ops/s    541.4290 ns/op        -        559 runs  0.804 s
      ✔ 200 bytes - uncompress - snappyjs                                   395141.8 ops/s    2.530737 us/op        -        281 runs   1.22 s
      ✔ 200 bytes - uncompress - snappy                                     536862.6 ops/s    1.862674 us/op        -        274 runs   1.01 s
      ✔ 200 bytes - uncompress - snappy-wasm                                420251.6 ops/s    2.379527 us/op        -        129 runs  0.810 s
      ✔ 200 bytes - uncompress - snappy-wasm - prealloc                      1746167 ops/s    572.6830 ns/op        -        529 runs  0.804 s
      ✔ 300 bytes - uncompress - snappyjs                                   441676.2 ops/s    2.264102 us/op        -        898 runs   2.53 s
      ✔ 300 bytes - uncompress - snappy                                     551313.2 ops/s    1.813851 us/op        -        336 runs   1.11 s
      ✔ 300 bytes - uncompress - snappy-wasm                                494773.0 ops/s    2.021129 us/op        -        203 runs  0.912 s
      ✔ 300 bytes - uncompress - snappy-wasm - prealloc                      1528680 ops/s    654.1590 ns/op        -        465 runs  0.805 s
      ✔ 400 bytes - uncompress - snappyjs                                   383746.1 ops/s    2.605890 us/op        -        235 runs   1.11 s
      ✔ 400 bytes - uncompress - snappy                                     515986.6 ops/s    1.938035 us/op        -        158 runs  0.809 s
      ✔ 400 bytes - uncompress - snappy-wasm                                392947.8 ops/s    2.544867 us/op        -        322 runs   1.32 s
      ✔ 400 bytes - uncompress - snappy-wasm - prealloc                      1425978 ops/s    701.2730 ns/op        -        721 runs   1.01 s
      ✔ 500 bytes - uncompress - snappyjs                                   330727.5 ops/s    3.023637 us/op        -        173 runs   1.02 s
      ✔ 500 bytes - uncompress - snappy                                     513874.1 ops/s    1.946002 us/op        -        157 runs  0.806 s
      ✔ 500 bytes - uncompress - snappy-wasm                                389263.0 ops/s    2.568957 us/op        -        161 runs  0.914 s
      ✔ 500 bytes - uncompress - snappy-wasm - prealloc                      1330936 ops/s    751.3510 ns/op        -        672 runs   1.01 s
      ✔ 1000 bytes - uncompress - snappyjs                                  241393.9 ops/s    4.142606 us/op        -        126 runs   1.03 s
      ✔ 1000 bytes - uncompress - snappy                                    491119.6 ops/s    2.036164 us/op        -        201 runs  0.911 s
      ✔ 1000 bytes - uncompress - snappy-wasm                               361794.5 ops/s    2.764000 us/op        -        148 runs  0.910 s
      ✔ 1000 bytes - uncompress - snappy-wasm - prealloc                    959026.5 ops/s    1.042724 us/op        -        390 runs  0.909 s
      ✔ 10000 bytes - uncompress - snappyjs                                 40519.03 ops/s    24.67976 us/op        -         16 runs  0.913 s
      ✔ 10000 bytes - uncompress - snappy                                   202537.6 ops/s    4.937355 us/op        -        796 runs   4.43 s
      ✔ 10000 bytes - uncompress - snappy-wasm                              165017.6 ops/s    6.059960 us/op        -         52 runs  0.822 s
      ✔ 10000 bytes - uncompress - snappy-wasm - prealloc                   175061.5 ops/s    5.712277 us/op        -        130 runs   1.25 s
      ✔ 100000 bytes - uncompress - snappyjs                                4030.391 ops/s    248.1149 us/op        -         12 runs   3.71 s
      ✔ 100000 bytes - uncompress - snappy                                  35459.43 ops/s    28.20124 us/op        -         41 runs   1.67 s
      ✔ 100000 bytes - uncompress - snappy-wasm                             22449.16 ops/s    44.54509 us/op        -         13 runs   1.11 s
      ✔ 100000 bytes - uncompress - snappy-wasm - prealloc                  27169.50 ops/s    36.80598 us/op        -         13 runs  0.997 s
```

Closes #4170

---------

Co-authored-by: Nico Flaig <[email protected]>
@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

⚠️ Performance Alert ⚠️

Possible performance regression was detected for some benchmarks.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold.

Benchmark suite Current: cc4c3b1 Previous: 868300d Ratio
200 bytes - uncompress - snappy 19.402 us/op 1.8058 us/op 10.74
Full benchmark results
Benchmark suite Current: cc4c3b1 Previous: 868300d Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 847.67 us/op 974.07 us/op 0.87
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 34.475 us/op 40.804 us/op 0.84
BLS verify - blst 837.25 us/op 896.79 us/op 0.93
BLS verifyMultipleSignatures 3 - blst 1.7265 ms/op 1.2306 ms/op 1.40
BLS verifyMultipleSignatures 8 - blst 2.0606 ms/op 2.0514 ms/op 1.00
BLS verifyMultipleSignatures 32 - blst 4.3712 ms/op 4.9825 ms/op 0.88
BLS verifyMultipleSignatures 64 - blst 8.2302 ms/op 10.410 ms/op 0.79
BLS verifyMultipleSignatures 128 - blst 15.905 ms/op 18.627 ms/op 0.85
BLS deserializing 10000 signatures 626.87 ms/op 719.78 ms/op 0.87
BLS deserializing 100000 signatures 6.3081 s/op 7.5437 s/op 0.84
BLS verifyMultipleSignatures - same message - 3 - blst 1.1025 ms/op 990.26 us/op 1.11
BLS verifyMultipleSignatures - same message - 8 - blst 1.0377 ms/op 1.1810 ms/op 0.88
BLS verifyMultipleSignatures - same message - 32 - blst 1.6933 ms/op 1.9749 ms/op 0.86
BLS verifyMultipleSignatures - same message - 64 - blst 2.3579 ms/op 3.1756 ms/op 0.74
BLS verifyMultipleSignatures - same message - 128 - blst 3.9529 ms/op 4.8839 ms/op 0.81
BLS aggregatePubkeys 32 - blst 17.715 us/op 20.832 us/op 0.85
BLS aggregatePubkeys 128 - blst 62.267 us/op 75.934 us/op 0.82
notSeenSlots=1 numMissedVotes=1 numBadVotes=10 39.487 ms/op 52.024 ms/op 0.76
notSeenSlots=1 numMissedVotes=0 numBadVotes=4 36.583 ms/op 41.879 ms/op 0.87
notSeenSlots=2 numMissedVotes=1 numBadVotes=10 27.915 ms/op 33.907 ms/op 0.82
getSlashingsAndExits - default max 56.011 us/op 73.744 us/op 0.76
getSlashingsAndExits - 2k 361.06 us/op 387.32 us/op 0.93
isKnown best case - 1 super set check 406.00 ns/op 208.00 ns/op 1.95
isKnown normal case - 2 super set checks 392.00 ns/op 199.00 ns/op 1.97
isKnown worse case - 16 super set checks 409.00 ns/op 205.00 ns/op 2.00
InMemoryCheckpointStateCache - add get delete 2.4810 us/op 2.5290 us/op 0.98
validate api signedAggregateAndProof - struct 2.0343 ms/op 1.8961 ms/op 1.07
validate gossip signedAggregateAndProof - struct 2.0167 ms/op 1.8538 ms/op 1.09
batch validate gossip attestation - vc 640000 - chunk 32 106.02 us/op 176.84 us/op 0.60
batch validate gossip attestation - vc 640000 - chunk 64 91.233 us/op 141.96 us/op 0.64
batch validate gossip attestation - vc 640000 - chunk 128 86.778 us/op 114.10 us/op 0.76
batch validate gossip attestation - vc 640000 - chunk 256 85.130 us/op 112.19 us/op 0.76
pickEth1Vote - no votes 764.94 us/op 1.0903 ms/op 0.70
pickEth1Vote - max votes 6.6384 ms/op 7.5165 ms/op 0.88
pickEth1Vote - Eth1Data hashTreeRoot value x2048 9.2496 ms/op 14.901 ms/op 0.62
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 13.492 ms/op 20.856 ms/op 0.65
pickEth1Vote - Eth1Data fastSerialize value x2048 333.86 us/op 443.40 us/op 0.75
pickEth1Vote - Eth1Data fastSerialize tree x2048 2.8892 ms/op 4.1569 ms/op 0.70
bytes32 toHexString 515.00 ns/op 392.00 ns/op 1.31
bytes32 Buffer.toString(hex) 414.00 ns/op 301.00 ns/op 1.38
bytes32 Buffer.toString(hex) from Uint8Array 501.00 ns/op 423.00 ns/op 1.18
bytes32 Buffer.toString(hex) + 0x 413.00 ns/op 245.00 ns/op 1.69
Object access 1 prop 0.29900 ns/op 0.12400 ns/op 2.41
Map access 1 prop 0.34900 ns/op 0.12600 ns/op 2.77
Object get x1000 4.9690 ns/op 5.7450 ns/op 0.86
Map get x1000 0.53900 ns/op 0.38200 ns/op 1.41
Object set x1000 20.673 ns/op 31.164 ns/op 0.66
Map set x1000 17.129 ns/op 23.029 ns/op 0.74
Return object 10000 times 0.23230 ns/op 0.30380 ns/op 0.76
Throw Error 10000 times 3.2161 us/op 4.3522 us/op 0.74
toHex 94.887 ns/op 151.54 ns/op 0.63
Buffer.from 96.051 ns/op 134.67 ns/op 0.71
shared Buffer 69.962 ns/op 83.862 ns/op 0.83
fastMsgIdFn sha256 / 200 bytes 1.7760 us/op 2.0230 us/op 0.88
fastMsgIdFn h32 xxhash / 200 bytes 390.00 ns/op 199.00 ns/op 1.96
fastMsgIdFn h64 xxhash / 200 bytes 443.00 ns/op 268.00 ns/op 1.65
fastMsgIdFn sha256 / 1000 bytes 5.2140 us/op 6.4370 us/op 0.81
fastMsgIdFn h32 xxhash / 1000 bytes 490.00 ns/op 302.00 ns/op 1.62
fastMsgIdFn h64 xxhash / 1000 bytes 489.00 ns/op 328.00 ns/op 1.49
fastMsgIdFn sha256 / 10000 bytes 42.803 us/op 59.614 us/op 0.72
fastMsgIdFn h32 xxhash / 10000 bytes 1.5290 us/op 1.5070 us/op 1.01
fastMsgIdFn h64 xxhash / 10000 bytes 1.0870 us/op 982.00 ns/op 1.11
100 bytes - compress - snappyjs 1.1977 us/op 1.5222 us/op 0.79
100 bytes - compress - snappy 999.05 ns/op 1.3071 us/op 0.76
100 bytes - compress - snappy-wasm 530.85 ns/op
100 bytes - compress - snappy-wasm - prealloc 1.3033 us/op
200 bytes - compress - snappyjs 1.4386 us/op 1.6695 us/op 0.86
200 bytes - compress - snappy 1.1221 us/op 1.6909 us/op 0.66
200 bytes - compress - snappy-wasm 787.04 ns/op
200 bytes - compress - snappy-wasm - prealloc 937.76 ns/op
300 bytes - compress - snappyjs 2.0760 us/op 2.9379 us/op 0.71
300 bytes - compress - snappy 1.3011 us/op 1.9799 us/op 0.66
300 bytes - compress - snappy-wasm 688.19 ns/op
300 bytes - compress - snappy-wasm - prealloc 1.0709 us/op
400 bytes - compress - snappyjs 2.1172 us/op 2.3396 us/op 0.90
400 bytes - compress - snappy 1.3729 us/op 2.1813 us/op 0.63
400 bytes - compress - snappy-wasm 865.46 ns/op
400 bytes - compress - snappy-wasm - prealloc 1.1802 us/op
500 bytes - compress - snappyjs 3.3676 us/op 3.0889 us/op 1.09
500 bytes - compress - snappy 1.2931 us/op 2.3588 us/op 0.55
500 bytes - compress - snappy-wasm 922.88 ns/op
500 bytes - compress - snappy-wasm - prealloc 1.4742 us/op
1000 bytes - compress - snappyjs 4.9516 us/op 4.5526 us/op 1.09
1000 bytes - compress - snappy 1.5342 us/op 3.0277 us/op 0.51
1000 bytes - compress - snappy-wasm 2.0585 us/op
1000 bytes - compress - snappy-wasm - prealloc 1.9606 us/op
10000 bytes - compress - snappyjs 30.554 us/op 29.231 us/op 1.05
10000 bytes - compress - snappy 44.758 us/op 16.910 us/op 2.65
10000 bytes - compress - snappy-wasm 30.817 us/op
10000 bytes - compress - snappy-wasm - prealloc 19.969 us/op
100 bytes - uncompress - snappyjs 626.98 ns/op 801.89 ns/op 0.78
100 bytes - uncompress - snappy 1.3811 us/op 1.5166 us/op 0.91
100 bytes - uncompress - snappy-wasm 599.46 ns/op
100 bytes - uncompress - snappy-wasm - prealloc 677.11 ns/op
200 bytes - uncompress - snappyjs 823.87 ns/op 1.3935 us/op 0.59
200 bytes - uncompress - snappy 19.402 us/op 1.8058 us/op 10.74
200 bytes - uncompress - snappy-wasm 1.0504 us/op
200 bytes - uncompress - snappy-wasm - prealloc 1.3670 us/op
300 bytes - uncompress - snappyjs 958.75 ns/op 1.2181 us/op 0.79
300 bytes - uncompress - snappy 1.1205 us/op 1.5073 us/op 0.74
300 bytes - uncompress - snappy-wasm 674.75 ns/op
300 bytes - uncompress - snappy-wasm - prealloc 1.6138 us/op
400 bytes - uncompress - snappyjs 2.1215 us/op 1.6135 us/op 1.31
400 bytes - uncompress - snappy 1.2220 us/op 1.5895 us/op 0.77
400 bytes - uncompress - snappy-wasm 847.54 ns/op
400 bytes - uncompress - snappy-wasm - prealloc 1.6984 us/op
500 bytes - uncompress - snappyjs 1.8351 us/op 1.8898 us/op 0.97
500 bytes - uncompress - snappy 1.9352 us/op 2.1996 us/op 0.88
500 bytes - uncompress - snappy-wasm 1.4546 us/op
500 bytes - uncompress - snappy-wasm - prealloc 1.2205 us/op
1000 bytes - uncompress - snappyjs 1.8948 us/op 2.4049 us/op 0.79
1000 bytes - uncompress - snappy 1.3643 us/op 1.8319 us/op 0.74
1000 bytes - uncompress - snappy-wasm 1.2622 us/op
1000 bytes - uncompress - snappy-wasm - prealloc 1.1298 us/op
10000 bytes - uncompress - snappyjs 23.376 us/op 24.660 us/op 0.95
10000 bytes - uncompress - snappy 26.497 us/op 24.359 us/op 1.09
10000 bytes - uncompress - snappy-wasm 13.264 us/op
10000 bytes - uncompress - snappy-wasm - prealloc 17.032 us/op
send data - 1000 256B messages 11.257 ms/op 23.406 ms/op 0.48
send data - 1000 512B messages 13.639 ms/op 24.129 ms/op 0.57
send data - 1000 1024B messages 19.089 ms/op 29.586 ms/op 0.65
send data - 1000 1200B messages 16.514 ms/op 36.139 ms/op 0.46
send data - 1000 2048B messages 22.729 ms/op 33.882 ms/op 0.67
send data - 1000 4096B messages 24.555 ms/op 41.431 ms/op 0.59
send data - 1000 16384B messages 100.59 ms/op 161.10 ms/op 0.62
send data - 1000 65536B messages 198.50 ms/op 663.87 ms/op 0.30
enrSubnets - fastDeserialize 64 bits 1.0450 us/op 960.00 ns/op 1.09
enrSubnets - ssz BitVector 64 bits 505.00 ns/op 364.00 ns/op 1.39
enrSubnets - fastDeserialize 4 bits 322.00 ns/op 142.00 ns/op 2.27
enrSubnets - ssz BitVector 4 bits 521.00 ns/op 367.00 ns/op 1.42
prioritizePeers score -10:0 att 32-0.1 sync 2-0 213.20 us/op 262.09 us/op 0.81
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 268.20 us/op 303.57 us/op 0.88
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 336.93 us/op 420.48 us/op 0.80
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 701.26 us/op 900.93 us/op 0.78
prioritizePeers score 0:0 att 64-1 sync 4-1 721.55 us/op 894.17 us/op 0.81
array of 16000 items push then shift 1.2901 us/op 1.7795 us/op 0.72
LinkedList of 16000 items push then shift 7.2060 ns/op 8.1070 ns/op 0.89
array of 16000 items push then pop 66.025 ns/op 84.752 ns/op 0.78
LinkedList of 16000 items push then pop 6.3100 ns/op 7.8070 ns/op 0.81
array of 24000 items push then shift 1.9085 us/op 2.5672 us/op 0.74
LinkedList of 24000 items push then shift 6.9310 ns/op 8.6200 ns/op 0.80
array of 24000 items push then pop 92.365 ns/op 115.58 ns/op 0.80
LinkedList of 24000 items push then pop 6.2950 ns/op 7.8020 ns/op 0.81
intersect bitArray bitLen 8 4.9330 ns/op 6.1720 ns/op 0.80
intersect array and set length 8 30.962 ns/op 38.820 ns/op 0.80
intersect bitArray bitLen 128 26.073 ns/op 30.329 ns/op 0.86
intersect array and set length 128 512.56 ns/op 618.77 ns/op 0.83
bitArray.getTrueBitIndexes() bitLen 128 1.1870 us/op 1.2580 us/op 0.94
bitArray.getTrueBitIndexes() bitLen 248 1.9430 us/op 2.0640 us/op 0.94
bitArray.getTrueBitIndexes() bitLen 512 3.7560 us/op 4.1470 us/op 0.91
Full columns - reconstruct all 6 blobs 351.02 us/op 392.04 us/op 0.90
Full columns - reconstruct half of the blobs out of 6 148.03 us/op 158.43 us/op 0.93
Full columns - reconstruct single blob out of 6 40.633 us/op 50.643 us/op 0.80
Half columns - reconstruct all 6 blobs 231.88 ms/op 300.98 ms/op 0.77
Half columns - reconstruct half of the blobs out of 6 118.57 ms/op 167.97 ms/op 0.71
Half columns - reconstruct single blob out of 6 44.030 ms/op 55.349 ms/op 0.80
Full columns - reconstruct all 10 blobs 300.38 us/op 419.81 us/op 0.72
Full columns - reconstruct half of the blobs out of 10 152.71 us/op 194.04 us/op 0.79
Full columns - reconstruct single blob out of 10 40.591 us/op 53.704 us/op 0.76
Half columns - reconstruct all 10 blobs 388.26 ms/op 506.52 ms/op 0.77
Half columns - reconstruct half of the blobs out of 10 197.66 ms/op 274.00 ms/op 0.72
Half columns - reconstruct single blob out of 10 44.301 ms/op 54.769 ms/op 0.81
Full columns - reconstruct all 20 blobs 1.1126 ms/op 1.4152 ms/op 0.79
Full columns - reconstruct half of the blobs out of 20 358.88 us/op 527.24 us/op 0.68
Full columns - reconstruct single blob out of 20 29.695 us/op 33.405 us/op 0.89
Half columns - reconstruct all 20 blobs 774.79 ms/op 971.51 ms/op 0.80
Half columns - reconstruct half of the blobs out of 20 385.30 ms/op 512.16 ms/op 0.75
Half columns - reconstruct single blob out of 20 43.886 ms/op 61.888 ms/op 0.71
Set add up to 64 items then delete first 1.7049 us/op 3.2494 us/op 0.52
OrderedSet add up to 64 items then delete first 2.6036 us/op 4.2914 us/op 0.61
Set add up to 64 items then delete last 1.7444 us/op 3.0497 us/op 0.57
OrderedSet add up to 64 items then delete last 2.5960 us/op 4.3118 us/op 0.60
Set add up to 64 items then delete middle 1.7359 us/op 3.0645 us/op 0.57
OrderedSet add up to 64 items then delete middle 3.9891 us/op 6.1575 us/op 0.65
Set add up to 128 items then delete first 3.4465 us/op 6.1276 us/op 0.56
OrderedSet add up to 128 items then delete first 5.3447 us/op 8.0762 us/op 0.66
Set add up to 128 items then delete last 3.3347 us/op 5.3681 us/op 0.62
OrderedSet add up to 128 items then delete last 5.0397 us/op 8.5711 us/op 0.59
Set add up to 128 items then delete middle 3.3203 us/op 6.4321 us/op 0.52
OrderedSet add up to 128 items then delete middle 10.851 us/op 16.912 us/op 0.64
Set add up to 256 items then delete first 6.8891 us/op 12.634 us/op 0.55
OrderedSet add up to 256 items then delete first 10.918 us/op 16.798 us/op 0.65
Set add up to 256 items then delete last 6.7475 us/op 13.512 us/op 0.50
OrderedSet add up to 256 items then delete last 10.348 us/op 19.982 us/op 0.52
Set add up to 256 items then delete middle 6.6979 us/op 12.480 us/op 0.54
OrderedSet add up to 256 items then delete middle 33.530 us/op 50.877 us/op 0.66
pass gossip attestations to forkchoice per slot 2.0541 ms/op 3.0687 ms/op 0.67
forkChoice updateHead vc 100000 bc 64 eq 0 372.89 us/op 565.46 us/op 0.66
forkChoice updateHead vc 600000 bc 64 eq 0 2.2285 ms/op 2.9686 ms/op 0.75
forkChoice updateHead vc 1000000 bc 64 eq 0 3.6487 ms/op 5.2358 ms/op 0.70
forkChoice updateHead vc 600000 bc 320 eq 0 2.1966 ms/op 3.2169 ms/op 0.68
forkChoice updateHead vc 600000 bc 1200 eq 0 2.3818 ms/op 3.3019 ms/op 0.72
forkChoice updateHead vc 600000 bc 7200 eq 0 2.9314 ms/op 4.4906 ms/op 0.65
forkChoice updateHead vc 600000 bc 64 eq 1000 2.9329 ms/op 3.7414 ms/op 0.78
forkChoice updateHead vc 600000 bc 64 eq 10000 2.7872 ms/op 3.8391 ms/op 0.73
forkChoice updateHead vc 600000 bc 64 eq 300000 6.8822 ms/op 10.375 ms/op 0.66
computeDeltas 1400000 validators 0% inactive 9.7404 ms/op 15.644 ms/op 0.62
computeDeltas 1400000 validators 10% inactive 8.9810 ms/op 15.077 ms/op 0.60
computeDeltas 1400000 validators 20% inactive 8.0621 ms/op 13.367 ms/op 0.60
computeDeltas 1400000 validators 50% inactive 6.0078 ms/op 10.514 ms/op 0.57
computeDeltas 2100000 validators 0% inactive 14.559 ms/op 23.128 ms/op 0.63
computeDeltas 2100000 validators 10% inactive 13.479 ms/op 22.432 ms/op 0.60
computeDeltas 2100000 validators 20% inactive 12.100 ms/op 19.812 ms/op 0.61
computeDeltas 2100000 validators 50% inactive 9.0158 ms/op 15.963 ms/op 0.56
altair processAttestation - 250000 vs - 7PWei normalcase 1.6421 ms/op 2.7661 ms/op 0.59
altair processAttestation - 250000 vs - 7PWei worstcase 2.4426 ms/op 3.7183 ms/op 0.66
altair processAttestation - setStatus - 1/6 committees join 85.189 us/op 128.56 us/op 0.66
altair processAttestation - setStatus - 1/3 committees join 184.18 us/op 251.30 us/op 0.73
altair processAttestation - setStatus - 1/2 committees join 289.54 us/op 349.64 us/op 0.83
altair processAttestation - setStatus - 2/3 committees join 343.24 us/op 449.57 us/op 0.76
altair processAttestation - setStatus - 4/5 committees join 515.08 us/op 619.46 us/op 0.83
altair processAttestation - setStatus - 100% committees join 598.22 us/op 736.90 us/op 0.81
altair processBlock - 250000 vs - 7PWei normalcase 2.8520 ms/op 5.1418 ms/op 0.55
altair processBlock - 250000 vs - 7PWei normalcase hashState 14.806 ms/op 28.248 ms/op 0.52
altair processBlock - 250000 vs - 7PWei worstcase 23.798 ms/op 28.960 ms/op 0.82
altair processBlock - 250000 vs - 7PWei worstcase hashState 49.092 ms/op 66.063 ms/op 0.74
phase0 processBlock - 250000 vs - 7PWei normalcase 1.5328 ms/op 1.7601 ms/op 0.87
phase0 processBlock - 250000 vs - 7PWei worstcase 19.456 ms/op 25.750 ms/op 0.76
altair processEth1Data - 250000 vs - 7PWei normalcase 291.80 us/op 414.07 us/op 0.70
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 3.4720 us/op 12.284 us/op 0.28
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 34.809 us/op 62.391 us/op 0.56
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 9.6950 us/op 20.392 us/op 0.48
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 7.0330 us/op 11.833 us/op 0.59
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 92.599 us/op 245.13 us/op 0.38
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 1.4701 ms/op 2.1417 ms/op 0.69
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.8864 ms/op 3.2349 ms/op 0.58
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.9085 ms/op 2.7196 ms/op 0.70
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.9053 ms/op 6.1572 ms/op 0.63
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 1.9726 ms/op 2.8645 ms/op 0.69
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 3.9556 ms/op 6.2035 ms/op 0.64
Tree 40 250000 create 325.34 ms/op 407.60 ms/op 0.80
Tree 40 250000 get(125000) 97.768 ns/op 131.18 ns/op 0.75
Tree 40 250000 set(125000) 1.0681 us/op 1.3287 us/op 0.80
Tree 40 250000 toArray() 9.4703 ms/op 19.267 ms/op 0.49
Tree 40 250000 iterate all - toArray() + loop 9.5986 ms/op 20.027 ms/op 0.48
Tree 40 250000 iterate all - get(i) 34.667 ms/op 49.797 ms/op 0.70
Array 250000 create 2.0436 ms/op 2.7338 ms/op 0.75
Array 250000 clone - spread 631.80 us/op 917.19 us/op 0.69
Array 250000 get(125000) 0.50500 ns/op 0.36500 ns/op 1.38
Array 250000 set(125000) 0.51600 ns/op 0.36800 ns/op 1.40
Array 250000 iterate all - loop 55.911 us/op 63.585 us/op 0.88
phase0 afterProcessEpoch - 250000 vs - 7PWei 38.871 ms/op 43.951 ms/op 0.88
Array.fill - length 1000000 2.0334 ms/op 3.3421 ms/op 0.61
Array push - length 1000000 7.7720 ms/op 13.843 ms/op 0.56
Array.get 0.20265 ns/op 0.23491 ns/op 0.86
Uint8Array.get 0.20248 ns/op 0.24768 ns/op 0.82
phase0 beforeProcessEpoch - 250000 vs - 7PWei 11.115 ms/op 21.080 ms/op 0.53
altair processEpoch - mainnet_e81889 209.78 ms/op 295.45 ms/op 0.71
mainnet_e81889 - altair beforeProcessEpoch 12.737 ms/op 24.144 ms/op 0.53
mainnet_e81889 - altair processJustificationAndFinalization 4.7450 us/op 5.9870 us/op 0.79
mainnet_e81889 - altair processInactivityUpdates 3.2682 ms/op 4.1913 ms/op 0.78
mainnet_e81889 - altair processRewardsAndPenalties 15.658 ms/op 20.894 ms/op 0.75
mainnet_e81889 - altair processRegistryUpdates 821.00 ns/op 703.00 ns/op 1.17
mainnet_e81889 - altair processSlashings 388.00 ns/op 188.00 ns/op 2.06
mainnet_e81889 - altair processEth1DataReset 379.00 ns/op 181.00 ns/op 2.09
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.2486 ms/op 7.2064 ms/op 0.17
mainnet_e81889 - altair processSlashingsReset 957.00 ns/op 874.00 ns/op 1.09
mainnet_e81889 - altair processRandaoMixesReset 1.1900 us/op 1.1440 us/op 1.04
mainnet_e81889 - altair processHistoricalRootsUpdate 369.00 ns/op 189.00 ns/op 1.95
mainnet_e81889 - altair processParticipationFlagUpdates 697.00 ns/op 641.00 ns/op 1.09
mainnet_e81889 - altair processSyncCommitteeUpdates 335.00 ns/op 153.00 ns/op 2.19
mainnet_e81889 - altair afterProcessEpoch 40.807 ms/op 47.667 ms/op 0.86
capella processEpoch - mainnet_e217614 764.31 ms/op 850.21 ms/op 0.90
mainnet_e217614 - capella beforeProcessEpoch 58.673 ms/op 95.289 ms/op 0.62
mainnet_e217614 - capella processJustificationAndFinalization 5.1690 us/op 5.8580 us/op 0.88
mainnet_e217614 - capella processInactivityUpdates 10.720 ms/op 22.729 ms/op 0.47
mainnet_e217614 - capella processRewardsAndPenalties 98.188 ms/op 118.55 ms/op 0.83
mainnet_e217614 - capella processRegistryUpdates 4.9970 us/op 8.2340 us/op 0.61
mainnet_e217614 - capella processSlashings 381.00 ns/op 171.00 ns/op 2.23
mainnet_e217614 - capella processEth1DataReset 362.00 ns/op 174.00 ns/op 2.08
mainnet_e217614 - capella processEffectiveBalanceUpdates 6.9358 ms/op 16.721 ms/op 0.41
mainnet_e217614 - capella processSlashingsReset 951.00 ns/op 843.00 ns/op 1.13
mainnet_e217614 - capella processRandaoMixesReset 1.1830 us/op 1.1950 us/op 0.99
mainnet_e217614 - capella processHistoricalRootsUpdate 367.00 ns/op 176.00 ns/op 2.09
mainnet_e217614 - capella processParticipationFlagUpdates 692.00 ns/op 536.00 ns/op 1.29
mainnet_e217614 - capella afterProcessEpoch 111.55 ms/op 119.99 ms/op 0.93
phase0 processEpoch - mainnet_e58758 194.89 ms/op 254.53 ms/op 0.77
mainnet_e58758 - phase0 beforeProcessEpoch 36.825 ms/op 59.868 ms/op 0.62
mainnet_e58758 - phase0 processJustificationAndFinalization 4.8160 us/op 5.7140 us/op 0.84
mainnet_e58758 - phase0 processRewardsAndPenalties 17.407 ms/op 19.684 ms/op 0.88
mainnet_e58758 - phase0 processRegistryUpdates 2.6670 us/op 3.1610 us/op 0.84
mainnet_e58758 - phase0 processSlashings 409.00 ns/op 212.00 ns/op 1.93
mainnet_e58758 - phase0 processEth1DataReset 372.00 ns/op 167.00 ns/op 2.23
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 968.14 us/op 1.0085 ms/op 0.96
mainnet_e58758 - phase0 processSlashingsReset 1.2580 us/op 935.00 ns/op 1.35
mainnet_e58758 - phase0 processRandaoMixesReset 1.2280 us/op 1.0940 us/op 1.12
mainnet_e58758 - phase0 processHistoricalRootsUpdate 372.00 ns/op 185.00 ns/op 2.01
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.2730 us/op 850.00 ns/op 1.50
mainnet_e58758 - phase0 afterProcessEpoch 33.979 ms/op 37.110 ms/op 0.92
phase0 processEffectiveBalanceUpdates - 250000 normalcase 911.55 us/op 1.7434 ms/op 0.52
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.2501 ms/op 2.1424 ms/op 0.58
altair processInactivityUpdates - 250000 normalcase 9.9057 ms/op 15.723 ms/op 0.63
altair processInactivityUpdates - 250000 worstcase 10.277 ms/op 16.077 ms/op 0.64
phase0 processRegistryUpdates - 250000 normalcase 4.4700 us/op 7.3490 us/op 0.61
phase0 processRegistryUpdates - 250000 badcase_full_deposits 291.89 us/op 323.01 us/op 0.90
phase0 processRegistryUpdates - 250000 worstcase 0.5 67.060 ms/op 93.059 ms/op 0.72
altair processRewardsAndPenalties - 250000 normalcase 12.498 ms/op 17.419 ms/op 0.72
altair processRewardsAndPenalties - 250000 worstcase 16.245 ms/op 17.195 ms/op 0.94
phase0 getAttestationDeltas - 250000 normalcase 5.4389 ms/op 7.2499 ms/op 0.75
phase0 getAttestationDeltas - 250000 worstcase 5.4863 ms/op 7.2913 ms/op 0.75
phase0 processSlashings - 250000 worstcase 91.140 us/op 111.78 us/op 0.82
altair processSyncCommitteeUpdates - 250000 10.012 ms/op 12.567 ms/op 0.80
BeaconState.hashTreeRoot - No change 403.00 ns/op 248.00 ns/op 1.63
BeaconState.hashTreeRoot - 1 full validator 57.453 us/op 95.719 us/op 0.60
BeaconState.hashTreeRoot - 32 full validator 632.30 us/op 1.1086 ms/op 0.57
BeaconState.hashTreeRoot - 512 full validator 6.5016 ms/op 9.5847 ms/op 0.68
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 83.466 us/op 128.42 us/op 0.65
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.0173 ms/op 1.8834 ms/op 0.54
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 13.615 ms/op 22.232 ms/op 0.61
BeaconState.hashTreeRoot - 1 balances 56.093 us/op 98.458 us/op 0.57
BeaconState.hashTreeRoot - 32 balances 755.03 us/op 947.46 us/op 0.80
BeaconState.hashTreeRoot - 512 balances 6.1806 ms/op 7.2094 ms/op 0.86
BeaconState.hashTreeRoot - 250000 balances 128.24 ms/op 154.81 ms/op 0.83
aggregationBits - 2048 els - zipIndexesInBitList 19.335 us/op 25.218 us/op 0.77
regular array get 100000 times 22.397 us/op 27.868 us/op 0.80
wrappedArray get 100000 times 22.389 us/op 27.895 us/op 0.80
arrayWithProxy get 100000 times 11.561 ms/op 16.648 ms/op 0.69
ssz.Root.equals 21.476 ns/op 27.734 ns/op 0.77
byteArrayEquals 20.945 ns/op 26.712 ns/op 0.78
Buffer.compare 10.051 ns/op 11.322 ns/op 0.89
processSlot - 1 slots 11.553 us/op 13.215 us/op 0.87
processSlot - 32 slots 2.2809 ms/op 2.8100 ms/op 0.81
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 2.5654 ms/op 4.3326 ms/op 0.59
getCommitteeAssignments - req 1 vs - 250000 vc 1.5762 ms/op 1.9251 ms/op 0.82
getCommitteeAssignments - req 100 vs - 250000 vc 3.2217 ms/op 3.7767 ms/op 0.85
getCommitteeAssignments - req 1000 vs - 250000 vc 3.4626 ms/op 4.0307 ms/op 0.86
findModifiedValidators - 10000 modified validators 573.85 ms/op 633.30 ms/op 0.91
findModifiedValidators - 1000 modified validators 270.10 ms/op 465.17 ms/op 0.58
findModifiedValidators - 100 modified validators 303.70 ms/op 282.04 ms/op 1.08
findModifiedValidators - 10 modified validators 191.24 ms/op 256.62 ms/op 0.75
findModifiedValidators - 1 modified validators 145.72 ms/op 231.94 ms/op 0.63
findModifiedValidators - no difference 128.17 ms/op 207.87 ms/op 0.62
migrate state 1500000 validators, 3400 modified, 2000 new 1.0913 s/op 1.1532 s/op 0.95
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 5.8300 ns/op 4.2600 ns/op 1.37
state getBlockRootAtSlot - 250000 vs - 7PWei 584.33 ns/op 535.65 ns/op 1.09
computeProposerIndex 100000 validators 1.3337 ms/op 1.5973 ms/op 0.83
getNextSyncCommitteeIndices 1000 validators 99.101 ms/op 121.64 ms/op 0.81
getNextSyncCommitteeIndices 10000 validators 99.332 ms/op 121.65 ms/op 0.82
getNextSyncCommitteeIndices 100000 validators 99.200 ms/op 124.47 ms/op 0.80
computeProposers - vc 250000 582.05 us/op 657.39 us/op 0.89
computeEpochShuffling - vc 250000 37.666 ms/op 46.962 ms/op 0.80
getNextSyncCommittee - vc 250000 9.5410 ms/op 10.896 ms/op 0.88
nodejs block root to RootHex using toHex 119.18 ns/op 158.21 ns/op 0.75
nodejs block root to RootHex using toRootHex 79.564 ns/op 98.660 ns/op 0.81
nodejs fromHex(blob) 189.16 us/op 226.43 us/op 0.84
nodejs fromHexInto(blob) 590.72 us/op 769.54 us/op 0.77
nodejs block root to RootHex using the deprecated toHexString 361.51 ns/op 598.23 ns/op 0.60
browser block root to RootHex using toHex 240.38 ns/op 404.88 ns/op 0.59
browser block root to RootHex using toRootHex 130.67 ns/op 162.71 ns/op 0.80
browser fromHex(blob) 1.1015 ms/op 1.5696 ms/op 0.70
browser fromHexInto(blob) 682.71 us/op 731.74 us/op 0.93
browser block root to RootHex using the deprecated toHexString 486.42 ns/op 601.83 ns/op 0.81

by benchmarkbot/action

const uncompressedData = uncompress(data, this.maxSizePerMessage);
// check uncompressed data length before we actually decompress
const uncompressedDataLength = snappyWasm.decompress_len(data);
if (uncompressedDataLength > this.maxSizePerMessage) {
Copy link
Contributor

Choose a reason for hiding this comment

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

we could improve this check to be per topic
as far as I know this 10MB cap should only apply to beacon_block
others may either have fixed size, for example beacon_attestation or have different max size

@twoeths
Copy link
Contributor

twoeths commented Dec 4, 2025

a comparision of hoodi sas node of this branch vs same node of unstable

  • received messages, is slightly higher than unstable
Screenshot 2025-12-04 at 14 07 51
  • beacon_attestation job time is almost double unstable, job wait time is ~100ms more
Screenshot 2025-12-04 at 14 15 57
  • data_column_sidecar job time + job wait time is the same to unstable
  • gossip block received delay is a little bit delayed (0.02s - 0.04s) compared to unstable
Screenshot 2025-12-04 at 14 19 06
  • on network thread vm, MarkSweepCompact is 0.25% higher and scavenge is 1% higher than unstable
Screenshot 2025-12-04 at 14 23 19

@twoeths
Copy link
Contributor

twoeths commented Dec 4, 2025

I'm not sure we should compare job time + job wait time here, service deployment is always 2x compared to docker deployment for beacon_attestation topic for all feature groups

update: beacon_attestation job time only increased in this branch

Screenshot 2025-12-04 at 16 54 49

this is really the concern we had last time when we had to revert in v1.27 https://discord.com/channels/593655374469660673/1337188931489239072/1337613545382346793

this is because of MarkSweepCompact spiked on the main thread

Screenshot 2025-12-04 at 16 58 15

MarkSweepCompact is also higher on network thread

@twoeths
Copy link
Contributor

twoeths commented Dec 4, 2025

also head late is 10% - 20% higher than unstable
Screenshot 2025-12-04 at 14 32 48

@wemeetagain
Copy link
Member Author

Interestingly, the results are completely different (roughly opposite) comparing supernodes without subscribe-all-subnets

this PR vs unstable
Screenshot from 2025-12-04 09-01-19
Screenshot from 2025-12-04 09-01-02

this PR vs unstable
Screenshot from 2025-12-04 08-42-05
Screenshot from 2025-12-04 08-41-46

Before and after GC
Screenshot from 2025-12-04 08-37-33
Screenshot from 2025-12-04 08-37-39

this PR vs unstable
Screenshot from 2025-12-04 08-57-51
Screenshot from 2025-12-04 08-58-04

**Motivation**

- high `MarkSweepCompact` gc on #8647
- the reason is the use of `Buffer.allocUnsafe()` as found in
#8670 (comment)
- an alternative to #8670

**Description**

- use `@chainsafe/snappy-wasm` for all topics but with `Buffer.alloc()`
- this is deployed to `feat2`

---------

Co-authored-by: Tuyen Nguyen <[email protected]>
@wemeetagain wemeetagain marked this pull request as ready for review December 9, 2025 03:25
@wemeetagain wemeetagain requested a review from a team as a code owner December 9, 2025 03:25
Copy link
Contributor

@twoeths twoeths left a comment

Choose a reason for hiding this comment

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

should be good to go, tested this branch for a while see #8671 (comment)

@wemeetagain wemeetagain merged commit 688d558 into unstable Dec 9, 2025
24 of 27 checks passed
@wemeetagain wemeetagain deleted the cayman/snappy branch December 9, 2025 04:20
@codecov
Copy link

codecov bot commented Dec 9, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.03%. Comparing base (362bd5e) to head (9db8579).
⚠️ Report is 4 commits behind head on unstable.

Additional details and impacted files
@@            Coverage Diff            @@
##           unstable    #8647   +/-   ##
=========================================
  Coverage     52.02%   52.03%           
=========================================
  Files           848      848           
  Lines         65812    65809    -3     
  Branches       4809     4809           
=========================================
  Hits          34241    34241           
+ Misses        31502    31499    -3     
  Partials         69       69           
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@wemeetagain
Copy link
Member Author

🎉 This PR is included in v1.38.0 🎉

wemeetagain pushed a commit that referenced this pull request Dec 16, 2025
**Motivation**

- improve memory by transferirng gossipsub message data from network
thread to the main thread
- In snappy decompression in #8647 we had to do `Buffer.alloc()` instead
of `Buffer.allocUnsafe()`. We don't have to feel bad about that because
`Buffer.allocUnsafe()` does not work with this PR, and we don't waste
any memory.

**Description**

- use `transferList` param when posting messages from network thread to
the main thread

part of #8629

**Testing**
I've tested this on `feat2` for 3 days, the previous branch was #8671 so
it's basically the current stable, does not see significant improvement
but some good data for different nodes
- no change on 1k or `novc`
- on hoodi `sas` node we have better memory there on main thread with
same mesh peers, same memory on network thread

<img width="851" height="511" alt="Screenshot 2025-12-12 at 11 05 27"
src="https://github.com/user-attachments/assets/8d7b2c2f-8213-4f89-87e0-437d016bc24a"
/>

- on mainnnet `sas` node, we have better memory on network thread, a
little bit worse on the main thread
<img width="854" height="504" alt="Screenshot 2025-12-12 at 11 08 42"
src="https://github.com/user-attachments/assets/7e638149-2dbe-4c7e-849c-ef78f6ff4d6f"
/>

- but for this mainnet node, the most interesting metric is `forward msg
avg peers`, we're faster than majority of them

<img width="1378" height="379" alt="Screenshot 2025-12-12 at 11 11 00"
src="https://github.com/user-attachments/assets/3ba5eeaa-5a11-4cad-adfa-1e0f68a81f16"
/>

---------

Co-authored-by: Tuyen Nguyen <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Consider using snappy along with snappyjs

3 participants