-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtarfs_benchmark_test.go
More file actions
122 lines (106 loc) · 2.4 KB
/
Copy pathtarfs_benchmark_test.go
File metadata and controls
122 lines (106 loc) · 2.4 KB
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
package tarfs
import (
"archive/tar"
"bytes"
"fmt"
"testing"
)
// BenchmarkOpen tests the performance of opening files
func BenchmarkOpen(b *testing.B) {
fs := createTestFS(b, 100, 1024) // 100 files, 1KB each
b.ResetTimer()
for i := 0; i < b.N; i++ {
f, err := fs.Open("/file_50.txt")
if err != nil {
b.Fatal(err)
}
f.Close()
}
}
// BenchmarkReaddir tests the performance of reading directories
func BenchmarkReaddir(b *testing.B) {
fs := createTestFS(b, 100, 1024) // 100 files, 1KB each
// Check if root directory exists
if !fs.Exists("/") {
b.Fatal("root directory does not exist")
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
f, err := fs.Open("/")
if err != nil {
b.Fatalf("failed to open root: %v", err)
}
_, err = f.Readdir(-1)
if err != nil {
b.Fatalf("failed to readdir: %v", err)
}
f.Close()
}
}
// BenchmarkRead tests the performance of reading file contents
func BenchmarkRead(b *testing.B) {
fs := createTestFS(b, 10, 10*1024) // 10 files, 10KB each
b.ResetTimer()
for i := 0; i < b.N; i++ {
f, err := fs.Open("/file_5.txt")
if err != nil {
b.Fatal(err)
}
buf := make([]byte, 10*1024)
_, err = f.Read(buf)
if err != nil {
b.Fatal(err)
}
f.Close()
}
}
// BenchmarkMemoryUsage tests memory usage for different file counts
func BenchmarkMemoryUsage(b *testing.B) {
sizes := []struct {
files int
fileSize int
}{
{10, 1024}, // 10KB total
{100, 1024}, // 100KB total
{1000, 1024}, // 1MB total
{100, 100 * 1024}, // 10MB total
}
for _, size := range sizes {
b.Run(fmt.Sprintf("files=%d_size=%d", size.files, size.fileSize), func(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
_ = createTestFS(b, size.files, size.fileSize)
}
})
}
}
// Helper function to create a test filesystem
func createTestFS(b *testing.B, numFiles, fileSize int) FileSystem {
buf := new(bytes.Buffer)
tw := tar.NewWriter(buf)
data := make([]byte, fileSize)
for i := range data {
data[i] = byte(i % 256)
}
for i := 0; i < numFiles; i++ {
hdr := &tar.Header{
Name: fmt.Sprintf("file_%d.txt", i),
Size: int64(fileSize),
Mode: 0644,
}
if err := tw.WriteHeader(hdr); err != nil {
b.Fatal(err)
}
if _, err := tw.Write(data); err != nil {
b.Fatal(err)
}
}
if err := tw.Close(); err != nil {
b.Fatal(err)
}
fs, err := NewFromReader(buf)
if err != nil {
b.Fatal(err)
}
return fs
}