@@ -28,6 +28,40 @@ import (
28
28
"go.opentelemetry.io/otel"
29
29
)
30
30
31
+ var slicePool = sync.Pool {
32
+ New : func () interface {} {
33
+ return make ([]byte , 1 << 20 )
34
+ },
35
+ }
36
+
37
+ func pooledSlice () []byte {
38
+ return slicePool .Get ().([]byte )
39
+ }
40
+
41
+ var readerPool = sync.Pool {
42
+ New : func () interface {} {
43
+ return bufio .NewReaderSize (nil , 1 << 20 )
44
+ },
45
+ }
46
+
47
+ func pooledBufioReader (r io.Reader ) * bufio.Reader {
48
+ br := readerPool .Get ().(* bufio.Reader )
49
+ br .Reset (r )
50
+ return br
51
+ }
52
+
53
+ var writerPool = sync.Pool {
54
+ New : func () interface {} {
55
+ return bufio .NewWriterSize (nil , 1 << 20 )
56
+ },
57
+ }
58
+
59
+ func pooledBufioWriter (w io.Writer ) * bufio.Writer {
60
+ bw := writerPool .Get ().(* bufio.Writer )
61
+ bw .Reset (w )
62
+ return bw
63
+ }
64
+
31
65
// APKExpanded contains information about and reference to an expanded APK package.
32
66
// Close() deletes all temporary files and directories created during the expansion process.
33
67
type APKExpanded struct {
@@ -66,8 +100,6 @@ type APKExpanded struct {
66
100
controlData []byte
67
101
}
68
102
69
- const meg = 1 << 20
70
-
71
103
func (a * APKExpanded ) ControlData () ([]byte , error ) {
72
104
a .Lock ()
73
105
defer a .Unlock ()
@@ -100,20 +132,16 @@ func (a *APKExpanded) PackageData() (*os.File, error) {
100
132
return nil , fmt .Errorf ("opening package data file: %w" , err )
101
133
}
102
134
103
- // Use min(1MB, a.Size) bufio to avoid GC pressure for small packages.
104
- bufSize := meg
105
- if total := int (a .Size ); total != 0 && total < bufSize {
106
- bufSize = total
107
- }
108
-
109
135
// Handle old caches without the uncompressed file.
110
136
f , err := os .Open (a .PackageFile )
111
137
if err != nil {
112
138
return nil , fmt .Errorf ("opening %q: %w" , a .PackageFile , err )
113
139
}
114
140
defer f .Close ()
115
141
116
- br := bufio .NewReaderSize (f , bufSize )
142
+ br := pooledBufioReader (f )
143
+ defer readerPool .Put (br )
144
+
117
145
zr , err := gzip .NewReader (br )
118
146
if err != nil {
119
147
return nil , fmt .Errorf ("parsing %q: %w" , a .PackageFile , err )
@@ -124,7 +152,9 @@ func (a *APKExpanded) PackageData() (*os.File, error) {
124
152
return nil , fmt .Errorf ("opening tar file %q: %w" , a .TarFile , err )
125
153
}
126
154
127
- buf := make ([]byte , bufSize )
155
+ buf := pooledSlice ()
156
+ defer slicePool .Put (buf )
157
+
128
158
if _ , err := io .CopyBuffer (uf , zr , buf ); err != nil {
129
159
return nil , fmt .Errorf ("decompressing %q: %w" , a .PackageFile , err )
130
160
}
@@ -390,7 +420,9 @@ func ExpandApk(ctx context.Context, source io.Reader, cacheDir string) (*APKExpa
390
420
if err != nil {
391
421
return nil , fmt .Errorf ("opening tar file: %w" , err )
392
422
}
393
- bw := bufio .NewWriterSize (tarfile , 1 << 20 )
423
+ bw := pooledBufioWriter (tarfile )
424
+ defer writerPool .Put (bw )
425
+
394
426
tr := io .TeeReader (gzi , bw )
395
427
396
428
if err := checkSums (ctx , tr ); err != nil {
0 commit comments