mirror of
https://github.com/infinite-iroha/touka.git
synced 2026-06-13 15:47:38 +08:00
150 lines
2.8 KiB
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
|
|
}
|
|
})
|
|
}
|