package iprtb import ( "net" "testing" ) func Benchmark_PrefixTreeAlgorithm(b *testing.B) { rtb := NewRouteTable() target := net.IPv4(192, 0, 2, 100) _ = rtb.AddRoute(&Route{ Destination: &net.IPNet{ IP: net.IPv4(192, 0, 1, 0), Mask: net.IPv4Mask(255, 255, 255, 0), }, Gateway: net.IPv4(192, 0, 2, 1), NetworkInterface: "ifb1", Metric: 1, }) _ = rtb.AddRoute(&Route{ Destination: &net.IPNet{ IP: net.IPv4(192, 0, 2, 0), Mask: net.IPv4Mask(255, 255, 255, 0), }, Gateway: net.IPv4(192, 0, 2, 1), NetworkInterface: "ifb2", Metric: 1, }) _ = rtb.AddRoute(&Route{ Destination: &net.IPNet{ IP: net.IPv4(192, 0, 0, 0), Mask: net.IPv4Mask(255, 255, 0, 0), }, Gateway: net.IPv4(192, 0, 2, 1), NetworkInterface: "ifb3", Metric: 1, }) _ = rtb.AddRoute(&Route{ Destination: &net.IPNet{ IP: net.IPv4(192, 0, 0, 0), Mask: net.IPv4Mask(255, 0, 0, 0), }, Gateway: net.IPv4(192, 0, 2, 1), NetworkInterface: "ifb4", Metric: 1, }) matched, _ := rtb.MatchRoute(target) if matched.Unwrap().NetworkInterface != "ifb2" { b.Fatal("precondition unmatched; route not exists") } for n := 0; n < b.N; n++ { rtb.MatchRoute(target) } } func Benchmark_LinearSearch(b *testing.B) { rtb := NewRouteTableOld() target := net.IPv4(192, 0, 2, 100) rtb.AddRoute( net.IPNet{ IP: net.IPv4(192, 0, 1, 0), Mask: net.IPv4Mask(255, 255, 255, 0), }, net.IPv4(192, 0, 2, 1), "ifb1", 1, ) rtb.AddRoute( net.IPNet{ IP: net.IPv4(192, 0, 2, 0), Mask: net.IPv4Mask(255, 255, 255, 0), }, net.IPv4(192, 0, 2, 1), "ifb2", 1, ) rtb.AddRoute( net.IPNet{ IP: net.IPv4(192, 0, 0, 0), Mask: net.IPv4Mask(255, 255, 0, 0), }, net.IPv4(192, 0, 2, 1), "ifb3", 1, ) rtb.AddRoute( net.IPNet{ IP: net.IPv4(192, 0, 0, 0), Mask: net.IPv4Mask(255, 0, 0, 0), }, net.IPv4(192, 0, 2, 1), "ifb4", 1, ) matched := rtb.MatchRoute(target) if matched.Unwrap().NwInterface != "ifb2" { b.Fatal("precondition unmatched; route not exists") } for n := 0; n < b.N; n++ { rtb.MatchRoute(target) } }