@@ -3,6 +3,7 @@ package try_test
3
3
import (
4
4
"bufio"
5
5
"bytes"
6
+ "errors"
6
7
"io"
7
8
"os"
8
9
"testing"
@@ -13,6 +14,19 @@ import (
13
14
14
15
const dataFile = "./try.go"
15
16
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
+
16
30
func Benchmark_CopyBufferStd (b * testing.B ) {
17
31
all , err := os .ReadFile (dataFile )
18
32
test .Requiref (b , err == nil , "error: %v" , err )
@@ -40,3 +54,36 @@ func Benchmark_CopyBufferOur(b *testing.B) {
40
54
}
41
55
}
42
56
}
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