Skip to content

Commit eba36c5

Browse files
josharianzx2c4
authored andcommitted
device: remove code using unsafe
There is no performance impact. name old time/op new time/op delta TrieIPv4Peers100Addresses1000-8 78.6ns ± 1% 79.4ns ± 3% ~ (p=0.604 n=10+9) TrieIPv4Peers10Addresses10-8 29.1ns ± 2% 28.8ns ± 1% -1.12% (p=0.014 n=10+9) TrieIPv6Peers100Addresses1000-8 78.9ns ± 1% 78.6ns ± 1% ~ (p=0.492 n=10+10) TrieIPv6Peers10Addresses10-8 29.3ns ± 2% 28.6ns ± 2% -2.16% (p=0.000 n=10+10) Signed-off-by: Josh Bleecher Snyder <[email protected]>
1 parent 54c4997 commit eba36c5

File tree

1 file changed

+13
-33
lines changed

1 file changed

+13
-33
lines changed

Diff for: device/allowedips.go

+13-33
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package device
77

88
import (
99
"container/list"
10+
"encoding/binary"
1011
"errors"
1112
"math/bits"
1213
"net"
@@ -32,45 +33,24 @@ type trieEntry struct {
3233
perPeerElem *list.Element
3334
}
3435

35-
func isLittleEndian() bool {
36-
one := uint32(1)
37-
return *(*byte)(unsafe.Pointer(&one)) != 0
38-
}
39-
40-
func swapU32(i uint32) uint32 {
41-
if !isLittleEndian() {
42-
return i
43-
}
44-
45-
return bits.ReverseBytes32(i)
46-
}
47-
48-
func swapU64(i uint64) uint64 {
49-
if !isLittleEndian() {
50-
return i
51-
}
52-
53-
return bits.ReverseBytes64(i)
54-
}
55-
5636
func commonBits(ip1, ip2 []byte) uint8 {
5737
size := len(ip1)
5838
if size == net.IPv4len {
59-
a := (*uint32)(unsafe.Pointer(&ip1[0]))
60-
b := (*uint32)(unsafe.Pointer(&ip2[0]))
61-
x := *a ^ *b
62-
return uint8(bits.LeadingZeros32(swapU32(x)))
39+
a := binary.BigEndian.Uint32(ip1)
40+
b := binary.BigEndian.Uint32(ip2)
41+
x := a ^ b
42+
return uint8(bits.LeadingZeros32(x))
6343
} else if size == net.IPv6len {
64-
a := (*uint64)(unsafe.Pointer(&ip1[0]))
65-
b := (*uint64)(unsafe.Pointer(&ip2[0]))
66-
x := *a ^ *b
44+
a := binary.BigEndian.Uint64(ip1)
45+
b := binary.BigEndian.Uint64(ip2)
46+
x := a ^ b
6747
if x != 0 {
68-
return uint8(bits.LeadingZeros64(swapU64(x)))
48+
return uint8(bits.LeadingZeros64(x))
6949
}
70-
a = (*uint64)(unsafe.Pointer(&ip1[8]))
71-
b = (*uint64)(unsafe.Pointer(&ip2[8]))
72-
x = *a ^ *b
73-
return 64 + uint8(bits.LeadingZeros64(swapU64(x)))
50+
a = binary.BigEndian.Uint64(ip1[8:])
51+
b = binary.BigEndian.Uint64(ip2[8:])
52+
x = a ^ b
53+
return 64 + uint8(bits.LeadingZeros64(x))
7454
} else {
7555
panic("Wrong size bit string")
7656
}

0 commit comments

Comments
 (0)