good morning!!!!

Skip to content
Snippets Groups Projects
Unverified Commit d57b2530 authored by Anmol Sethi's avatar Anmol Sethi
Browse files

Report how efficient compression is in BenchmarkConn

parent 2377cca1
Branches
Tags
No related merge requests found
test: gotest ci/out/coverage.html test: ci/out/coverage.html
ifdef CI ifdef CI
test: coveralls test: coveralls
endif endif
......
...@@ -108,22 +108,6 @@ func putFlateReader(fr io.Reader) { ...@@ -108,22 +108,6 @@ func putFlateReader(fr io.Reader) {
flateReaderPool.Put(fr) flateReaderPool.Put(fr)
} }
var flateWriterPool sync.Pool
func getFlateWriter(w io.Writer) *flate.Writer {
fw, ok := flateWriterPool.Get().(*flate.Writer)
if !ok {
fw, _ = flate.NewWriter(w, flate.BestSpeed)
return fw
}
fw.Reset(w)
return fw
}
func putFlateWriter(w *flate.Writer) {
flateWriterPool.Put(w)
}
type slidingWindow struct { type slidingWindow struct {
buf []byte buf []byte
} }
......
...@@ -402,6 +402,9 @@ func BenchmarkConn(b *testing.B) { ...@@ -402,6 +402,9 @@ func BenchmarkConn(b *testing.B) {
bb.goEchoLoop(c2) bb.goEchoLoop(c2)
bytesWritten := c1.RecordBytesWritten()
bytesRead := c1.RecordBytesRead()
msg := []byte(strings.Repeat("1234", 128)) msg := []byte(strings.Repeat("1234", 128))
readBuf := make([]byte, len(msg)) readBuf := make([]byte, len(msg))
writes := make(chan struct{}) writes := make(chan struct{})
...@@ -451,6 +454,9 @@ func BenchmarkConn(b *testing.B) { ...@@ -451,6 +454,9 @@ func BenchmarkConn(b *testing.B) {
} }
b.StopTimer() b.StopTimer()
b.ReportMetric(float64(*bytesWritten/b.N), "written/op")
b.ReportMetric(float64(*bytesRead/b.N), "read/op")
err := c1.Close(websocket.StatusNormalClosure, "") err := c1.Close(websocket.StatusNormalClosure, "")
assert.Success(b, err) assert.Success(b, err)
}) })
......
// +build !js
package websocket
func (c *Conn) RecordBytesWritten() *int {
var bytesWritten int
c.bw.Reset(writerFunc(func(p []byte) (int, error) {
bytesWritten += len(p)
return c.rwc.Write(p)
}))
return &bytesWritten
}
func (c *Conn) RecordBytesRead() *int {
var bytesRead int
c.br.Reset(readerFunc(func(p []byte) (int, error) {
n, err := c.rwc.Read(p)
bytesRead += n
return n, err
}))
return &bytesRead
}
...@@ -39,8 +39,8 @@ func Error(t testing.TB, err error) { ...@@ -39,8 +39,8 @@ func Error(t testing.TB, err error) {
func Contains(t testing.TB, v interface{}, sub string) { func Contains(t testing.TB, v interface{}, sub string) {
t.Helper() t.Helper()
vstr := fmt.Sprint(v) s := fmt.Sprint(v)
if !strings.Contains(vstr, sub) { if !strings.Contains(s, sub) {
t.Fatalf("expected %q to contain %q", vstr, sub) t.Fatalf("expected %q to contain %q", s, sub)
} }
} }
...@@ -12,7 +12,6 @@ import ( ...@@ -12,7 +12,6 @@ import (
"time" "time"
"github.com/klauspost/compress/flate" "github.com/klauspost/compress/flate"
kflate "github.com/klauspost/compress/flate"
"golang.org/x/xerrors" "golang.org/x/xerrors"
"nhooyr.io/websocket/internal/errd" "nhooyr.io/websocket/internal/errd"
...@@ -78,7 +77,6 @@ type msgWriterState struct { ...@@ -78,7 +77,6 @@ type msgWriterState struct {
flate bool flate bool
trimWriter *trimLastFourBytesWriter trimWriter *trimLastFourBytesWriter
flateWriter *flate.Writer
dict slidingWindow dict slidingWindow
} }
...@@ -90,8 +88,6 @@ func newMsgWriterState(c *Conn) *msgWriterState { ...@@ -90,8 +88,6 @@ func newMsgWriterState(c *Conn) *msgWriterState {
return mw return mw
} }
const stateless = true
func (mw *msgWriterState) ensureFlate() { func (mw *msgWriterState) ensureFlate() {
if mw.trimWriter == nil { if mw.trimWriter == nil {
mw.trimWriter = &trimLastFourBytesWriter{ mw.trimWriter = &trimLastFourBytesWriter{
...@@ -99,14 +95,7 @@ func (mw *msgWriterState) ensureFlate() { ...@@ -99,14 +95,7 @@ func (mw *msgWriterState) ensureFlate() {
} }
} }
if stateless {
mw.dict.init(8192) mw.dict.init(8192)
} else {
if mw.flateWriter == nil {
mw.flateWriter = getFlateWriter(mw.trimWriter)
}
}
mw.flate = true mw.flate = true
} }
...@@ -163,13 +152,6 @@ func (mw *msgWriterState) reset(ctx context.Context, typ MessageType) error { ...@@ -163,13 +152,6 @@ func (mw *msgWriterState) reset(ctx context.Context, typ MessageType) error {
return nil return nil
} }
func (mw *msgWriterState) putFlateWriter() {
if mw.flateWriter != nil {
putFlateWriter(mw.flateWriter)
mw.flateWriter = nil
}
}
// Write writes the given bytes to the WebSocket connection. // Write writes the given bytes to the WebSocket connection.
func (mw *msgWriterState) Write(p []byte) (_ int, err error) { func (mw *msgWriterState) Write(p []byte) (_ int, err error) {
defer errd.Wrap(&err, "failed to write") defer errd.Wrap(&err, "failed to write")
...@@ -186,16 +168,13 @@ func (mw *msgWriterState) Write(p []byte) (_ int, err error) { ...@@ -186,16 +168,13 @@ func (mw *msgWriterState) Write(p []byte) (_ int, err error) {
} }
if mw.flate { if mw.flate {
if stateless { err = flate.StatelessDeflate(mw.trimWriter, p, false, mw.dict.buf)
err = kflate.StatelessDeflate(mw.trimWriter, p, false, mw.dict.buf)
if err != nil { if err != nil {
return 0, err return 0, err
} }
mw.dict.write(p) mw.dict.write(p)
return len(p), nil return len(p), nil
} }
return mw.flateWriter.Write(p)
}
return mw.write(p) return mw.write(p)
} }
...@@ -216,13 +195,6 @@ func (mw *msgWriterState) Close() (err error) { ...@@ -216,13 +195,6 @@ func (mw *msgWriterState) Close() (err error) {
mw.writeMu.Lock() mw.writeMu.Lock()
defer mw.writeMu.Unlock() defer mw.writeMu.Unlock()
if mw.flate && !stateless {
err = mw.flateWriter.Flush()
if err != nil {
return xerrors.Errorf("failed to flush flate: %w", err)
}
}
_, err = mw.c.writeFrame(mw.ctx, true, mw.flate, mw.opcode, nil) _, err = mw.c.writeFrame(mw.ctx, true, mw.flate, mw.opcode, nil)
if err != nil { if err != nil {
return xerrors.Errorf("failed to write fin frame: %w", err) return xerrors.Errorf("failed to write fin frame: %w", err)
...@@ -230,7 +202,6 @@ func (mw *msgWriterState) Close() (err error) { ...@@ -230,7 +202,6 @@ func (mw *msgWriterState) Close() (err error) {
if mw.flate && !mw.flateContextTakeover() { if mw.flate && !mw.flateContextTakeover() {
mw.dict.close() mw.dict.close()
mw.putFlateWriter()
} }
mw.mu.Unlock() mw.mu.Unlock()
return nil return nil
...@@ -238,7 +209,6 @@ func (mw *msgWriterState) Close() (err error) { ...@@ -238,7 +209,6 @@ func (mw *msgWriterState) Close() (err error) {
func (mw *msgWriterState) close() { func (mw *msgWriterState) close() {
mw.writeMu.Lock() mw.writeMu.Lock()
mw.putFlateWriter()
mw.dict.close() mw.dict.close()
} }
...@@ -311,14 +281,13 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, flate bool, opcode opco ...@@ -311,14 +281,13 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, flate bool, opcode opco
return n, nil return n, nil
} }
func (c *Conn) writeFramePayload(p []byte) (_ int, err error) { func (c *Conn) writeFramePayload(p []byte) (n int, err error) {
defer errd.Wrap(&err, "failed to write frame payload") defer errd.Wrap(&err, "failed to write frame payload")
if !c.writeHeader.masked { if !c.writeHeader.masked {
return c.bw.Write(p) return c.bw.Write(p)
} }
var n int
maskKey := c.writeHeader.maskKey maskKey := c.writeHeader.maskKey
for len(p) > 0 { for len(p) > 0 {
// If the buffer is full, we need to flush. // If the buffer is full, we need to flush.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment