2
0
mirror of https://github.com/soheilhy/cmux.git synced 2024-11-10 11:41:52 +08:00

Add more benchmarks

Add benchmarks for HTTP2 matchers and combinations of it with HTTP1Fast.
This commit is contained in:
Soheil Hassas Yeganeh 2016-05-03 22:13:55 -04:00
parent 9297b6de56
commit d45bcbe1db

View File

@ -6,8 +6,20 @@ import (
"net" "net"
"sync" "sync"
"testing" "testing"
"golang.org/x/net/http2"
) )
var (
benchHTTP1Payload = make([]byte, 4096)
benchHTTP2Payload = make([]byte, 4096)
)
func init() {
copy(benchHTTP1Payload, []byte("GET http://www.w3.org/ HTTP/1.1"))
copy(benchHTTP2Payload, http2.ClientPreface)
}
type mockConn struct { type mockConn struct {
net.Conn net.Conn
r io.Reader r io.Reader
@ -17,20 +29,19 @@ func (c *mockConn) Read(b []byte) (n int, err error) {
return c.r.Read(b) return c.r.Read(b)
} }
func BenchmarkCMuxConn(b *testing.B) { func discard(l net.Listener) {
benchHTTPPayload := make([]byte, 4096)
copy(benchHTTPPayload, []byte("GET http://www.w3.org/ HTTP/1.1"))
m := New(nil).(*cMux)
l := m.Match(HTTP1Fast())
go func() {
for { for {
if _, err := l.Accept(); err != nil { if _, err := l.Accept(); err != nil {
return return
} }
} }
}() }
func BenchmarkCMuxConnHTTP1(b *testing.B) {
m := New(nil).(*cMux)
l := m.Match(HTTP1Fast())
go discard(l)
donec := make(chan struct{}) donec := make(chan struct{})
var wg sync.WaitGroup var wg sync.WaitGroup
@ -39,7 +50,67 @@ func BenchmarkCMuxConn(b *testing.B) {
b.ResetTimer() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
c := &mockConn{ c := &mockConn{
r: bytes.NewReader(benchHTTPPayload), r: bytes.NewReader(benchHTTP1Payload),
}
m.serve(c, donec, &wg)
}
}
func BenchmarkCMuxConnHTTP2(b *testing.B) {
m := New(nil).(*cMux)
l := m.Match(HTTP2())
go discard(l)
donec := make(chan struct{})
var wg sync.WaitGroup
wg.Add(b.N)
b.ResetTimer()
for i := 0; i < b.N; i++ {
c := &mockConn{
r: bytes.NewReader(benchHTTP2Payload),
}
m.serve(c, donec, &wg)
}
}
func BenchmarkCMuxConnHTTP1n2(b *testing.B) {
m := New(nil).(*cMux)
l1 := m.Match(HTTP1Fast())
l2 := m.Match(HTTP2())
go discard(l1)
go discard(l2)
donec := make(chan struct{})
var wg sync.WaitGroup
wg.Add(b.N)
b.ResetTimer()
for i := 0; i < b.N; i++ {
c := &mockConn{
r: bytes.NewReader(benchHTTP2Payload),
}
m.serve(c, donec, &wg)
}
}
func BenchmarkCMuxConnHTTP2n1(b *testing.B) {
m := New(nil).(*cMux)
l2 := m.Match(HTTP2())
l1 := m.Match(HTTP1Fast())
go discard(l1)
go discard(l2)
donec := make(chan struct{})
var wg sync.WaitGroup
wg.Add(b.N)
b.ResetTimer()
for i := 0; i < b.N; i++ {
c := &mockConn{
r: bytes.NewReader(benchHTTP1Payload),
} }
m.serve(c, donec, &wg) m.serve(c, donec, &wg)
} }