@@ -2,16 +2,36 @@ package noise
22
33import (
44 "context"
5- "github.com/libp2p/go-libp2p-core/crypto"
6- "github.com/libp2p/go-libp2p-core/sec"
5+ "golang.org/x/crypto/poly1305"
76 "io"
87 "io/ioutil"
98 "math/rand"
109 "net"
1110 "testing"
1211 "time"
12+
13+ "github.com/libp2p/go-libp2p-core/crypto"
14+ "github.com/libp2p/go-libp2p-core/sec"
15+ )
16+
17+ type testMode int
18+
19+ const (
20+ readBufferGtEncMsg testMode = iota
21+ readBufferLtPlainText
1322)
1423
24+ var bcs = map [string ]struct {
25+ m testMode
26+ }{
27+ "readBuffer > encrypted message" : {
28+ readBufferGtEncMsg ,
29+ },
30+ "readBuffer < decrypted plaintext" : {
31+ readBufferLtPlainText ,
32+ },
33+ }
34+
1535func makeTransport (b * testing.B ) * Transport {
1636 b .Helper ()
1737
@@ -78,28 +98,48 @@ func (b benchenv) connect(stopTimer bool) (*secureSession, *secureSession) {
7898 return initSession .(* secureSession ), respSession .(* secureSession )
7999}
80100
81- func drain (r io.Reader , done chan <- error ) {
82- _ , err := io .Copy (ioutil . Discard , r )
101+ func drain (r io.Reader , done chan <- error , writeTo io. Writer ) {
102+ _ , err := io .Copy (writeTo , r )
83103 done <- err
84104}
85105
86- func sink (dst io.WriteCloser , src io.Reader , done chan <- error ) {
87- _ , err := io .Copy (dst , src )
106+ type discardWithBuffer struct {
107+ buf []byte
108+ io.Writer
109+ }
110+
111+ func (d * discardWithBuffer ) ReadFrom (r io.Reader ) (n int64 , err error ) {
112+ readSize := 0
113+ for {
114+ readSize , err = r .Read (d .buf )
115+ n += int64 (readSize )
116+ if err != nil {
117+ if err == io .EOF {
118+ return n , nil
119+ }
120+ return
121+ }
122+ }
123+ }
124+
125+ func sink (dst io.WriteCloser , src io.Reader , done chan <- error , buf []byte ) {
126+ _ , err := io .CopyBuffer (dst , src , buf )
88127 if err != nil {
89128 done <- err
90129 }
91130 done <- dst .Close ()
92131}
93132
94- func pipeRandom (src rand.Source , w io.WriteCloser , r io.Reader , n int64 ) error {
133+ func pipeRandom (src rand.Source , w io.WriteCloser , r io.Reader , n int64 , plainTextBuf []byte ,
134+ writeTo io.Writer ) error {
95135 rnd := rand .New (src )
96136 lr := io .LimitReader (rnd , n )
97137
98138 writeCh := make (chan error , 1 )
99139 readCh := make (chan error , 1 )
100140
101- go sink (w , lr , writeCh )
102- go drain (r , readCh )
141+ go sink (w , lr , writeCh , plainTextBuf )
142+ go drain (r , readCh , writeTo )
103143
104144 writeDone := false
105145 readDone := false
@@ -121,39 +161,74 @@ func pipeRandom(src rand.Source, w io.WriteCloser, r io.Reader, n int64) error {
121161 return nil
122162}
123163
124- func benchDataTransfer (b * benchenv , size int64 ) {
164+ func benchDataTransfer (b * benchenv , dataSize int64 , m testMode ) {
125165 var totalBytes int64
126166 var totalTime time.Duration
127167
168+ plainTextBufs := make ([][]byte , 61 )
169+ writeTos := make (map [int ]io.Writer )
170+ for i := 0 ; i < len (plainTextBufs ); i ++ {
171+ var rbuf []byte
172+ // plaintext will be 2 KB to 62 KB
173+ plainTextBufs [i ] = make ([]byte , (i + 2 )* 1024 )
174+ switch m {
175+ case readBufferGtEncMsg :
176+ rbuf = make ([]byte , len (plainTextBufs [i ])+ poly1305 .TagSize + 1 )
177+ case readBufferLtPlainText :
178+ rbuf = make ([]byte , len (plainTextBufs [i ])- 2 )
179+ }
180+ writeTos [i ] = & discardWithBuffer {rbuf , ioutil .Discard }
181+ }
182+
128183 b .ResetTimer ()
129184 b .ReportAllocs ()
130185
131186 for i := 0 ; i < b .N ; i ++ {
132187 initSession , respSession := b .connect (true )
133188
134189 start := time .Now ()
135- err := pipeRandom (b .rndSrc , initSession , respSession , size )
190+
191+ bufi := i % len (plainTextBufs )
192+ err := pipeRandom (b .rndSrc , initSession , respSession , dataSize , plainTextBufs [bufi ], writeTos [bufi ])
136193 if err != nil {
137194 b .Fatalf ("error sending random data: %s" , err )
138195 }
139196 elapsed := time .Since (start )
140197 totalTime += elapsed
141- totalBytes += size
198+ totalBytes += dataSize
142199 }
143200 bytesPerSec := float64 (totalBytes ) / totalTime .Seconds ()
144201 b .ReportMetric (bytesPerSec , "bytes/sec" )
145202}
146203
204+ type bc struct {
205+ plainTextChunkLen int64
206+ readBufferLen int64
207+ }
208+
147209func BenchmarkTransfer1MB (b * testing.B ) {
148- benchDataTransfer (setupEnv (b ), 1024 * 1024 )
210+ for n , bc := range bcs {
211+ b .Run (n , func (b * testing.B ) {
212+ benchDataTransfer (setupEnv (b ), 1024 * 1024 , bc .m )
213+ })
214+ }
215+
149216}
150217
151218func BenchmarkTransfer100MB (b * testing.B ) {
152- benchDataTransfer (setupEnv (b ), 1024 * 1024 * 100 )
219+ for n , bc := range bcs {
220+ b .Run (n , func (b * testing.B ) {
221+ benchDataTransfer (setupEnv (b ), 1024 * 1024 * 100 , bc .m )
222+ })
223+ }
153224}
154225
155226func BenchmarkTransfer500Mb (b * testing.B ) {
156- benchDataTransfer (setupEnv (b ), 1024 * 1024 * 500 )
227+ for n , bc := range bcs {
228+ b .Run (n , func (b * testing.B ) {
229+ benchDataTransfer (setupEnv (b ), 1024 * 1024 * 500 , bc .m )
230+ })
231+ }
157232}
158233
159234func (b benchenv ) benchHandshake () {
0 commit comments