Skip to content

(WIP)perf(state-transition): use native PTC sampling - #9903

Draft
GrapeBaBa wants to merge 2 commits into
unstablefrom
gr/native-ptc-sampling
Draft

(WIP)perf(state-transition): use native PTC sampling#9903
GrapeBaBa wants to merge 2 commits into
unstablefrom
gr/native-ptc-sampling

Conversation

@GrapeBaBa

@GrapeBaBa GrapeBaBa commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Motivation

Fixes #9771.

Gloas and Heze sanity/slots/pyspec_tests/historical_accumulator spend most of their time computing 256 epochs of PTC weighted selections. This PR moves the whole-epoch sampler to the Zig native shuffle binding from ChainSafe/lodestar-z#563.

Depends on ChainSafe/lodestar-z#563.

Changes

  • call computePtcIndicesForEpoch once per epoch with the existing flat shuffling
  • preserve the existing public helper signature and independent per-slot Uint32Array results
  • reuse retained ptcWindow SSZ child views instead of rebuilding all three epochs
  • batch post-Gloas BeaconState hashing with a reused HashComputationGroup
  • re-enable the Gloas and Heze mainnet historical accumulator cases
  • add a Lodestar-level differential test covering multi-committee slot offsets and the legacy committees-only call

Performance

Mainnet preset, consensus-specs v1.7.0-alpha.14, Node 25.2.1:

case unstable this PR
gloas historical_accumulator 26.39s 5.68s
heze historical_accumulator 26.30s 6.06s

Focused profiling reduced cumulative processPtcWindow time from about 12.27s to 1.04s over 256 epochs. The final state root is unchanged.

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Performance Report

鉁旓笍 no performance regression detected

Full benchmark results
Benchmark suite Current: 79df103 Previous: 62b30e7 Ratio
getPubkeys - native cache - req 1000 vs - 250000 vc 460.20 us/op 443.50 us/op 1.04
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 38.199 us/op 41.017 us/op 0.93
BLS verify - blst 855.28 us/op 909.00 us/op 0.94
BLS verifyMultipleSignatures 3 - blst 1.2934 ms/op 1.3756 ms/op 0.94
BLS verifyMultipleSignatures 8 - blst 2.1925 ms/op 2.2786 ms/op 0.96
BLS verifyMultipleSignatures 32 - blst 6.9676 ms/op 7.5322 ms/op 0.93
BLS verifyMultipleSignatures 64 - blst 13.377 ms/op 14.478 ms/op 0.92
BLS verifyMultipleSignatures 128 - blst 25.062 ms/op 28.102 ms/op 0.89
BLS deserializing 10000 signatures 619.38 ms/op 650.53 ms/op 0.95
BLS deserializing 100000 signatures 6.4097 s/op 6.5578 s/op 0.98
BLS verifyMultipleSignatures - same message - 3 - blst 949.28 us/op 966.55 us/op 0.98
BLS verifyMultipleSignatures - same message - 8 - blst 1.0657 ms/op 1.0971 ms/op 0.97
BLS verifyMultipleSignatures - same message - 32 - blst 1.6908 ms/op 1.7123 ms/op 0.99
BLS verifyMultipleSignatures - same message - 64 - blst 2.5242 ms/op 2.5534 ms/op 0.99
BLS verifyMultipleSignatures - same message - 128 - blst 4.1894 ms/op 4.2318 ms/op 0.99
BLS aggregatePubkeys 32 - blst 19.774 us/op 19.501 us/op 1.01
BLS aggregatePubkeys 128 - blst 71.518 us/op 70.387 us/op 1.02
getSlashingsAndExits - default max 45.195 us/op 40.312 us/op 1.12
getSlashingsAndExits - 2k 543.80 us/op 369.44 us/op 1.47
proposeBlockBody type=full, size=empty 748.05 us/op 853.92 us/op 0.88
isKnown best case - 1 super set check 172.00 ns/op 171.00 ns/op 1.01
isKnown normal case - 2 super set checks 178.00 ns/op 170.00 ns/op 1.05
isKnown worse case - 16 super set checks 171.00 ns/op 168.00 ns/op 1.02
validate api signedAggregateAndProof - struct 1.5031 ms/op 1.5440 ms/op 0.97
validate gossip signedAggregateAndProof - struct 1.4992 ms/op 1.5431 ms/op 0.97
batch validate gossip attestation - vc 640000 - chunk 32 128.48 us/op 129.07 us/op 1.00
batch validate gossip attestation - vc 640000 - chunk 64 108.25 us/op 109.11 us/op 0.99
batch validate gossip attestation - vc 640000 - chunk 128 100.59 us/op 98.489 us/op 1.02
batch validate gossip attestation - vc 640000 - chunk 256 107.95 us/op 99.240 us/op 1.09
bytes32 toHexString 312.00 ns/op 296.00 ns/op 1.05
bytes32 Buffer.toString(hex) 176.00 ns/op 181.00 ns/op 0.97
bytes32 Buffer.toString(hex) from Uint8Array 247.00 ns/op 250.00 ns/op 0.99
bytes32 Buffer.toString(hex) + 0x 175.00 ns/op 182.00 ns/op 0.96
Return object 10000 times 0.21580 ns/op 0.21800 ns/op 0.99
Throw Error 10000 times 3.5438 us/op 3.3667 us/op 1.05
toHex 94.154 ns/op 104.75 ns/op 0.90
Buffer.from 86.357 ns/op 92.948 ns/op 0.93
shared Buffer 58.090 ns/op 61.184 ns/op 0.95
fastMsgIdFn sha256 / 200 bytes 1.4930 us/op 1.5060 us/op 0.99
fastMsgIdFn h32 xxhash / 200 bytes 158.00 ns/op 164.00 ns/op 0.96
fastMsgIdFn h64 xxhash / 200 bytes 214.00 ns/op 215.00 ns/op 1.00
fastMsgIdFn sha256 / 1000 bytes 4.7940 us/op 4.8470 us/op 0.99
fastMsgIdFn h32 xxhash / 1000 bytes 252.00 ns/op 257.00 ns/op 0.98
fastMsgIdFn h64 xxhash / 1000 bytes 259.00 ns/op 265.00 ns/op 0.98
fastMsgIdFn sha256 / 10000 bytes 42.167 us/op 42.496 us/op 0.99
fastMsgIdFn h32 xxhash / 10000 bytes 1.2870 us/op 1.2860 us/op 1.00
fastMsgIdFn h64 xxhash / 10000 bytes 841.00 ns/op 827.00 ns/op 1.02
send data - 1000 256B messages 4.4702 ms/op 4.3512 ms/op 1.03
send data - 1000 512B messages 5.2897 ms/op 5.3499 ms/op 0.99
send data - 1000 1024B messages 6.1778 ms/op 5.7252 ms/op 1.08
send data - 1000 1200B messages 12.313 ms/op 6.5103 ms/op 1.89
send data - 1000 2048B messages 16.930 ms/op 15.136 ms/op 1.12
send data - 1000 4096B messages 156.02 ms/op 110.02 ms/op 1.42
send data - 1000 16384B messages 692.42 ms/op 434.02 ms/op 1.60
send data - 1000 65536B messages 2.6727 s/op 1.8759 s/op 1.42
enrSubnets - fastDeserialize 64 bits 796.00 ns/op 769.00 ns/op 1.04
enrSubnets - ssz BitVector 64 bits 277.00 ns/op 274.00 ns/op 1.01
enrSubnets - fastDeserialize 4 bits 102.00 ns/op 108.00 ns/op 0.94
enrSubnets - ssz BitVector 4 bits 280.00 ns/op 283.00 ns/op 0.99
prioritizePeers score -10:0 att 32-0.1 sync 2-0 245.03 us/op 209.64 us/op 1.17
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 251.59 us/op 237.48 us/op 1.06
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 361.50 us/op 344.38 us/op 1.05
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 627.16 us/op 610.43 us/op 1.03
prioritizePeers score 0:0 att 64-1 sync 4-1 727.31 us/op 719.91 us/op 1.01
array of 16000 items push then shift 1.2872 us/op 1.3325 us/op 0.97
LinkedList of 16000 items push then shift 8.3970 ns/op 7.8060 ns/op 1.08
array of 16000 items push then pop 88.860 ns/op 83.962 ns/op 1.06
LinkedList of 16000 items push then pop 6.6280 ns/op 6.2200 ns/op 1.07
array of 24000 items push then shift 1.9137 us/op 1.9753 us/op 0.97
LinkedList of 24000 items push then shift 8.0800 ns/op 7.2460 ns/op 1.12
array of 24000 items push then pop 125.63 ns/op 120.11 ns/op 1.05
LinkedList of 24000 items push then pop 7.1460 ns/op 6.2140 ns/op 1.15
intersect bitArray bitLen 8 3.8850 ns/op 3.9220 ns/op 0.99
intersect array and set length 8 30.514 ns/op 29.988 ns/op 1.02
intersect bitArray bitLen 128 23.421 ns/op 23.754 ns/op 0.99
intersect array and set length 128 518.09 ns/op 506.74 ns/op 1.02
bitArray.getTrueBitIndexes() bitLen 128 1.0980 us/op 955.00 ns/op 1.15
bitArray.getTrueBitIndexes() bitLen 248 1.8630 us/op 1.7180 us/op 1.08
bitArray.getTrueBitIndexes() bitLen 512 3.8850 us/op 3.6720 us/op 1.06
Full columns - reconstruct all 6 blobs 208.52 us/op 171.31 us/op 1.22
Full columns - reconstruct half of the blobs out of 6 99.645 us/op 77.335 us/op 1.29
Full columns - reconstruct single blob out of 6 39.597 us/op 38.550 us/op 1.03
Half columns - reconstruct all 6 blobs 410.55 ms/op 401.72 ms/op 1.02
Half columns - reconstruct half of the blobs out of 6 202.54 ms/op 199.98 ms/op 1.01
Half columns - reconstruct single blob out of 6 72.351 ms/op 71.689 ms/op 1.01
Set add up to 64 items then delete first 2.8379 us/op 1.6723 us/op 1.70
OrderedSet add up to 64 items then delete first 4.0656 us/op 2.5408 us/op 1.60
Set add up to 64 items then delete last 2.6366 us/op 1.8735 us/op 1.41
OrderedSet add up to 64 items then delete last 3.5801 us/op 2.7856 us/op 1.29
Set add up to 64 items then delete middle 2.8313 us/op 1.8737 us/op 1.51
OrderedSet add up to 64 items then delete middle 7.0566 us/op 4.2886 us/op 1.65
Set add up to 128 items then delete first 5.8647 us/op 3.7222 us/op 1.58
OrderedSet add up to 128 items then delete first 8.4653 us/op 5.7567 us/op 1.47
Set add up to 128 items then delete last 4.5193 us/op 3.5562 us/op 1.27
OrderedSet add up to 128 items then delete last 7.1752 us/op 5.4019 us/op 1.33
Set add up to 128 items then delete middle 5.1885 us/op 3.5824 us/op 1.45
OrderedSet add up to 128 items then delete middle 14.244 us/op 11.318 us/op 1.26
Set add up to 256 items then delete first 12.108 us/op 7.6690 us/op 1.58
OrderedSet add up to 256 items then delete first 17.093 us/op 12.318 us/op 1.39
Set add up to 256 items then delete last 9.4174 us/op 7.0721 us/op 1.33
OrderedSet add up to 256 items then delete last 17.584 us/op 11.576 us/op 1.52
Set add up to 256 items then delete middle 10.644 us/op 7.1115 us/op 1.50
OrderedSet add up to 256 items then delete middle 40.435 us/op 35.875 us/op 1.13
runFastConfirmationRules vc:100000 bc:96 eq:0 6.1192 ms/op 4.7644 ms/op 1.28
runFastConfirmationRules vc:600000 bc:96 eq:0 38.953 ms/op 36.610 ms/op 1.06
runFastConfirmationRules vc:1000000 bc:96 eq:0 60.957 ms/op 60.684 ms/op 1.00
runFastConfirmationRules vc:600000 bc:320 eq:0 36.209 ms/op 38.419 ms/op 0.94
runFastConfirmationRules vc:100000 bc:96 eq:1000 1.2032 s/op 1.1826 s/op 1.02
pass gossip attestations to forkchoice per slot 2.5137 ms/op 2.6238 ms/op 0.96
forkChoice updateHead vc 100000 bc 64 eq 0 387.14 us/op 419.52 us/op 0.92
forkChoice updateHead vc 600000 bc 64 eq 0 2.3920 ms/op 4.2020 ms/op 0.57
forkChoice updateHead vc 1000000 bc 64 eq 0 3.8646 ms/op 4.2272 ms/op 0.91
forkChoice updateHead vc 600000 bc 320 eq 0 2.3448 ms/op 2.5366 ms/op 0.92
forkChoice updateHead vc 600000 bc 1200 eq 0 2.3932 ms/op 2.6542 ms/op 0.90
forkChoice updateHead vc 600000 bc 7200 eq 0 3.9255 ms/op 3.0497 ms/op 1.29
forkChoice updateHead vc 600000 bc 64 eq 1000 2.3523 ms/op 2.5060 ms/op 0.94
forkChoice updateHead vc 600000 bc 64 eq 10000 2.4600 ms/op 2.6947 ms/op 0.91
forkChoice updateHead vc 600000 bc 64 eq 300000 6.9811 ms/op 7.3626 ms/op 0.95
computeDeltas 1400000 validators 0% inactive 11.943 ms/op 13.028 ms/op 0.92
computeDeltas 1400000 validators 10% inactive 11.332 ms/op 12.328 ms/op 0.92
computeDeltas 1400000 validators 20% inactive 10.486 ms/op 11.166 ms/op 0.94
computeDeltas 1400000 validators 50% inactive 8.5849 ms/op 9.2846 ms/op 0.92
computeDeltas 2100000 validators 0% inactive 17.681 ms/op 19.471 ms/op 0.91
computeDeltas 2100000 validators 10% inactive 17.120 ms/op 18.599 ms/op 0.92
computeDeltas 2100000 validators 20% inactive 15.734 ms/op 17.192 ms/op 0.92
computeDeltas 2100000 validators 50% inactive 10.563 ms/op 14.171 ms/op 0.75
altair processAttestation - 250000 vs - 7PWei normalcase 2.1616 ms/op 1.9039 ms/op 1.14
altair processAttestation - 250000 vs - 7PWei worstcase 3.2249 ms/op 2.6774 ms/op 1.20
altair processAttestation - setStatus - 1/6 committees join 102.51 us/op 104.48 us/op 0.98
altair processAttestation - setStatus - 1/3 committees join 197.86 us/op 201.60 us/op 0.98
altair processAttestation - setStatus - 1/2 committees join 293.75 us/op 292.61 us/op 1.00
altair processAttestation - setStatus - 2/3 committees join 377.33 us/op 373.27 us/op 1.01
altair processAttestation - setStatus - 4/5 committees join 542.68 us/op 534.19 us/op 1.02
altair processAttestation - setStatus - 100% committees join 650.95 us/op 630.37 us/op 1.03
altair processBlock - 250000 vs - 7PWei normalcase 5.8111 ms/op 4.7716 ms/op 1.22
altair processBlock - 250000 vs - 7PWei normalcase hashState 25.550 ms/op 21.518 ms/op 1.19
altair processBlock - 250000 vs - 7PWei worstcase 27.363 ms/op 25.179 ms/op 1.09
altair processBlock - 250000 vs - 7PWei worstcase hashState 60.005 ms/op 52.081 ms/op 1.15
phase0 processBlock - 250000 vs - 7PWei normalcase 1.5094 ms/op 1.2978 ms/op 1.16
phase0 processBlock - 250000 vs - 7PWei worstcase 21.728 ms/op 20.365 ms/op 1.07
altair processEth1Data - 250000 vs - 7PWei normalcase 313.62 us/op 296.94 us/op 1.06
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 3.1350 us/op 3.1590 us/op 0.99
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 20.474 us/op 20.233 us/op 1.01
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 5.5060 us/op 5.8330 us/op 0.94
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 3.7840 us/op 3.6330 us/op 1.04
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 89.333 us/op 92.295 us/op 0.97
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.4452 ms/op 1.4554 ms/op 0.99
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.9437 ms/op 1.9109 ms/op 1.02
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 2.1983 ms/op 1.9083 ms/op 1.15
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 6.1997 ms/op 3.7452 ms/op 1.66
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.2173 ms/op 2.1479 ms/op 1.03
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 5.6909 ms/op 4.1255 ms/op 1.38
Tree 40 250000 create 422.59 ms/op 327.31 ms/op 1.29
Tree 40 250000 get(125000) 93.234 ns/op 96.912 ns/op 0.96
Tree 40 250000 set(125000) 1.2025 us/op 1.0679 us/op 1.13
Tree 40 250000 toArray() 17.739 ms/op 11.659 ms/op 1.52
Tree 40 250000 iterate all - toArray() + loop 19.973 ms/op 14.844 ms/op 1.35
Tree 40 250000 iterate all - get(i) 41.992 ms/op 41.583 ms/op 1.01
Array 250000 create 2.7052 ms/op 2.7041 ms/op 1.00
Array 250000 clone - spread 846.15 us/op 822.08 us/op 1.03
Array 250000 get(125000) 0.30200 ns/op 0.30400 ns/op 0.99
Array 250000 set(125000) 0.30200 ns/op 0.30600 ns/op 0.99
Array 250000 iterate all - loop 58.615 us/op 58.471 us/op 1.00
phase0 afterProcessEpoch - 250000 vs - 7PWei 39.553 ms/op 62.582 ms/op 0.63
Array.fill - length 1000000 6.0921 ms/op 4.1754 ms/op 1.46
Array push - length 1000000 16.801 ms/op 15.830 ms/op 1.06
Array.get 0.21094 ns/op 0.21205 ns/op 0.99
Uint8Array.get 0.25109 ns/op 0.23891 ns/op 1.05
phase0 beforeProcessEpoch - 250000 vs - 7PWei 21.299 ms/op 17.554 ms/op 1.21
altair processEpoch - mainnet_e81889 248.43 ms/op 218.84 ms/op 1.14
mainnet_e81889 - altair beforeProcessEpoch 24.547 ms/op 23.113 ms/op 1.06
mainnet_e81889 - altair processJustificationAndFinalization 5.8440 us/op 4.4750 us/op 1.31
mainnet_e81889 - altair processInactivityUpdates 6.3578 ms/op 3.6115 ms/op 1.76
mainnet_e81889 - altair processRewardsAndPenalties 19.633 ms/op 18.623 ms/op 1.05
mainnet_e81889 - altair processRegistryUpdates 574.00 ns/op 585.00 ns/op 0.98
mainnet_e81889 - altair processSlashings 147.00 ns/op 145.00 ns/op 1.01
mainnet_e81889 - altair processEth1DataReset 142.00 ns/op 139.00 ns/op 1.02
mainnet_e81889 - altair processEffectiveBalanceUpdates 4.8147 ms/op 1.7427 ms/op 2.76
mainnet_e81889 - altair processSlashingsReset 718.00 ns/op 719.00 ns/op 1.00
mainnet_e81889 - altair processRandaoMixesReset 988.00 ns/op 928.00 ns/op 1.06
mainnet_e81889 - altair processHistoricalRootsUpdate 166.00 ns/op 145.00 ns/op 1.14
mainnet_e81889 - altair processParticipationFlagUpdates 467.00 ns/op 448.00 ns/op 1.04
mainnet_e81889 - altair processSyncCommitteeUpdates 114.00 ns/op 114.00 ns/op 1.00
mainnet_e81889 - altair afterProcessEpoch 42.037 ms/op 42.337 ms/op 0.99
capella processEpoch - mainnet_e217614 759.92 ms/op 688.86 ms/op 1.10
mainnet_e217614 - capella beforeProcessEpoch 70.199 ms/op 67.526 ms/op 1.04
mainnet_e217614 - capella processJustificationAndFinalization 4.5800 us/op 4.6770 us/op 0.98
mainnet_e217614 - capella processInactivityUpdates 16.243 ms/op 13.203 ms/op 1.23
mainnet_e217614 - capella processRewardsAndPenalties 93.093 ms/op 95.492 ms/op 0.97
mainnet_e217614 - capella processRegistryUpdates 4.4740 us/op 4.5350 us/op 0.99
mainnet_e217614 - capella processSlashings 143.00 ns/op 144.00 ns/op 0.99
mainnet_e217614 - capella processEth1DataReset 142.00 ns/op 141.00 ns/op 1.01
mainnet_e217614 - capella processEffectiveBalanceUpdates 15.168 ms/op 9.4884 ms/op 1.60
mainnet_e217614 - capella processSlashingsReset 685.00 ns/op 703.00 ns/op 0.97
mainnet_e217614 - capella processRandaoMixesReset 947.00 ns/op 960.00 ns/op 0.99
mainnet_e217614 - capella processHistoricalRootsUpdate 143.00 ns/op 145.00 ns/op 0.99
mainnet_e217614 - capella processParticipationFlagUpdates 463.00 ns/op 455.00 ns/op 1.02
mainnet_e217614 - capella afterProcessEpoch 106.42 ms/op 113.88 ms/op 0.93
phase0 processEpoch - mainnet_e58758 222.47 ms/op 210.28 ms/op 1.06
mainnet_e58758 - phase0 beforeProcessEpoch 53.143 ms/op 48.455 ms/op 1.10
mainnet_e58758 - phase0 processJustificationAndFinalization 5.4550 us/op 4.6070 us/op 1.18
mainnet_e58758 - phase0 processRewardsAndPenalties 17.209 ms/op 16.556 ms/op 1.04
mainnet_e58758 - phase0 processRegistryUpdates 2.2180 us/op 2.3280 us/op 0.95
mainnet_e58758 - phase0 processSlashings 143.00 ns/op 141.00 ns/op 1.01
mainnet_e58758 - phase0 processEth1DataReset 139.00 ns/op 158.00 ns/op 0.88
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 806.16 us/op 834.28 us/op 0.97
mainnet_e58758 - phase0 processSlashingsReset 902.00 ns/op 907.00 ns/op 0.99
mainnet_e58758 - phase0 processRandaoMixesReset 1.0170 us/op 965.00 ns/op 1.05
mainnet_e58758 - phase0 processHistoricalRootsUpdate 143.00 ns/op 143.00 ns/op 1.00
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.0290 us/op 940.00 ns/op 1.09
mainnet_e58758 - phase0 afterProcessEpoch 33.888 ms/op 34.481 ms/op 0.98
phase0 processEffectiveBalanceUpdates - 250000 normalcase 972.57 us/op 1.0125 ms/op 0.96
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.5714 ms/op 1.2350 ms/op 1.27
altair processInactivityUpdates - 250000 normalcase 14.335 ms/op 11.126 ms/op 1.29
altair processInactivityUpdates - 250000 worstcase 14.854 ms/op 11.200 ms/op 1.33
phase0 processRegistryUpdates - 250000 normalcase 2.2020 us/op 2.2840 us/op 0.96
phase0 processRegistryUpdates - 250000 badcase_full_deposits 135.37 us/op 144.50 us/op 0.94
phase0 processRegistryUpdates - 250000 worstcase 0.5 58.251 ms/op 61.280 ms/op 0.95
altair processRewardsAndPenalties - 250000 normalcase 14.493 ms/op 16.376 ms/op 0.89
altair processRewardsAndPenalties - 250000 worstcase 14.232 ms/op 15.821 ms/op 0.90
phase0 getAttestationDeltas - 250000 normalcase 6.3304 ms/op 5.7507 ms/op 1.10
phase0 getAttestationDeltas - 250000 worstcase 7.7739 ms/op 5.8089 ms/op 1.34
phase0 processSlashings - 250000 worstcase 58.294 us/op 62.165 us/op 0.94
altair processSyncCommitteeUpdates - 250000 9.6010 ms/op 10.092 ms/op 0.95
BeaconState.hashTreeRoot - No change 176.00 ns/op 177.00 ns/op 0.99
BeaconState.hashTreeRoot - 1 full validator 81.162 us/op 77.599 us/op 1.05
BeaconState.hashTreeRoot - 32 full validator 873.50 us/op 889.07 us/op 0.98
BeaconState.hashTreeRoot - 512 full validator 8.2824 ms/op 8.1333 ms/op 1.02
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 98.558 us/op 95.864 us/op 1.03
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.4622 ms/op 1.4311 ms/op 1.02
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 18.788 ms/op 16.356 ms/op 1.15
BeaconState.hashTreeRoot - 1 balances 81.771 us/op 76.249 us/op 1.07
BeaconState.hashTreeRoot - 32 balances 773.93 us/op 792.05 us/op 0.98
BeaconState.hashTreeRoot - 512 balances 6.5207 ms/op 5.8638 ms/op 1.11
BeaconState.hashTreeRoot - 250000 balances 144.19 ms/op 125.54 ms/op 1.15
aggregationBits - 2048 els - zipIndexesInBitList 19.580 us/op 20.488 us/op 0.96
regular array get 100000 times 22.371 us/op 23.426 us/op 0.95
wrappedArray get 100000 times 22.228 us/op 23.548 us/op 0.94
arrayWithProxy get 100000 times 9.3922 ms/op 10.138 ms/op 0.93
ssz.Root.equals 20.890 ns/op 21.812 ns/op 0.96
byteArrayEquals 21.001 ns/op 21.640 ns/op 0.97
Buffer.compare 8.6820 ns/op 8.9540 ns/op 0.97
processSlot - 1 slots 11.392 us/op 8.8930 us/op 1.28
processSlot - 32 slots 2.3405 ms/op 2.1556 ms/op 1.09
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 7.0699 ms/op 3.9788 ms/op 1.78
getCommitteeAssignments - req 1 vs - 250000 vc 1.6041 ms/op 1.9002 ms/op 0.84
getCommitteeAssignments - req 100 vs - 250000 vc 3.2711 ms/op 3.4900 ms/op 0.94
getCommitteeAssignments - req 1000 vs - 250000 vc 3.5118 ms/op 3.7410 ms/op 0.94
findModifiedValidators - 10000 modified validators 798.57 ms/op 826.66 ms/op 0.97
findModifiedValidators - 1000 modified validators 549.27 ms/op 582.18 ms/op 0.94
findModifiedValidators - 100 modified validators 374.57 ms/op 353.25 ms/op 1.06
findModifiedValidators - 10 modified validators 309.67 ms/op 296.41 ms/op 1.04
findModifiedValidators - 1 modified validators 301.17 ms/op 249.50 ms/op 1.21
findModifiedValidators - no difference 225.32 ms/op 194.70 ms/op 1.16
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.3800 ns/op 3.6600 ns/op 0.92
state getBlockRootAtSlot - 250000 vs - 7PWei 385.07 ns/op 276.27 ns/op 1.39
computeProposerIndex 100000 validators 1.3207 ms/op 1.3767 ms/op 0.96
getNextSyncCommitteeIndices 1000 validators 2.8110 ms/op 2.8467 ms/op 0.99
getNextSyncCommitteeIndices 10000 validators 24.704 ms/op 25.406 ms/op 0.97
getNextSyncCommitteeIndices 100000 validators 88.342 ms/op 87.199 ms/op 1.01
computeProposers - vc 250000 552.01 us/op 572.44 us/op 0.96
computeEpochShuffling - vc 250000 38.617 ms/op 38.879 ms/op 0.99
getNextSyncCommittee - vc 250000 9.3237 ms/op 9.3419 ms/op 1.00
nodejs block root to RootHex using toHex 93.050 ns/op 103.79 ns/op 0.90
nodejs block root to RootHex using toRootHex 60.658 ns/op 66.496 ns/op 0.91
nodejs fromHex(blob) 801.70 us/op 934.61 us/op 0.86
nodejs fromHexInto(blob) 615.31 us/op 652.34 us/op 0.94
nodejs block root to RootHex using the deprecated toHexString 637.24 ns/op 625.11 ns/op 1.02
nodejs byteArrayEquals 32 bytes (block root) 25.546 ns/op 25.353 ns/op 1.01
nodejs byteArrayEquals 48 bytes (pubkey) 36.635 ns/op 36.665 ns/op 1.00
nodejs byteArrayEquals 96 bytes (signature) 34.010 ns/op 40.320 ns/op 0.84
nodejs byteArrayEquals 1024 bytes 43.371 ns/op 43.351 ns/op 1.00
nodejs byteArrayEquals 131072 bytes (blob) 1.7401 us/op 1.7419 us/op 1.00
browser block root to RootHex using toHex 141.93 ns/op 146.37 ns/op 0.97
browser block root to RootHex using toRootHex 128.25 ns/op 128.99 ns/op 0.99
browser fromHex(blob) 1.7250 ms/op 1.6804 ms/op 1.03
browser fromHexInto(blob) 632.88 us/op 651.73 us/op 0.97
browser block root to RootHex using the deprecated toHexString 409.60 ns/op 410.79 ns/op 1.00
browser byteArrayEquals 32 bytes (block root) 27.601 ns/op 27.310 ns/op 1.01
browser byteArrayEquals 48 bytes (pubkey) 38.782 ns/op 38.499 ns/op 1.01
browser byteArrayEquals 96 bytes (signature) 73.459 ns/op 72.003 ns/op 1.02
browser byteArrayEquals 1024 bytes 746.03 ns/op 733.10 ns/op 1.02
browser byteArrayEquals 131072 bytes (blob) 93.856 us/op 92.639 us/op 1.01

by benchmarkbot/action

@GrapeBaBa GrapeBaBa changed the title perf(state-transition): use native PTC sampling (WIP)perf(state-transition): use native PTC sampling Aug 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

Gloas/Heze mainnet sanity/slots/historical_accumulator spec test is ~7.5x slower than pre-Gloas forks

1 participant