Skip to content

Commit da74588

Browse files
authored
Merge pull request #197 from kuadrosx/improve-init-performance
feat: Optimize package initialization
2 parents 5caa0be + 76f8699 commit da74588

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+164
-153
lines changed

cmd/buildmetadata/main.go

+26-40
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package main
33
import (
44
"bytes"
55
"compress/gzip"
6-
"encoding/base64"
76
"encoding/binary"
87
"fmt"
98
"math"
@@ -19,6 +18,8 @@ import (
1918
"google.golang.org/protobuf/proto"
2019
)
2120

21+
const distPath = "data"
22+
2223
func main() {
2324
if err := buildMetadata(); err != nil {
2425
fmt.Fprintln(os.Stderr, err)
@@ -35,39 +36,39 @@ func buildMetadata() error {
3536

3637
fmt.Print("OK\nBuilding number metadata...")
3738

38-
metadata, err := buildNumberMetadata("resources/PhoneNumberMetadata.xml", "NumberData", "metadata_bin.go", false)
39+
metadata, err := buildNumberMetadata("resources/PhoneNumberMetadata.xml", "NumberData", "metadata.xml.gz", false)
3940
if err != nil {
4041
return err
4142
}
4243

4344
fmt.Print("OK\nBuilding short number metadata...")
4445

45-
_, err = buildNumberMetadata("resources/ShortNumberMetadata.xml", "ShortNumberData", "shortnumber_metadata_bin.go", true)
46+
_, err = buildNumberMetadata("resources/ShortNumberMetadata.xml", "ShortNumberData", "shortnumber_metadata.xml.gz", true)
4647
if err != nil {
4748
return err
4849
}
4950

5051
fmt.Print("OK\nBuilding region metadata...")
5152

52-
if err := buildRegionMetadata(metadata, "RegionData", "countrycode_to_region_bin.go"); err != nil {
53+
if err := buildRegionMetadata(metadata, "RegionData", "countrycode_to_region.xml.gz"); err != nil {
5354
return err
5455
}
5556

5657
fmt.Print("OK\nBuilding timezone metadata...")
5758

58-
if err := buildTimezoneMetadata("resources/timezones/map_data.txt", "TimezoneData", "prefix_to_timezone_bin.go"); err != nil {
59+
if err := buildTimezoneMetadata("resources/timezones/map_data.txt", "TimezoneData", "prefix_to_timezone.xml.gz"); err != nil {
5960
return err
6061
}
6162

6263
fmt.Println("OK\nBuilding carrier prefix metadata...")
6364

64-
if err := buildPrefixMetadata("resources/carrier", "CarrierData", "prefix_to_carriers_bin.go"); err != nil {
65+
if err := buildPrefixMetadata("resources/carrier", "CarrierData", "prefix_to_carriers"); err != nil {
6566
return err
6667
}
6768

6869
fmt.Println("Building geographic prefix metadata...")
6970

70-
if err := buildPrefixMetadata("resources/geocoding", "GeocodingData", "prefix_to_geocodings_bin.go"); err != nil {
71+
if err := buildPrefixMetadata("resources/geocoding", "GeocodingData", "prefix_to_geocodings"); err != nil {
7172
return err
7273
}
7374

@@ -101,7 +102,7 @@ func buildNumberMetadata(srcFile, varName, dstFile string, short bool) (*phonenu
101102
return nil, fmt.Errorf("error marshaling metadata as protobuf: %w", err)
102103
}
103104

104-
if err := os.WriteFile("gen/"+dstFile, generateBinFile(varName, data), os.FileMode(0664)); err != nil {
105+
if err := os.WriteFile(distPath+"/"+dstFile, generateBinFile(varName, data), os.FileMode(0664)); err != nil {
105106
return nil, fmt.Errorf("error writing %s: %w", dstFile, err)
106107
}
107108

@@ -117,7 +118,7 @@ func buildRegionMetadata(metadata *phonenumbers.PhoneMetadataCollection, varName
117118
return fmt.Errorf("error generating %s: %w", dstFile, err)
118119
}
119120

120-
if err := os.WriteFile("gen/"+dstFile, generateBinFile(varName, data), os.FileMode(0664)); err != nil {
121+
if err := os.WriteFile(distPath+"/"+dstFile, generateBinFile(varName, data), os.FileMode(0664)); err != nil {
121122
return fmt.Errorf("error writing %s: %w", dstFile, err)
122123
}
123124

@@ -165,16 +166,21 @@ func buildTimezoneMetadata(srcFile, varName, dstFile string) error {
165166
return fmt.Errorf("error generating %s: %w", dstFile, err)
166167
}
167168

168-
if err := os.WriteFile("gen/"+dstFile, generateBinFile(varName, data), os.FileMode(0664)); err != nil {
169+
if err := os.WriteFile(distPath+"/"+dstFile, generateBinFile(varName, data), os.FileMode(0664)); err != nil {
169170
return fmt.Errorf("error writing %s: %w", dstFile, err)
170171
}
171172

172173
return nil
173174
}
174175

175-
func buildPrefixMetadata(srcDir, varName, dstFile string) error {
176+
func buildPrefixMetadata(srcDir, varName, dstDir string) error {
176177
// get our top level language directories
177-
dirs, err := filepath.Glob(fmt.Sprintf("_build/%s/*", srcDir))
178+
dirs, err := filepath.Glob(filepath.Join("_build", srcDir, "*"))
179+
if err != nil {
180+
return err
181+
}
182+
183+
err = os.MkdirAll(distPath+"/"+dstDir, os.ModePerm)
178184
if err != nil {
179185
return err
180186
}
@@ -197,10 +203,6 @@ func buildPrefixMetadata(srcDir, varName, dstFile string) error {
197203
languageMappings[filepath.Base(dir)] = mappings
198204
}
199205

200-
output := bytes.Buffer{}
201-
output.WriteString("package gen\n\n")
202-
output.WriteString(fmt.Sprintf("var %s = map[string]string {\n", varName))
203-
204206
langs := maps.Keys(languageMappings)
205207
sort.Strings(langs)
206208

@@ -275,20 +277,14 @@ func buildPrefixMetadata(srcDir, varName, dstFile string) error {
275277

276278
var compressed bytes.Buffer
277279
w := gzip.NewWriter(&compressed)
278-
w.Write(data.Bytes())
280+
if _, err := w.Write(data.Bytes()); err != nil {
281+
return err
282+
}
279283
w.Close()
280-
c := base64.StdEncoding.EncodeToString(compressed.Bytes())
281-
output.WriteString("\t")
282-
output.WriteString(strconv.Quote(lang))
283-
output.WriteString(": ")
284-
output.WriteString(strconv.Quote(c))
285-
output.WriteString(",\n")
286-
}
287-
288-
output.WriteString("}")
289284

290-
if err := os.WriteFile("gen/"+dstFile, output.Bytes(), os.FileMode(0664)); err != nil {
291-
return fmt.Errorf("error writing %s: %w", dstFile, err)
285+
if err := os.WriteFile(distPath+"/"+dstDir+"/"+lang+".txt.gz", compressed.Bytes(), os.FileMode(0664)); err != nil {
286+
return fmt.Errorf("error writing %s: %w", dstDir, err)
287+
}
292288
}
293289

294290
return nil
@@ -374,18 +370,8 @@ func generateBinFile(varName string, data []byte) []byte {
374370
w := gzip.NewWriter(&compressed)
375371
w.Write(data)
376372
w.Close()
377-
encoded := base64.StdEncoding.EncodeToString(compressed.Bytes())
378-
379-
// create our output
380-
output := &bytes.Buffer{}
381-
382-
// write our header
383-
output.WriteString("package gen\n\nvar ")
384-
output.WriteString(varName)
385-
output.WriteString(" = ")
386-
output.WriteString(strconv.Quote(string(encoded)))
387-
output.WriteString("\n")
388-
return output.Bytes()
373+
374+
return compressed.Bytes()
389375
}
390376

391377
func readMappingsForDir(dir string) (map[int]string, error) {

data/countrycode_to_region.xml.gz

1.09 KB
Binary file not shown.

data/metadata.xml.gz

51.4 KB
Binary file not shown.

data/prefix_to_carriers/ar.txt.gz

89 Bytes
Binary file not shown.

data/prefix_to_carriers/be.txt.gz

92 Bytes
Binary file not shown.

data/prefix_to_carriers/en.txt.gz

31.6 KB
Binary file not shown.

data/prefix_to_carriers/fa.txt.gz

251 Bytes
Binary file not shown.

data/prefix_to_carriers/ko.txt.gz

140 Bytes
Binary file not shown.

data/prefix_to_carriers/ru.txt.gz

1.45 KB
Binary file not shown.

data/prefix_to_carriers/uk.txt.gz

177 Bytes
Binary file not shown.

data/prefix_to_carriers/zh.txt.gz

653 Bytes
Binary file not shown.
564 Bytes
Binary file not shown.

data/prefix_to_geocodings/ar.txt.gz

175 Bytes
Binary file not shown.

data/prefix_to_geocodings/be.txt.gz

1.33 KB
Binary file not shown.

data/prefix_to_geocodings/bg.txt.gz

15.9 KB
Binary file not shown.

data/prefix_to_geocodings/bs.txt.gz

300 Bytes
Binary file not shown.

data/prefix_to_geocodings/de.txt.gz

48.2 KB
Binary file not shown.

data/prefix_to_geocodings/el.txt.gz

2.32 KB
Binary file not shown.

data/prefix_to_geocodings/en.txt.gz

541 KB
Binary file not shown.

data/prefix_to_geocodings/es.txt.gz

7.81 KB
Binary file not shown.

data/prefix_to_geocodings/fa.txt.gz

621 Bytes
Binary file not shown.

data/prefix_to_geocodings/fi.txt.gz

168 Bytes
Binary file not shown.

data/prefix_to_geocodings/fr.txt.gz

2.74 KB
Binary file not shown.

data/prefix_to_geocodings/hr.txt.gz

227 Bytes
Binary file not shown.

data/prefix_to_geocodings/hu.txt.gz

557 Bytes
Binary file not shown.

data/prefix_to_geocodings/hy.txt.gz

2.77 KB
Binary file not shown.

data/prefix_to_geocodings/id.txt.gz

2.65 KB
Binary file not shown.

data/prefix_to_geocodings/it.txt.gz

1.98 KB
Binary file not shown.

data/prefix_to_geocodings/iw.txt.gz

118 Bytes
Binary file not shown.

data/prefix_to_geocodings/ja.txt.gz

4.57 KB
Binary file not shown.

data/prefix_to_geocodings/ko.txt.gz

169 Bytes
Binary file not shown.

data/prefix_to_geocodings/nl.txt.gz

1.41 KB
Binary file not shown.

data/prefix_to_geocodings/pl.txt.gz

507 Bytes
Binary file not shown.

data/prefix_to_geocodings/pt.txt.gz

56.6 KB
Binary file not shown.

data/prefix_to_geocodings/ro.txt.gz

798 Bytes
Binary file not shown.

data/prefix_to_geocodings/ru.txt.gz

7.46 KB
Binary file not shown.

data/prefix_to_geocodings/sq.txt.gz

110 Bytes
Binary file not shown.

data/prefix_to_geocodings/sr.txt.gz

631 Bytes
Binary file not shown.

data/prefix_to_geocodings/sv.txt.gz

2.46 KB
Binary file not shown.

data/prefix_to_geocodings/th.txt.gz

731 Bytes
Binary file not shown.

data/prefix_to_geocodings/tr.txt.gz

732 Bytes
Binary file not shown.

data/prefix_to_geocodings/uk.txt.gz

6.08 KB
Binary file not shown.

data/prefix_to_geocodings/vi.txt.gz

683 Bytes
Binary file not shown.

data/prefix_to_geocodings/zh.txt.gz

103 KB
Binary file not shown.
215 Bytes
Binary file not shown.

data/prefix_to_timezone.xml.gz

6.67 KB
Binary file not shown.

data/shortnumber_metadata.xml.gz

14.1 KB
Binary file not shown.

gen/countrycode_to_region_bin.go

-3
This file was deleted.

gen/metadata_bin.go

-3
This file was deleted.

gen/prefix_to_carriers_bin.go

-13
This file was deleted.

gen/prefix_to_geocodings_bin.go

-37
This file was deleted.

gen/prefix_to_timezone_bin.go

-3
This file was deleted.

gen/shortnumber_metadata_bin.go

-3
This file was deleted.

medatadata.go

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package phonenumbers
2+
3+
import "embed"
4+
5+
//go:embed data/countrycode_to_region.xml.gz
6+
var regionData []byte
7+
8+
//go:embed data/metadata.xml.gz
9+
var numberData []byte
10+
11+
//go:embed data/prefix_to_carriers/*.gz
12+
var carrierData embed.FS
13+
var carrierDataPath = "data/prefix_to_carriers"
14+
15+
//go:embed data/prefix_to_geocodings/*.gz
16+
var geocodingData embed.FS
17+
var geocodingDataPath = "data/prefix_to_geocodings"
18+
19+
//go:embed data/prefix_to_timezone.xml.gz
20+
var timezoneData []byte
21+
22+
//go:embed data/shortnumber_metadata.xml.gz
23+
var shortNumberData []byte

0 commit comments

Comments
 (0)