mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-05-20 23:09:27 +00:00
p2p/enode: optimize DistCmp (#32888)
This speeds up DistCmp by 75% through using 64-bit operations instead of byte-wise XOR.
This commit is contained in:
parent
5c6ba6b400
commit
b87581f297
2 changed files with 14 additions and 3 deletions
|
|
@ -359,9 +359,10 @@ func ParseID(in string) (ID, error) {
|
||||||
// Returns -1 if a is closer to target, 1 if b is closer to target
|
// Returns -1 if a is closer to target, 1 if b is closer to target
|
||||||
// and 0 if they are equal.
|
// and 0 if they are equal.
|
||||||
func DistCmp(target, a, b ID) int {
|
func DistCmp(target, a, b ID) int {
|
||||||
for i := range target {
|
for i := 0; i < len(target); i += 8 {
|
||||||
da := a[i] ^ target[i]
|
tn := binary.BigEndian.Uint64(target[i : i+8])
|
||||||
db := b[i] ^ target[i]
|
da := tn ^ binary.BigEndian.Uint64(a[i:i+8])
|
||||||
|
db := tn ^ binary.BigEndian.Uint64(b[i:i+8])
|
||||||
if da > db {
|
if da > db {
|
||||||
return 1
|
return 1
|
||||||
} else if da < db {
|
} else if da < db {
|
||||||
|
|
|
||||||
|
|
@ -368,6 +368,16 @@ func TestID_distcmpEqual(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkDistCmp(b *testing.B) {
|
||||||
|
base := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
|
||||||
|
aID := ID{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
|
||||||
|
bID := ID{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1}
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
_ = DistCmp(base, aID, bID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestID_logdist(t *testing.T) {
|
func TestID_logdist(t *testing.T) {
|
||||||
logdistBig := func(a, b ID) int {
|
logdistBig := func(a, b ID) int {
|
||||||
abig, bbig := new(big.Int).SetBytes(a[:]), new(big.Int).SetBytes(b[:])
|
abig, bbig := new(big.Int).SetBytes(a[:]), new(big.Int).SetBytes(b[:])
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue