Skip to content

Instantly share code, notes, and snippets.

@lysu
Created November 30, 2015 18:04
Show Gist options
  • Save lysu/d85491f664009e425944 to your computer and use it in GitHub Desktop.
Save lysu/d85491f664009e425944 to your computer and use it in GitHub Desktop.
package comp_test
import (
"bytes"
"compress/flate"
"github.com/golang/snappy"
"io"
"sync"
"testing"
)
const test = "1211111jdfklajdfoij142u3984dfjlkjaflkajfkjfa2rw345345g356nkjbnsigiji9ojwiornonsapfaioj2402unkl;lnmjh9j40u4kljsghfio2jirjiolfnjfdfa123iosajfoijffsadn nhjnoiflsajofj0o2jmnfoaphqjrowjroijnvl;a[jo[p9360ioh7"
func BenchmarkRawDeflat(b *testing.B) {
b.StopTimer()
b.StartTimer()
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
RawFlateEncode(test)
}
}
func BenchmarkPooledDeflate(b *testing.B) {
b.StopTimer()
b.StartTimer()
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
PooledFlateEncode(test)
}
}
func BenchmarkPooledSnappy(b *testing.B) {
b.StopTimer()
b.StartTimer()
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
PooledSnappyEncode(test)
}
}
func RawFlateEncode(input string) (result []byte, err error) {
var buf bytes.Buffer
w, err := flate.NewWriter(&buf, -1)
w.Write([]byte(input))
w.Close()
result = buf.Bytes()
return
}
func PooledFlateEncode(input string) (result []byte, err error) {
var buf bytes.Buffer
w, err := newFlateWriter(&buf)
w.Write([]byte(input))
w.Close()
flateWriterPool.Put(w)
result = buf.Bytes()
return
}
func PooledSnappyEncode(input string) (result []byte, err error) {
var buf bytes.Buffer
w := newSnappyWriter(&buf)
_, err = w.Write([]byte(input))
if err != nil {
return nil, err
}
result = buf.Bytes()
snappyWriterPool.Put(w)
return
}
var flateWriterPool sync.Pool
func newFlateWriter(w io.Writer) (*flate.Writer, error) {
var err error
sw, ok := flateWriterPool.Get().(*flate.Writer)
if ok {
sw.Reset(w)
} else {
sw, err = flate.NewWriter(w, -1)
if err != nil {
return nil, err
}
}
return sw, nil
}
var snappyWriterPool sync.Pool
func newSnappyWriter(w io.Writer) *snappy.Writer {
sw, ok := snappyWriterPool.Get().(*snappy.Writer)
if ok {
sw.Reset(w)
} else {
sw = snappy.NewWriter(w)
}
return sw
}
@lysu
Copy link
Author

lysu commented Nov 30, 2015

PASS
BenchmarkRawDeflat-4            3000        406100 ns/op     1457711 B/op         58 allocs/op
BenchmarkPooledDeflate-4       10000        163029 ns/op        4466 B/op         39 allocs/op
BenchmarkPooledSnappy-4       200000          6642 ns/op         674 B/op          3 allocs/op
ok      github.com/lysu/test/comp   4.323s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment