mirror of
https://github.com/infinite-iroha/touka.git
synced 2026-06-13 15:47:38 +08:00
perf: modernize io paths and reduce proxy allocations
This commit is contained in:
parent
02861b5537
commit
54f7de0c60
11 changed files with 312 additions and 29 deletions
150
iox_benchmark_test.go
Normal file
150
iox_benchmark_test.go
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
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
|
||||
}
|
||||
})
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue