131 lines
2.7 KiB
Go
131 lines
2.7 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package smallzstd
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/klauspost/compress/zstd"
|
|
)
|
|
|
|
func BenchmarkSmallEncoder(b *testing.B) {
|
|
benchEncoder(b, func() (*zstd.Encoder, error) { return NewEncoder(nil) })
|
|
}
|
|
|
|
func BenchmarkSmallEncoderWithBuild(b *testing.B) {
|
|
benchEncoderWithConstruction(b, func() (*zstd.Encoder, error) { return NewEncoder(nil) })
|
|
}
|
|
|
|
func BenchmarkStockEncoder(b *testing.B) {
|
|
benchEncoder(b, func() (*zstd.Encoder, error) { return zstd.NewWriter(nil) })
|
|
}
|
|
|
|
func BenchmarkStockEncoderWithBuild(b *testing.B) {
|
|
benchEncoderWithConstruction(b, func() (*zstd.Encoder, error) { return zstd.NewWriter(nil) })
|
|
}
|
|
|
|
func BenchmarkSmallDecoder(b *testing.B) {
|
|
benchDecoder(b, func() (*zstd.Decoder, error) { return NewDecoder(nil) })
|
|
}
|
|
|
|
func BenchmarkSmallDecoderWithBuild(b *testing.B) {
|
|
benchDecoderWithConstruction(b, func() (*zstd.Decoder, error) { return NewDecoder(nil) })
|
|
}
|
|
|
|
func BenchmarkStockDecoder(b *testing.B) {
|
|
benchDecoder(b, func() (*zstd.Decoder, error) { return zstd.NewReader(nil) })
|
|
}
|
|
|
|
func BenchmarkStockDecoderWithBuild(b *testing.B) {
|
|
benchDecoderWithConstruction(b, func() (*zstd.Decoder, error) { return zstd.NewReader(nil) })
|
|
}
|
|
|
|
func benchEncoder(b *testing.B, mk func() (*zstd.Encoder, error)) {
|
|
b.ReportAllocs()
|
|
|
|
in := testdata(b)
|
|
out := make([]byte, 0, 10<<10) // 10kiB
|
|
|
|
e, err := mk()
|
|
if err != nil {
|
|
b.Fatalf("making encoder: %v", err)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for range b.N {
|
|
e.EncodeAll(in, out)
|
|
}
|
|
}
|
|
|
|
func benchEncoderWithConstruction(b *testing.B, mk func() (*zstd.Encoder, error)) {
|
|
b.ReportAllocs()
|
|
|
|
in := testdata(b)
|
|
out := make([]byte, 0, 10<<10) // 10kiB
|
|
|
|
b.ResetTimer()
|
|
for range b.N {
|
|
e, err := mk()
|
|
if err != nil {
|
|
b.Fatalf("making encoder: %v", err)
|
|
}
|
|
|
|
e.EncodeAll(in, out)
|
|
}
|
|
}
|
|
|
|
func benchDecoder(b *testing.B, mk func() (*zstd.Decoder, error)) {
|
|
b.ReportAllocs()
|
|
|
|
in := compressedTestdata(b)
|
|
out := make([]byte, 0, 10<<10)
|
|
|
|
d, err := mk()
|
|
if err != nil {
|
|
b.Fatalf("creating decoder: %v", err)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for range b.N {
|
|
d.DecodeAll(in, out)
|
|
}
|
|
}
|
|
|
|
func benchDecoderWithConstruction(b *testing.B, mk func() (*zstd.Decoder, error)) {
|
|
b.ReportAllocs()
|
|
|
|
in := compressedTestdata(b)
|
|
out := make([]byte, 0, 10<<10)
|
|
|
|
b.ResetTimer()
|
|
for range b.N {
|
|
d, err := mk()
|
|
if err != nil {
|
|
b.Fatalf("creating decoder: %v", err)
|
|
}
|
|
|
|
d.DecodeAll(in, out)
|
|
}
|
|
}
|
|
|
|
func testdata(b *testing.B) []byte {
|
|
b.Helper()
|
|
in, err := os.ReadFile("testdata")
|
|
if err != nil {
|
|
b.Fatalf("reading testdata: %v", err)
|
|
}
|
|
return in
|
|
}
|
|
|
|
func compressedTestdata(b *testing.B) []byte {
|
|
b.Helper()
|
|
uncomp := testdata(b)
|
|
e, err := NewEncoder(nil)
|
|
if err != nil {
|
|
b.Fatalf("creating encoder: %v", err)
|
|
}
|
|
return e.EncodeAll(uncomp, nil)
|
|
}
|