Skip to content

Commit ba1703f

Browse files
authored
peerstore: fix addressbook benchmark timing (#3092)
1 parent 37fbd7e commit ba1703f

File tree

2 files changed

+60
-120
lines changed

2 files changed

+60
-120
lines changed
Lines changed: 55 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,70 @@
11
package test
22

33
import (
4-
"context"
54
"fmt"
6-
"sort"
75
"testing"
86

97
pstore "github.com/libp2p/go-libp2p/core/peerstore"
108
)
119

12-
var peerstoreBenchmarks = map[string]func(pstore.Peerstore, chan *peerpair) func(*testing.B){
13-
"AddAddrs": benchmarkAddAddrs,
14-
"SetAddrs": benchmarkSetAddrs,
15-
"GetAddrs": benchmarkGetAddrs,
16-
// The in-between get allows us to benchmark the read-through cache.
17-
"AddGetAndClearAddrs": benchmarkAddGetAndClearAddrs,
18-
// Calls PeersWithAddr on a peerstore with 1000 peers.
19-
"Get1000PeersWithAddrs": benchmarkGet1000PeersWithAddrs,
20-
}
21-
2210
func BenchmarkPeerstore(b *testing.B, factory PeerstoreFactory, variant string) {
23-
// Parameterises benchmarks to tackle peers with 1, 10, 100 multiaddrs.
24-
params := []struct {
25-
n int
26-
ch chan *peerpair
27-
}{
28-
{1, make(chan *peerpair, 100)},
29-
{10, make(chan *peerpair, 100)},
30-
{100, make(chan *peerpair, 100)},
31-
}
32-
33-
ctx, cancel := context.WithCancel(context.Background())
34-
defer cancel()
35-
36-
// Start all test peer producing goroutines, where each produces peers with as many
37-
// multiaddrs as the n field in the param struct.
38-
for _, p := range params {
39-
go AddressProducer(ctx, b, p.ch, p.n)
40-
}
41-
42-
// So tests are always run in the same order.
43-
ordernames := make([]string, 0, len(peerstoreBenchmarks))
44-
for name := range peerstoreBenchmarks {
45-
ordernames = append(ordernames, name)
46-
}
47-
sort.Strings(ordernames)
48-
49-
for _, name := range ordernames {
50-
bench := peerstoreBenchmarks[name]
51-
for _, p := range params {
52-
// Create a new peerstore.
53-
ps, closeFunc := factory()
54-
55-
// Run the test.
56-
b.Run(fmt.Sprintf("%s-%dAddrs-%s", name, p.n, variant), bench(ps, p.ch))
57-
58-
// Cleanup.
59-
if closeFunc != nil {
60-
closeFunc()
11+
for _, sz := range []int{1, 10, 100} {
12+
const N = 10000
13+
peers := getPeerPairs(b, N, sz)
14+
15+
b.Run(fmt.Sprintf("AddAddrs-%d", sz), func(b *testing.B) {
16+
ps, cleanup := factory()
17+
defer cleanup()
18+
b.ResetTimer()
19+
for i := 0; i < b.N; i++ {
20+
pp := peers[i%N]
21+
ps.AddAddrs(pp.ID, pp.Addr, pstore.RecentlyConnectedAddrTTL)
6122
}
62-
}
63-
}
64-
}
65-
66-
func benchmarkAddAddrs(ps pstore.Peerstore, addrs chan *peerpair) func(*testing.B) {
67-
return func(b *testing.B) {
68-
b.ResetTimer()
69-
for i := 0; i < b.N; i++ {
70-
pp := <-addrs
71-
ps.AddAddrs(pp.ID, pp.Addr, pstore.PermanentAddrTTL)
72-
}
73-
}
74-
}
75-
76-
func benchmarkSetAddrs(ps pstore.Peerstore, addrs chan *peerpair) func(*testing.B) {
77-
return func(b *testing.B) {
78-
b.ResetTimer()
79-
for i := 0; i < b.N; i++ {
80-
pp := <-addrs
81-
ps.SetAddrs(pp.ID, pp.Addr, pstore.PermanentAddrTTL)
82-
}
83-
}
84-
}
85-
86-
func benchmarkGetAddrs(ps pstore.Peerstore, addrs chan *peerpair) func(*testing.B) {
87-
return func(b *testing.B) {
88-
pp := <-addrs
89-
ps.SetAddrs(pp.ID, pp.Addr, pstore.PermanentAddrTTL)
90-
91-
b.ResetTimer()
92-
for i := 0; i < b.N; i++ {
93-
_ = ps.Addrs(pp.ID)
94-
}
95-
}
96-
}
97-
98-
func benchmarkAddGetAndClearAddrs(ps pstore.Peerstore, addrs chan *peerpair) func(*testing.B) {
99-
return func(b *testing.B) {
100-
b.ResetTimer()
101-
for i := 0; i < b.N; i++ {
102-
pp := <-addrs
103-
ps.AddAddrs(pp.ID, pp.Addr, pstore.PermanentAddrTTL)
104-
ps.Addrs(pp.ID)
105-
ps.ClearAddrs(pp.ID)
106-
}
107-
}
108-
}
23+
})
24+
25+
b.Run(fmt.Sprintf("GetAddrs-%d", sz), func(b *testing.B) {
26+
ps, cleanup := factory()
27+
defer cleanup()
28+
b.ResetTimer()
29+
for i := 0; i < b.N; i++ {
30+
pp := peers[i%N]
31+
ps.SetAddrs(pp.ID, pp.Addr, pstore.RecentlyConnectedAddrTTL)
32+
}
33+
})
34+
35+
b.Run(fmt.Sprintf("GetAndClearAddrs-%d", sz), func(b *testing.B) {
36+
ps, cleanup := factory()
37+
defer cleanup()
38+
b.ResetTimer()
39+
for i := 0; i < b.N; i++ {
40+
pp := peers[i%N]
41+
ps.AddAddrs(pp.ID, pp.Addr, pstore.RecentlyConnectedAddrTTL)
42+
ps.Addrs(pp.ID)
43+
ps.ClearAddrs(pp.ID)
44+
}
45+
})
10946

110-
func benchmarkGet1000PeersWithAddrs(ps pstore.Peerstore, addrs chan *peerpair) func(*testing.B) {
111-
return func(b *testing.B) {
112-
var peers = make([]*peerpair, 1000)
113-
for i := range peers {
114-
pp := <-addrs
115-
ps.AddAddrs(pp.ID, pp.Addr, pstore.PermanentAddrTTL)
116-
peers[i] = pp
117-
}
47+
b.Run(fmt.Sprintf("PeersWithAddrs-%d", sz), func(b *testing.B) {
48+
ps, cleanup := factory()
49+
defer cleanup()
50+
for _, pp := range peers {
51+
ps.AddAddrs(pp.ID, pp.Addr, pstore.RecentlyConnectedAddrTTL)
52+
}
11853

119-
b.ResetTimer()
120-
for i := 0; i < b.N; i++ {
121-
_ = ps.PeersWithAddrs()
122-
}
54+
b.ResetTimer()
55+
for i := 0; i < b.N; i++ {
56+
_ = ps.PeersWithAddrs()
57+
}
58+
})
59+
60+
b.Run(fmt.Sprintf("SetAddrs-%d", sz), func(b *testing.B) {
61+
ps, cleanup := factory()
62+
defer cleanup()
63+
b.ResetTimer()
64+
for i := 0; i < b.N; i++ {
65+
pp := peers[i%N]
66+
ps.SetAddrs(pp.ID, pp.Addr, pstore.RecentlyConnectedAddrTTL)
67+
}
68+
})
12369
}
12470
}

p2p/host/peerstore/test/utils.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package test
22

33
import (
4-
"context"
54
"fmt"
65
"testing"
76

@@ -45,17 +44,12 @@ func RandomPeer(b *testing.B, addrCount int) *peerpair {
4544
return &peerpair{pid, addrs}
4645
}
4746

48-
func AddressProducer(ctx context.Context, b *testing.B, addrs chan *peerpair, addrsPerPeer int) {
49-
b.Helper()
50-
defer close(addrs)
51-
for {
52-
p := RandomPeer(b, addrsPerPeer)
53-
select {
54-
case addrs <- p:
55-
case <-ctx.Done():
56-
return
57-
}
47+
func getPeerPairs(b *testing.B, n int, addrsPerPeer int) []*peerpair {
48+
pps := make([]*peerpair, n)
49+
for i := 0; i < n; i++ {
50+
pps[i] = RandomPeer(b, addrsPerPeer)
5851
}
52+
return pps
5953
}
6054

6155
func GenerateAddrs(count int) []ma.Multiaddr {

0 commit comments

Comments
 (0)