Skip to content

Commit 3333bfb

Browse files
committed
Report how efficient compression is in BenchmarkConn
1 parent 2377cca commit 3333bfb

File tree

6 files changed

+39
-60
lines changed

6 files changed

+39
-60
lines changed

Diff for: ci/test.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
test: gotest ci/out/coverage.html
1+
test: ci/out/coverage.html
22
ifdef CI
33
test: coveralls
44
endif

Diff for: compress_notjs.go

-16
Original file line numberDiff line numberDiff line change
@@ -108,22 +108,6 @@ func putFlateReader(fr io.Reader) {
108108
flateReaderPool.Put(fr)
109109
}
110110

111-
var flateWriterPool sync.Pool
112-
113-
func getFlateWriter(w io.Writer) *flate.Writer {
114-
fw, ok := flateWriterPool.Get().(*flate.Writer)
115-
if !ok {
116-
fw, _ = flate.NewWriter(w, flate.BestSpeed)
117-
return fw
118-
}
119-
fw.Reset(w)
120-
return fw
121-
}
122-
123-
func putFlateWriter(w *flate.Writer) {
124-
flateWriterPool.Put(w)
125-
}
126-
127111
type slidingWindow struct {
128112
buf []byte
129113
}

Diff for: conn_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,9 @@ func BenchmarkConn(b *testing.B) {
402402

403403
bb.goEchoLoop(c2)
404404

405+
bytesWritten := c1.RecordBytesWritten()
406+
bytesRead := c1.RecordBytesRead()
407+
405408
msg := []byte(strings.Repeat("1234", 128))
406409
readBuf := make([]byte, len(msg))
407410
writes := make(chan struct{})
@@ -451,6 +454,9 @@ func BenchmarkConn(b *testing.B) {
451454
}
452455
b.StopTimer()
453456

457+
b.ReportMetric(float64(*bytesWritten/b.N), "written/op")
458+
b.ReportMetric(float64(*bytesRead/b.N), "read/op")
459+
454460
err := c1.Close(websocket.StatusNormalClosure, "")
455461
assert.Success(b, err)
456462
})

Diff for: export_test.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package websocket
2+
3+
func (c *Conn) RecordBytesWritten() *int {
4+
var bytesWritten int
5+
c.bw.Reset(writerFunc(func (p []byte) (int, error) {
6+
bytesWritten += len(p)
7+
return c.rwc.Write(p)
8+
}))
9+
return &bytesWritten
10+
}
11+
12+
func (c *Conn) RecordBytesRead() *int {
13+
var bytesRead int
14+
c.br.Reset(readerFunc(func(p []byte) (int, error) {
15+
n, err := c.rwc.Read(p)
16+
bytesRead += n
17+
return n, err
18+
}))
19+
return &bytesRead
20+
}

Diff for: internal/test/assert/assert.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func Error(t testing.TB, err error) {
3939
func Contains(t testing.TB, v interface{}, sub string) {
4040
t.Helper()
4141

42-
vstr := fmt.Sprint(v)
43-
if !strings.Contains(vstr, sub) {
44-
t.Fatalf("expected %q to contain %q", vstr, sub)
42+
s := fmt.Sprint(v)
43+
if !strings.Contains(s, sub) {
44+
t.Fatalf("expected %q to contain %q", s, sub)
4545
}
4646
}

Diff for: write.go

+9-40
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"time"
1313

1414
"github.com/klauspost/compress/flate"
15-
kflate "github.com/klauspost/compress/flate"
1615
"golang.org/x/xerrors"
1716

1817
"nhooyr.io/websocket/internal/errd"
@@ -77,9 +76,8 @@ type msgWriterState struct {
7776
opcode opcode
7877
flate bool
7978

80-
trimWriter *trimLastFourBytesWriter
81-
flateWriter *flate.Writer
82-
dict slidingWindow
79+
trimWriter *trimLastFourBytesWriter
80+
dict slidingWindow
8381
}
8482

8583
func newMsgWriterState(c *Conn) *msgWriterState {
@@ -90,23 +88,14 @@ func newMsgWriterState(c *Conn) *msgWriterState {
9088
return mw
9189
}
9290

93-
const stateless = true
94-
9591
func (mw *msgWriterState) ensureFlate() {
9692
if mw.trimWriter == nil {
9793
mw.trimWriter = &trimLastFourBytesWriter{
9894
w: writerFunc(mw.write),
9995
}
10096
}
10197

102-
if stateless {
103-
mw.dict.init(8192)
104-
} else {
105-
if mw.flateWriter == nil {
106-
mw.flateWriter = getFlateWriter(mw.trimWriter)
107-
}
108-
}
109-
98+
mw.dict.init(8192)
11099
mw.flate = true
111100
}
112101

@@ -163,13 +152,6 @@ func (mw *msgWriterState) reset(ctx context.Context, typ MessageType) error {
163152
return nil
164153
}
165154

166-
func (mw *msgWriterState) putFlateWriter() {
167-
if mw.flateWriter != nil {
168-
putFlateWriter(mw.flateWriter)
169-
mw.flateWriter = nil
170-
}
171-
}
172-
173155
// Write writes the given bytes to the WebSocket connection.
174156
func (mw *msgWriterState) Write(p []byte) (_ int, err error) {
175157
defer errd.Wrap(&err, "failed to write")
@@ -186,15 +168,12 @@ func (mw *msgWriterState) Write(p []byte) (_ int, err error) {
186168
}
187169

188170
if mw.flate {
189-
if stateless {
190-
err = kflate.StatelessDeflate(mw.trimWriter, p, false, mw.dict.buf)
191-
if err != nil {
192-
return 0, err
193-
}
194-
mw.dict.write(p)
195-
return len(p), nil
171+
err = flate.StatelessDeflate(mw.trimWriter, p, false, mw.dict.buf)
172+
if err != nil {
173+
return 0, err
196174
}
197-
return mw.flateWriter.Write(p)
175+
mw.dict.write(p)
176+
return len(p), nil
198177
}
199178

200179
return mw.write(p)
@@ -216,29 +195,20 @@ func (mw *msgWriterState) Close() (err error) {
216195
mw.writeMu.Lock()
217196
defer mw.writeMu.Unlock()
218197

219-
if mw.flate && !stateless {
220-
err = mw.flateWriter.Flush()
221-
if err != nil {
222-
return xerrors.Errorf("failed to flush flate: %w", err)
223-
}
224-
}
225-
226198
_, err = mw.c.writeFrame(mw.ctx, true, mw.flate, mw.opcode, nil)
227199
if err != nil {
228200
return xerrors.Errorf("failed to write fin frame: %w", err)
229201
}
230202

231203
if mw.flate && !mw.flateContextTakeover() {
232204
mw.dict.close()
233-
mw.putFlateWriter()
234205
}
235206
mw.mu.Unlock()
236207
return nil
237208
}
238209

239210
func (mw *msgWriterState) close() {
240211
mw.writeMu.Lock()
241-
mw.putFlateWriter()
242212
mw.dict.close()
243213
}
244214

@@ -311,14 +281,13 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, flate bool, opcode opco
311281
return n, nil
312282
}
313283

314-
func (c *Conn) writeFramePayload(p []byte) (_ int, err error) {
284+
func (c *Conn) writeFramePayload(p []byte) (n int, err error) {
315285
defer errd.Wrap(&err, "failed to write frame payload")
316286

317287
if !c.writeHeader.masked {
318288
return c.bw.Write(p)
319289
}
320290

321-
var n int
322291
maskKey := c.writeHeader.maskKey
323292
for len(p) > 0 {
324293
// If the buffer is full, we need to flush.

0 commit comments

Comments
 (0)