2021-01-28 15:55:02 +00:00
|
|
|
package aggregation
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/prysmaticlabs/go-bitfield"
|
2021-09-21 19:59:25 +00:00
|
|
|
"github.com/prysmaticlabs/prysm/config/params"
|
2021-09-20 16:17:03 +00:00
|
|
|
aggtesting "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/attestation/aggregation/testing"
|
2021-01-28 15:55:02 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func BenchmarkMaxCoverProblem_MaxCover(b *testing.B) {
|
|
|
|
bitlistLen := params.BeaconConfig().MaxValidatorsPerCommittee
|
|
|
|
tests := []struct {
|
|
|
|
numCandidates uint64
|
|
|
|
numMarkedBits uint64
|
|
|
|
allowOverlaps bool
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
numCandidates: 32,
|
|
|
|
numMarkedBits: 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 128,
|
|
|
|
numMarkedBits: 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 256,
|
|
|
|
numMarkedBits: 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 32,
|
|
|
|
numMarkedBits: 8,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 1024,
|
|
|
|
numMarkedBits: 8,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 2048,
|
|
|
|
numMarkedBits: 8,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 1024,
|
|
|
|
numMarkedBits: 32,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 2048,
|
|
|
|
numMarkedBits: 32,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 1024,
|
|
|
|
numMarkedBits: 128,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 2048,
|
|
|
|
numMarkedBits: 128,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 1024,
|
|
|
|
numMarkedBits: 512,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
numCandidates: 2048,
|
|
|
|
numMarkedBits: 512,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
|
|
name := fmt.Sprintf("%d_attestations_with_%d_bit(s)_set", tt.numCandidates, tt.numMarkedBits)
|
|
|
|
b.Run(fmt.Sprintf("cur_%s", name), func(b *testing.B) {
|
|
|
|
b.StopTimer()
|
|
|
|
var bitlists []bitfield.Bitlist
|
|
|
|
if tt.numMarkedBits == 1 {
|
|
|
|
bitlists = aggtesting.BitlistsWithSingleBitSet(tt.numCandidates, bitlistLen)
|
|
|
|
} else {
|
|
|
|
bitlists = aggtesting.BitlistsWithMultipleBitSet(b, tt.numCandidates, bitlistLen, tt.numMarkedBits)
|
|
|
|
|
|
|
|
}
|
|
|
|
b.StartTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
candidates := make([]*MaxCoverCandidate, len(bitlists))
|
|
|
|
for i := 0; i < len(bitlists); i++ {
|
|
|
|
candidates[i] = NewMaxCoverCandidate(i, &bitlists[i])
|
|
|
|
}
|
|
|
|
mc := &MaxCoverProblem{Candidates: candidates}
|
|
|
|
_, err := mc.Cover(len(bitlists), tt.allowOverlaps)
|
|
|
|
_ = err
|
|
|
|
}
|
|
|
|
})
|
|
|
|
b.Run(fmt.Sprintf("new_%s", name), func(b *testing.B) {
|
|
|
|
b.StopTimer()
|
|
|
|
var bitlists []*bitfield.Bitlist64
|
|
|
|
if tt.numMarkedBits == 1 {
|
|
|
|
bitlists = aggtesting.Bitlists64WithSingleBitSet(tt.numCandidates, bitlistLen)
|
|
|
|
} else {
|
|
|
|
bitlists = aggtesting.Bitlists64WithMultipleBitSet(b, tt.numCandidates, bitlistLen, tt.numMarkedBits)
|
|
|
|
|
|
|
|
}
|
|
|
|
b.StartTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
_, _, err := MaxCover(bitlists, len(bitlists), tt.allowOverlaps)
|
|
|
|
_ = err
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|