Skip to content

Commit

Permalink
lookup optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
gaissmai committed Dec 20, 2024
1 parent b2f8de3 commit c9c06ea
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 59 deletions.
29 changes: 29 additions & 0 deletions my_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package bart

import (
"net/netip"
"testing"
)

func TestMy(t *testing.T) {
pfxs := []netip.Prefix{
mpp("255.0.0.0/8"),
mpp("250.255.0.0/16"),
mpp("250.250.255.0/24"),
mpp("250.250.250.255/32"),
mpp("250.250.250.250/32"),
}

tbl := new(Table[string])
for _, p := range pfxs {
tbl.Insert(p, p.String())
}

probe := mpa("250.250.250.251")
_ = tbl.Contains(probe)
/*
t.Errorf("Contains: %v", tbl.Contains(probe))
t.Error(tbl.dumpString())
t.Error(tbl)
*/
}
18 changes: 15 additions & 3 deletions node.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,14 @@ func (n *node[V]) isEmpty() bool {
// backtracking is fast, it's just a bitset test and, if found, one popcount.
// max steps in backtracking is the stride length.
func (n *node[V]) lpm(idx uint) (baseIdx uint, val V, ok bool) {
// backtracking the CBT, make it as fast as possible
for baseIdx = idx; baseIdx > 0; baseIdx >>= 1 {
// shortcut optimization
minIdx, ok := n.prefixes.NextSet(0)
if !ok {
return 0, val, false
}

// backtracking the CBT
for baseIdx = idx; baseIdx >= minIdx; baseIdx >>= 1 {
// practically it's get, but get is not inlined
if n.prefixes.Test(baseIdx) {
return baseIdx, n.prefixes.MustGet(baseIdx), true
Expand All @@ -68,8 +74,14 @@ func (n *node[V]) lpm(idx uint) (baseIdx uint, val V, ok bool) {

// lpmTest for faster lpm tests without value returns
func (n *node[V]) lpmTest(idx uint) bool {
// shortcut optimization
minIdx, ok := n.prefixes.NextSet(0)
if !ok {
return false
}

// backtracking the CBT
for idx := idx; idx > 0; idx >>= 1 {
for idx := idx; idx >= minIdx; idx >>= 1 {
if n.prefixes.Test(idx) {
return true
}
Expand Down
114 changes: 58 additions & 56 deletions table_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2143,65 +2143,67 @@ func BenchmarkWorstCase(b *testing.B) {
}
})

b.Run("match IP6", func(b *testing.B) {
pfxs := []netip.Prefix{
mpp("ff00::/8"),
mpp("fffe::/16"),
mpp("fffe:ff00::/24"),
mpp("fffe:fffe:fffe:fffe::/32"),
mpp("fffe:fffe:fffe:fffe:fffe::/40"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe::/48"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe::/56"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/64"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/72"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/80"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/88"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/96"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/104"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/112"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/120"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/128"),
}
/*
b.Run("match IP6", func(b *testing.B) {
pfxs := []netip.Prefix{
mpp("ff00::/8"),
mpp("fffe::/16"),
mpp("fffe:ff00::/24"),
mpp("fffe:fffe:fffe:fffe::/32"),
mpp("fffe:fffe:fffe:fffe:fffe::/40"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe::/48"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe::/56"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/64"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/72"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/80"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/88"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/96"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/104"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/112"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/120"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/128"),
}
tbl := new(Table[string])
for _, p := range pfxs {
tbl.Insert(p, p.String())
}
tbl := new(Table[string])
for _, p := range pfxs {
tbl.Insert(p, p.String())
}
probe := mpa("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:ffff::/128")
for range b.N {
boolSink = tbl.Contains(probe)
}
})
probe := mpa("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:ffff::/128")
for range b.N {
boolSink = tbl.Contains(probe)
}
})
b.Run("miss IP6", func(b *testing.B) {
pfxs := []netip.Prefix{
// mpp("fffe::/8"),
mpp("fffe:fffe::/16"),
mpp("fffe:fffe:fffe::/24"),
mpp("fffe:fffe:fffe:fffe::/32"),
mpp("fffe:fffe:fffe:fffe:fffe::/40"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe::/48"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe::/56"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/64"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/72"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/80"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/88"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/96"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/104"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/112"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/120"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/128"),
}
b.Run("miss IP6", func(b *testing.B) {
pfxs := []netip.Prefix{
// mpp("fffe::/8"),
mpp("fffe:fffe::/16"),
mpp("fffe:fffe:fffe::/24"),
mpp("fffe:fffe:fffe:fffe::/32"),
mpp("fffe:fffe:fffe:fffe:fffe::/40"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe::/48"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe::/56"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/64"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/72"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/80"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/88"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/96"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/104"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/112"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/120"),
mpp("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe::/128"),
}
tbl := new(Table[string])
for _, p := range pfxs {
tbl.Insert(p, p.String())
}
tbl := new(Table[string])
for _, p := range pfxs {
tbl.Insert(p, p.String())
}
probe := mpa("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:ffff::/128")
for range b.N {
boolSink = tbl.Contains(probe)
}
})
probe := mpa("fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:fffe:ffff::/128")
for range b.N {
boolSink = tbl.Contains(probe)
}
})
*/
}

0 comments on commit c9c06ea

Please sign in to comment.