Skip to content

Commit 7087dd6

Browse files
committed
new stream Copy benchmark
1 parent ddb444c commit 7087dd6

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

try/copy_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package try_test
33
import (
44
"bufio"
55
"bytes"
6+
"errors"
67
"io"
78
"os"
89
"testing"
@@ -13,6 +14,19 @@ import (
1314

1415
const dataFile = "./try.go"
1516

17+
func Benchmark_CopyBufferMy(b *testing.B) {
18+
all, err := os.ReadFile(dataFile)
19+
test.Requiref(b, err == nil, "error: %v", err)
20+
test.Require(b, all != nil)
21+
22+
buf := make([]byte, 4)
23+
dst := bufio.NewWriter(bytes.NewBuffer(make([]byte, 0, len(all))))
24+
src := bytes.NewReader(all)
25+
for n := 0; n < b.N; n++ {
26+
try.To1(myCopyBuffer(dst, src, buf))
27+
}
28+
}
29+
1630
func Benchmark_CopyBufferStd(b *testing.B) {
1731
all, err := os.ReadFile(dataFile)
1832
test.Requiref(b, err == nil, "error: %v", err)
@@ -40,3 +54,36 @@ func Benchmark_CopyBufferOur(b *testing.B) {
4054
}
4155
}
4256
}
57+
58+
// myCopyBuffer is copy/paste from Go std lib to remove noice and measure only a
59+
// loop
60+
func myCopyBuffer(dst io.Writer, src io.Reader, buf []byte) (written int64, err error) {
61+
for {
62+
nr, er := src.Read(buf)
63+
if nr > 0 {
64+
nw, ew := dst.Write(buf[0:nr])
65+
if nw < 0 || nr < nw {
66+
nw = 0
67+
if ew == nil {
68+
ew = errors.New("invalid write result")
69+
}
70+
}
71+
written += int64(nw)
72+
if ew != nil {
73+
err = ew
74+
break
75+
}
76+
if nr != nw {
77+
err = io.ErrShortWrite
78+
break
79+
}
80+
}
81+
if er != nil {
82+
if er != io.EOF {
83+
err = er
84+
}
85+
break
86+
}
87+
}
88+
return written, err
89+
}

0 commit comments

Comments
 (0)