Skip to content

Commit ede9e77

Browse files
committed
optimize network builder
old: 208 B/op 11 allocs/op new: 80 B/op 5 allocs/op
1 parent 34a5209 commit ede9e77

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

common.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,29 @@ import (
44
"encoding/binary"
55
"errors"
66
"math"
7+
"net"
78
"strconv"
89
"unsafe"
910
)
1011

12+
func getNetworkString(ip net.IP, mask uint) string {
13+
bitLen := 128
14+
for i := 0; i < len(ip); i++ {
15+
if ip[i] != 0 {
16+
if i == 10 {
17+
bitLen = 32
18+
}
19+
break
20+
}
21+
}
22+
cidrMask := net.CIDRMask(int(mask), bitLen)
23+
ipNet := net.IPNet{
24+
IP: ip.Mask(cidrMask),
25+
Mask: cidrMask,
26+
}
27+
return ipNet.String()
28+
}
29+
1130
func readControl(buffer []byte, offset uint) (byte, uint, uint, error) {
1231
controlByte := buffer[offset]
1332
offset++

geoip2_test.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package geoip2
22

33
import (
44
"net"
5+
"runtime"
56
"testing"
67
)
78

@@ -73,7 +74,7 @@ func TestReader(t *testing.T) {
7374
}
7475

7576
func BenchmarkGeoIP2(b *testing.B) {
76-
ip := net.ParseIP("81.2.69.142")
77+
ip := net.ParseIP("1.128.0.0")
7778
b.ReportAllocs()
7879

7980
b.Run("country", func(b *testing.B) {
@@ -159,13 +160,21 @@ func BenchmarkGeoIP2(b *testing.B) {
159160
}
160161
b.Run("sync", func(b *testing.B) {
161162
for i := 0; i < b.N; i++ {
162-
_, _ = reader.Lookup(ip)
163+
asn, err := reader.Lookup(ip)
164+
if err != nil {
165+
b.Fatal(err)
166+
}
167+
runtime.KeepAlive(asn.Network)
163168
}
164169
})
165170
b.Run("parallel", func(b *testing.B) {
166171
b.RunParallel(func(pb *testing.PB) {
167172
for pb.Next() {
168-
_, _ = reader.Lookup(ip)
173+
asn, err := reader.Lookup(ip)
174+
if err != nil {
175+
b.Fatal(err)
176+
}
177+
runtime.KeepAlive(asn.Network)
169178
}
170179
})
171180
})

reader_asn.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package geoip2
22

33
import (
44
"errors"
5-
"fmt"
65
"io/ioutil"
76
"net"
87
"strconv"
@@ -22,8 +21,7 @@ func (r *ASNReader) Lookup(ip net.IP) (*ASN, error) {
2221
return nil, err
2322
}
2423
result := &ASN{}
25-
_, network, err := net.ParseCIDR(fmt.Sprintf("%s/%s", ip.String(), strconv.Itoa(int(prefix))))
26-
result.Network = network.String()
24+
result.Network = getNetworkString(ip, prefix)
2725
switch dataType {
2826
case dataTypeMap:
2927
_, err = readASNMap(result, r.decoderBuffer, size, offset)

0 commit comments

Comments
 (0)