touka/iox_benchmark_test.go

150 lines
2.8 KiB
Go

package touka
import (
"bytes"
"io"
"testing"
"github.com/WJQSERVER-STUDIO/go-utils/iox"
)
type benchmarkResetReader struct {
data []byte
off int
}
func (r *benchmarkResetReader) Read(p []byte) (int, error) {
if r.off >= len(r.data) {
return 0, io.EOF
}
n := copy(p, r.data[r.off:])
r.off += n
return n, nil
}
func (r *benchmarkResetReader) Reset() {
r.off = 0
}
type benchmarkDiscardWriter struct{}
func (benchmarkDiscardWriter) Write(p []byte) (int, error) {
return len(p), nil
}
var benchmarkIOXResult int64
var benchmarkIOXBytes []byte
func BenchmarkIOXCopyComparison(b *testing.B) {
payload := bytes.Repeat([]byte("0123456789abcdef"), 4096)
b.Run("io.Copy", func(b *testing.B) {
r := &benchmarkResetReader{data: payload}
w := benchmarkDiscardWriter{}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
r.Reset()
n, err := io.Copy(w, r)
if err != nil {
b.Fatalf("io.Copy failed: %v", err)
}
benchmarkIOXResult = n
}
})
b.Run("iox.Copy", func(b *testing.B) {
r := &benchmarkResetReader{data: payload}
w := benchmarkDiscardWriter{}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
r.Reset()
n, err := iox.Copy(w, r)
if err != nil {
b.Fatalf("iox.Copy failed: %v", err)
}
benchmarkIOXResult = n
}
})
}
func BenchmarkIOXCopyBufferComparison(b *testing.B) {
payload := bytes.Repeat([]byte("0123456789abcdef"), 4096)
b.Run("io.CopyBuffer", func(b *testing.B) {
r := &benchmarkResetReader{data: payload}
w := benchmarkDiscardWriter{}
buf := make([]byte, 32*1024)
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
r.Reset()
n, err := io.CopyBuffer(w, r, buf)
if err != nil {
b.Fatalf("io.CopyBuffer failed: %v", err)
}
benchmarkIOXResult = n
}
})
b.Run("iox.CopyBuffer", func(b *testing.B) {
r := &benchmarkResetReader{data: payload}
w := benchmarkDiscardWriter{}
buf := make([]byte, 32*1024)
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
r.Reset()
n, err := iox.CopyBuffer(w, r, buf)
if err != nil {
b.Fatalf("iox.CopyBuffer failed: %v", err)
}
benchmarkIOXResult = n
}
})
}
func BenchmarkIOXReadAllComparison(b *testing.B) {
payload := bytes.Repeat([]byte("0123456789abcdef"), 4096)
b.Run("io.ReadAll", func(b *testing.B) {
r := &benchmarkResetReader{data: payload}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
r.Reset()
data, err := io.ReadAll(r)
if err != nil {
b.Fatalf("io.ReadAll failed: %v", err)
}
benchmarkIOXBytes = data
}
})
b.Run("iox.ReadAll", func(b *testing.B) {
r := &benchmarkResetReader{data: payload}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
r.Reset()
data, err := io.ReadAll(r)
if err != nil {
b.Fatalf("iox.ReadAll failed: %v", err)
}
benchmarkIOXBytes = data
}
})
}