diff options
Diffstat (limited to 'server/flate_test.go')
| -rw-r--r-- | server/flate_test.go | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/server/flate_test.go b/server/flate_test.go new file mode 100644 index 0000000..2a85004 --- /dev/null +++ b/server/flate_test.go @@ -0,0 +1,78 @@ +package server + +import ( + "io" + "bufio" + "testing" + "compress/gzip" + "encoding/binary" +) + +type benchCompressor func(*blockVolume) io.ReadCloser + +func theirCompress(v *blockVolume) io.ReadCloser { + rd, wr := io.Pipe() + go func() { + defer wr.Close() + z := gzip.NewWriter(wr) + defer z.Close() + bw := bufio.NewWriter(z) + defer bw.Flush() + + v.RLock() + defer v.RUnlock() + binary.Write(bw, binary.BigEndian, uint32(v.size.X*v.size.Y*v.size.Z)) + for block := range v.unsyncGetAll() { + err := bw.WriteByte(byte(block)) + if err != nil { + return + } + } + }() + return rd +} + +func ourCompress(v *blockVolume) io.ReadCloser { + return v.syncCompressForNetwork() +} + +func doCompressorBenchmark( + b *testing.B, c benchCompressor, v *blockVolume, testName string) { + b.StartTimer() + rd := c(v) + data, err := io.ReadAll(rd) + if err != nil { + panic(err) + } + b.Logf("compressed %s to %d bytes", testName, len(data)) + b.StopTimer() +} + +func doCompressorBenchmarks(b *testing.B, c benchCompressor) { + b.StopTimer() + var ( + v blockVolume + size = blockPos {1024, 1024, 1024} + ) + v.init(size) + doCompressorBenchmark(b, c, &v, "empty") + v.init(size) + generateDebug(&v) + doCompressorBenchmark(b, c, &v, "debug") + v.init(size) + generateFlat(&v) + doCompressorBenchmark(b, c, &v, "flat") + v.init(size) + generateSphere(&v) + doCompressorBenchmark(b, c, &v, "sphere") +} + +func BenchmarkNaiveGzip(b *testing.B) { + doCompressorBenchmarks(b, theirCompress) + b.Logf("naive gzip compressor completed in %v", b.Elapsed()) +} + +func BenchmarkDeflate(b *testing.B) { + doCompressorBenchmarks(b, ourCompress) + b.Logf("custom deflate compressor completed in %v", b.Elapsed()) +} |
