Skip to content

Commit f51e9f4

Browse files
committed
Slightly improve performance of node offset calculation
1 parent 78d62e5 commit f51e9f4

File tree

2 files changed

+10
-12
lines changed

2 files changed

+10
-12
lines changed

reader.go

+9-11
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type Reader struct {
2828
Metadata Metadata
2929
ipv4Start uint
3030
ipv4StartBitDepth int
31+
nodeOffsetMult uint
3132
}
3233

3334
// Metadata holds the metadata decoded from the MaxMind DB file. In particular
@@ -90,11 +91,12 @@ func FromBytes(buffer []byte) (*Reader, error) {
9091
}
9192

9293
reader := &Reader{
93-
buffer: buffer,
94-
nodeReader: nodeReader,
95-
decoder: d,
96-
Metadata: metadata,
97-
ipv4Start: 0,
94+
buffer: buffer,
95+
nodeReader: nodeReader,
96+
decoder: d,
97+
Metadata: metadata,
98+
ipv4Start: 0,
99+
nodeOffsetMult: metadata.RecordSize / 4,
98100
}
99101

100102
reader.setIPv4Start()
@@ -112,7 +114,7 @@ func (r *Reader) setIPv4Start() {
112114
node := uint(0)
113115
i := 0
114116
for ; i < 96 && node < nodeCount; i++ {
115-
node = r.nodeReader.readLeft(r.nodeOffset(node))
117+
node = r.nodeReader.readLeft(node * r.nodeOffsetMult)
116118
}
117119
r.ipv4Start = node
118120
r.ipv4StartBitDepth = i
@@ -251,7 +253,7 @@ func (r *Reader) lookupPointer(ip net.IP) (uint, int, net.IP, error) {
251253
for ; i < bitCount && node < nodeCount; i++ {
252254
bit := uint(1) & (uint(ip[i>>3]) >> (7 - (i % 8)))
253255

254-
offset := r.nodeOffset(node)
256+
offset := node * r.nodeOffsetMult
255257
if bit == 0 {
256258
node = r.nodeReader.readLeft(offset)
257259
} else {
@@ -268,10 +270,6 @@ func (r *Reader) lookupPointer(ip net.IP) (uint, int, net.IP, error) {
268270
return 0, int(i), ip, newInvalidDatabaseError("invalid node in search tree")
269271
}
270272

271-
func (r *Reader) nodeOffset(node uint) uint {
272-
return node * r.Metadata.RecordSize / 4
273-
}
274-
275273
func (r *Reader) retrieveData(pointer uint, result interface{}) error {
276274
offset, err := r.resolveDataPointer(pointer)
277275
if err != nil {

traverse.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func (n *Networks) Next() bool {
6060
}
6161
ipRight[node.bit>>3] |= 1 << (7 - (node.bit % 8))
6262

63-
offset := n.reader.nodeOffset(node.pointer)
63+
offset := node.pointer * n.reader.nodeOffsetMult
6464
rightPointer := n.reader.nodeReader.readRight(offset)
6565

6666
node.bit++

0 commit comments

Comments
 (0)