-
Notifications
You must be signed in to change notification settings - Fork 86
/
reader_bench_test.go
114 lines (106 loc) · 2.52 KB
/
reader_bench_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package gonx
import (
"bufio"
"bytes"
"io"
"strings"
"testing"
)
func BenchmarkScannerReader(b *testing.B) {
s := `89.234.89.123 [08/Nov/2013:13:39:18 +0000] "GET /api/foo/bar HTTP/1.1"`
b.ResetTimer()
for i := 0; i < b.N; i++ {
file := strings.NewReader(s)
scanner := bufio.NewScanner(file)
scanner.Scan()
scanner.Text()
if err := scanner.Err(); err != nil {
b.Fatal(err)
}
}
}
func BenchmarkReaderReaderAppend(b *testing.B) {
s := `89.234.89.123 [08/Nov/2013:13:39:18 +0000] "GET /api/foo/bar HTTP/1.1"`
b.ResetTimer()
for i := 0; i < b.N; i++ {
file := strings.NewReader(s)
reader := bufio.NewReader(file)
_, err := readLineAppend(reader)
if err != nil && err != io.EOF {
b.Fatal(err)
}
}
}
func BenchmarkReaderReaderBuffer(b *testing.B) {
s := `89.234.89.123 [08/Nov/2013:13:39:18 +0000] "GET /api/foo/bar HTTP/1.1"`
b.ResetTimer()
for i := 0; i < b.N; i++ {
file := strings.NewReader(s)
reader := bufio.NewReader(file)
_, err := readLineBuffer(reader)
if err != nil && err != io.EOF {
b.Fatal(err)
}
}
}
func BenchmarkLongReaderReaderAppend(b *testing.B) {
longStr := RandString(10 * 64 * 1024)
s := `89.234.89.123 [08/Nov/2013:13:39:18 +0000] "GET ` + longStr + ` HTTP/1.1"`
b.ResetTimer()
for i := 0; i < b.N; i++ {
file := strings.NewReader(s)
reader := bufio.NewReader(file)
_, err := readLineAppend(reader)
if err != nil && err != io.EOF {
b.Fatal(err)
}
}
}
func BenchmarkLongReaderReaderBuffer(b *testing.B) {
longStr := RandString(10 * 64 * 1024)
s := `89.234.89.123 [08/Nov/2013:13:39:18 +0000] "GET ` + longStr + ` HTTP/1.1"`
b.ResetTimer()
for i := 0; i < b.N; i++ {
file := strings.NewReader(s)
reader := bufio.NewReader(file)
_, err := readLineBuffer(reader)
if err != nil && err != io.EOF {
b.Fatal(err)
}
}
}
func readLineAppend(reader *bufio.Reader) (string, error) {
line, isPrefix, err := reader.ReadLine()
if err != nil {
return "", err
}
if !isPrefix {
return string(line), nil
}
var ln []byte
for isPrefix && err == nil {
ln, isPrefix, err = reader.ReadLine()
if err == nil {
line = append(line, ln...)
}
}
return string(line), err
}
func readLineBuffer(reader *bufio.Reader) (string, error) {
line, isPrefix, err := reader.ReadLine()
if err != nil {
return "", err
}
if !isPrefix {
return string(line), nil
}
var buffer bytes.Buffer
_, err = buffer.Write(line)
for isPrefix && err == nil {
line, isPrefix, err = reader.ReadLine()
if err == nil {
_, err = buffer.Write(line)
}
}
return buffer.String(), err
}