forked from pwaller/zerocopy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
zerocopy_test.go
130 lines (114 loc) · 2.26 KB
/
zerocopy_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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
// license. Its contents can be found at:
// http://creativecommons.org/publicdomain/zero/1.0/
package zerocopy
import (
"bytes"
"log"
"os"
"testing"
)
func TestZeroCopyBuffer(t *testing.T) {
buf := []byte("Hello, world")
r := bytes.NewReader(buf)
zr, err := NewReader(r)
if err != nil {
t.Fatal(err)
}
result, err := zr.Read(6)
if string(result) != "Hello," {
t.Fatalf("string(result) != \"Hello,\": %q", string(result))
}
result, err = zr.Read(6)
if string(result) != " world" {
t.Fatalf("string(result) != \" world\": %q", string(result))
}
}
// Try reading 100 bytes of /etc/passwd
func TestZeroCopyFile(t *testing.T) {
fd, err := os.Open("/etc/passwd")
if err != nil {
t.Fatal(err)
}
defer fd.Close()
zr, err := NewReader(fd)
if err != nil {
t.Fatal(err)
}
defer zr.Close()
const N = 100
result, err := zr.Read(N)
if err != nil {
log.Fatalln("err != nil: ", err)
}
if len(result) != N {
log.Fatalln("len(result) !=", N, "it's", len(result))
}
}
const BLOCKSIZE = 1 * 1024
func BenchmarkLargefileReadZC(b *testing.B) {
for i := 0; i < b.N; i++ {
func() {
b.StopTimer()
fd, err := os.Open("./largefile")
if err != nil {
b.Fatal(err)
}
defer fd.Close()
zr, err := NewReader(fd)
if err != nil {
b.Fatal(err)
}
defer zr.Close()
b.StartTimer()
var bs []byte
err = nil
var x byte
var ntot int
// b.ResetTimer()
// for i := 0; i < 100; i++ {
for {
bs, err = zr.Read(BLOCKSIZE)
ntot += len(bs)
if err != nil {
break
}
for _, b := range bs {
x += b
}
}
b.SetBytes(int64(ntot))
// log.Println("Sum byte =", x, b.N)
}()
}
}
func BenchmarkLargefileRead(b *testing.B) {
for i := 0; i < b.N; i++ {
func() {
b.StopTimer()
fd, err := os.Open("./largefile")
if err != nil {
b.Fatal(err)
}
defer fd.Close()
b.StartTimer()
var bs []byte = make([]byte, BLOCKSIZE)
err = nil
var x byte
var n, ntot int
// for i := 0; i < 100; i++ {
for {
n, err = fd.Read(bs)
ntot += n
if err != nil {
break
}
for _, b := range bs {
x += b
}
}
b.SetBytes(int64(ntot))
// log.Println("Sum byte =", x)
}()
}
}