blob: 3166f1ceeed3c9f685f6e1475694c29508c47187 [file] [edit]
package zstd
import "testing"
// predefinedFSEInputs returns the three RFC default distributions
// (litLength, offset, matchLength) as fseDecoders, ready for buildDtable.
// Defined without build constraints so the benchmark can run under both the
// asm and -tags noasm (pure-Go) builds for an apples-to-apples comparison.
func predefinedFSEInputs() map[string]func() *fseDecoder {
return map[string]func() *fseDecoder{
"litLength": func() *fseDecoder {
s := &fseDecoder{actualTableLog: 6, symbolLen: 36}
copy(s.norm[:], []int16{4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1,
-1, -1, -1, -1})
return s
},
"offset": func() *fseDecoder {
s := &fseDecoder{actualTableLog: 5, symbolLen: 29}
copy(s.norm[:], []int16{
1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1})
return s
},
"matchLength": func() *fseDecoder {
s := &fseDecoder{actualTableLog: 6, symbolLen: 53}
copy(s.norm[:], []int16{
1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
-1, -1, -1, -1, -1})
return s
},
}
}
func BenchmarkBuildDtable(b *testing.B) {
for name, mk := range predefinedFSEInputs() {
b.Run(name, func(b *testing.B) {
s := mk()
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
// Reset the mutated parts so each iteration does real work.
for j := range s.dt {
s.dt[j] = 0
}
for j := range s.stateTable {
s.stateTable[j] = 0
}
if err := s.buildDtable(); err != nil {
b.Fatal(err)
}
}
})
}
}