Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimize fork-choice iterators #3125

Merged
merged 1 commit into from
Sep 13, 2021
Merged

Conversation

dapplion
Copy link
Contributor

@dapplion dapplion commented Sep 13, 2021

Motivation

ForkChoice iterates over the proto array in suboptimal ways.

Description

Closes #3105

@codecov
Copy link

codecov bot commented Sep 13, 2021

Codecov Report

Merging #3125 (e05bc72) into master (ec7e419) will increase coverage by 0.02%.
The diff coverage is n/a.

❗ Current head e05bc72 differs from pull request most recent head 3781dd4. Consider uploading reports for the commit 3781dd4 to get more accurate results

@@            Coverage Diff             @@
##           master    #3125      +/-   ##
==========================================
+ Coverage   59.02%   59.05%   +0.02%     
==========================================
  Files         376      376              
  Lines        9074     9070       -4     
  Branches     1343     1342       -1     
==========================================
  Hits         5356     5356              
+ Misses       3336     3332       -4     
  Partials      382      382              

@codeclimate
Copy link

codeclimate bot commented Sep 13, 2021

Code Climate has analyzed commit 3781dd4 and detected 1 issue on this pull request.

Here's the issue category breakdown:

Category Count
Complexity 1

View more on Code Climate.

@github-actions
Copy link
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: e05bc72 Previous: ec7e419 Ratio
BeaconState.hashTreeRoot - No change 905.00 ns/op 854.00 ns/op 1.06
BeaconState.hashTreeRoot - 1 full validator 95.843 us/op 100.76 us/op 0.95
BeaconState.hashTreeRoot - 32 full validator 1.3358 ms/op 1.4670 ms/op 0.91
BeaconState.hashTreeRoot - 512 full validator 17.823 ms/op 18.399 ms/op 0.97
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 92.564 us/op 98.558 us/op 0.94
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.5198 ms/op 1.4881 ms/op 1.02
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 22.781 ms/op 20.478 ms/op 1.11
BeaconState.hashTreeRoot - 1 balances 66.046 us/op 75.831 us/op 0.87
BeaconState.hashTreeRoot - 32 balances 607.91 us/op 662.43 us/op 0.92
BeaconState.hashTreeRoot - 512 balances 6.5168 ms/op 6.0062 ms/op 1.09
BeaconState.hashTreeRoot - 250000 balances 108.52 ms/op 128.15 ms/op 0.85
processSlot - 1 slots 48.099 us/op 58.620 us/op 0.82
processSlot - 32 slots 2.7087 ms/op 3.0516 ms/op 0.89
getCommitteeAssignments - req 1 vs - 250000 vc 6.2953 ms/op 5.5145 ms/op 1.14
getCommitteeAssignments - req 100 vs - 250000 vc 8.6730 ms/op 7.6576 ms/op 1.13
getCommitteeAssignments - req 1000 vs - 250000 vc 9.2195 ms/op 8.2337 ms/op 1.12
computeProposers - vc 250000 26.120 ms/op 26.950 ms/op 0.97
computeEpochShuffling - vc 250000 233.74 ms/op 213.18 ms/op 1.10
getNextSyncCommittee - vc 250000 426.99 ms/op 420.12 ms/op 1.02
altair processBlock - 250000 vs - 7PWei normalcase 92.785 ms/op 104.91 ms/op 0.88
altair processBlock - 250000 vs - 7PWei worstcase 245.26 ms/op 271.10 ms/op 0.90
altair processEpoch - pyrmont_e62330 592.41 ms/op 578.75 ms/op 1.02
pyrmont_e62330 - altair beforeProcessEpoch 170.17 ms/op 180.89 ms/op 0.94
pyrmont_e62330 - altair processJustificationAndFinalization 75.718 us/op 133.73 us/op 0.57
pyrmont_e62330 - altair processInactivityUpdates 83.843 ms/op 76.353 ms/op 1.10
pyrmont_e62330 - altair processRewardsAndPenalties 64.873 ms/op 65.220 ms/op 0.99
pyrmont_e62330 - altair processRegistryUpdates 12.316 us/op 22.547 us/op 0.55
pyrmont_e62330 - altair processSlashings 3.1180 us/op 6.1700 us/op 0.51
pyrmont_e62330 - altair processEth1DataReset 2.8210 us/op 6.3550 us/op 0.44
pyrmont_e62330 - altair processEffectiveBalanceUpdates 6.8680 ms/op 6.6950 ms/op 1.03
pyrmont_e62330 - altair processSlashingsReset 19.295 us/op 31.391 us/op 0.61
pyrmont_e62330 - altair processRandaoMixesReset 23.803 us/op 49.831 us/op 0.48
pyrmont_e62330 - altair processHistoricalRootsUpdate 3.4520 us/op 7.7710 us/op 0.44
pyrmont_e62330 - altair processParticipationFlagUpdates 61.624 ms/op 52.277 ms/op 1.18
pyrmont_e62330 - altair processSyncCommitteeUpdates 3.1860 us/op 5.3890 us/op 0.59
pyrmont_e62330 - altair afterProcessEpoch 140.83 ms/op 150.42 ms/op 0.94
altair processInactivityUpdates - 250000 normalcase 238.19 ms/op 247.38 ms/op 0.96
altair processInactivityUpdates - 250000 worstcase 243.38 ms/op 245.44 ms/op 0.99
altair processParticipationFlagUpdates - 250000 anycase 113.01 ms/op 107.27 ms/op 1.05
altair processRewardsAndPenalties - 250000 normalcase 134.38 ms/op 138.66 ms/op 0.97
altair processRewardsAndPenalties - 250000 worstcase 149.76 ms/op 150.31 ms/op 1.00
altair processSyncCommitteeUpdates - 250000 445.49 ms/op 469.44 ms/op 0.95
Tree 40 250000 create 543.02 ms/op 654.94 ms/op 0.83
Tree 40 250000 get(125000) 323.58 ns/op 294.72 ns/op 1.10
Tree 40 250000 set(125000) 1.6865 us/op 2.1869 us/op 0.77
Tree 40 250000 toArray() 45.450 ms/op 47.629 ms/op 0.95
Tree 40 250000 iterate all - toArray() + loop 44.956 ms/op 47.819 ms/op 0.94
Tree 40 250000 iterate all - get(i) 124.35 ms/op 127.27 ms/op 0.98
MutableVector 250000 create 25.837 ms/op 26.432 ms/op 0.98
MutableVector 250000 get(125000) 15.693 ns/op 15.987 ns/op 0.98
MutableVector 250000 set(125000) 700.66 ns/op 650.79 ns/op 1.08
MutableVector 250000 toArray() 9.3022 ms/op 9.3070 ms/op 1.00
MutableVector 250000 iterate all - toArray() + loop 9.3450 ms/op 9.3500 ms/op 1.00
MutableVector 250000 iterate all - get(i) 3.9001 ms/op 4.3193 ms/op 0.90
Array 250000 create 6.4555 ms/op 5.8340 ms/op 1.11
Array 250000 clone - spread 2.4967 ms/op 2.0609 ms/op 1.21
Array 250000 get(125000) 1.3560 ns/op 0.95200 ns/op 1.42
Array 250000 set(125000) 1.3330 ns/op 0.93600 ns/op 1.42
Array 250000 iterate all - loop 202.78 us/op 148.23 us/op 1.37
aggregationBits - 2048 els - readonlyValues 315.91 us/op 275.19 us/op 1.15
aggregationBits - 2048 els - zipIndexesInBitList 56.785 us/op 47.810 us/op 1.19
ssz.Root.equals 1.7810 us/op 1.7110 us/op 1.04
ssz.Root.equals with valueOf() 2.0750 us/op 1.7960 us/op 1.16
byteArrayEquals with valueOf() 2.0200 us/op 1.7500 us/op 1.15
phase0 processBlock - 250000 vs - 7PWei normalcase 14.473 ms/op 16.777 ms/op 0.86
phase0 processBlock - 250000 vs - 7PWei worstcase 91.285 ms/op 105.14 ms/op 0.87
phase0 afterProcessEpoch - 250000 vs - 7PWei 252.02 ms/op 235.04 ms/op 1.07
phase0 beforeProcessEpoch - 250000 vs - 7PWei 663.49 ms/op 759.66 ms/op 0.87
phase0 processEpoch - mainnet_e58758 932.68 ms/op 1.0207 s/op 0.91
mainnet_e58758 - phase0 beforeProcessEpoch 524.86 ms/op 623.09 ms/op 0.84
mainnet_e58758 - phase0 processJustificationAndFinalization 95.845 us/op 146.91 us/op 0.65
mainnet_e58758 - phase0 processRewardsAndPenalties 92.018 ms/op 94.966 ms/op 0.97
mainnet_e58758 - phase0 processRegistryUpdates 60.613 us/op 101.86 us/op 0.60
mainnet_e58758 - phase0 processSlashings 3.1330 us/op 6.4300 us/op 0.49
mainnet_e58758 - phase0 processEth1DataReset 2.8280 us/op 6.0990 us/op 0.46
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 11.830 ms/op 11.658 ms/op 1.01
mainnet_e58758 - phase0 processSlashingsReset 15.673 us/op 31.758 us/op 0.49
mainnet_e58758 - phase0 processRandaoMixesReset 21.748 us/op 46.283 us/op 0.47
mainnet_e58758 - phase0 processHistoricalRootsUpdate 3.7260 us/op 7.6080 us/op 0.49
mainnet_e58758 - phase0 processParticipationRecordUpdates 15.658 us/op 28.135 us/op 0.56
mainnet_e58758 - phase0 afterProcessEpoch 222.45 ms/op 205.79 ms/op 1.08
phase0 processEffectiveBalanceUpdates - 250000 normalcase 13.168 ms/op 12.642 ms/op 1.04
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.5567 s/op 1.8826 s/op 0.83
phase0 processRegistryUpdates - 250000 normalcase 58.323 us/op 98.066 us/op 0.59
phase0 processRegistryUpdates - 250000 badcase_full_deposits 4.0834 ms/op 4.9406 ms/op 0.83
phase0 processRegistryUpdates - 250000 worstcase 0.5 2.0065 s/op 2.4280 s/op 0.83
phase0 getAttestationDeltas - 250000 normalcase 40.430 ms/op 43.830 ms/op 0.92
phase0 getAttestationDeltas - 250000 worstcase 40.617 ms/op 44.309 ms/op 0.92
phase0 processSlashings - 250000 worstcase 43.131 ms/op 43.512 ms/op 0.99
shuffle list - 16384 els 15.368 ms/op 14.551 ms/op 1.06
shuffle list - 250000 els 218.78 ms/op 202.50 ms/op 1.08
getEffectiveBalances - 250000 vs - 7PWei 12.922 ms/op 13.469 ms/op 0.96
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 2.4091 ms/op 2.5409 ms/op 0.95
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 1.2005 ms/op 1.2162 ms/op 0.99
BLS verify - blst-native 2.2335 ms/op 2.3050 ms/op 0.97
BLS verifyMultipleSignatures 3 - blst-native 4.5809 ms/op 4.7097 ms/op 0.97
BLS verifyMultipleSignatures 8 - blst-native 9.8716 ms/op 10.670 ms/op 0.93
BLS verifyMultipleSignatures 32 - blst-native 35.791 ms/op 37.044 ms/op 0.97
BLS aggregatePubkeys 32 - blst-native 47.972 us/op 50.008 us/op 0.96
BLS aggregatePubkeys 128 - blst-native 187.19 us/op 197.18 us/op 0.95
getAttestationsForBlock 93.701 ms/op 92.286 ms/op 1.02
CheckpointStateCache - add get delete 18.352 us/op 20.263 us/op 0.91
validate gossip signedAggregateAndProof - struct 5.3751 ms/op 5.9944 ms/op 0.90
validate gossip signedAggregateAndProof - treeBacked 5.2560 ms/op 5.5513 ms/op 0.95
validate gossip attestation - struct 2.4855 ms/op 2.6961 ms/op 0.92
validate gossip attestation - treeBacked 2.4990 ms/op 2.6868 ms/op 0.93

by benchmarkbot/action

@wemeetagain wemeetagain merged commit 26bd594 into master Sep 13, 2021
@wemeetagain wemeetagain deleted the dapplion/fork-choice-iterators branch September 13, 2021 15:43
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.

Optimize fork choice methods that iterate
3 participants