test: rework and calibrate Lua DNS and routing benchmarks

This commit is contained in:
Meo597
2026-10-05 15:16:01 +08:00
parent 8d80e9924f
commit d86ad7c501
4 changed files with 341 additions and 131 deletions
-75
View File
@@ -271,79 +271,4 @@ func TestFindProcess(t *testing.T) {
}
}
// BenchmarkLuaRoute measures a preloaded routing script using its context bridge.
// The direct case runs an equivalent native routing rule.
func BenchmarkLuaRoute(b *testing.B) {
r := new(Router)
if err := r.Init(context.Background(), &Config{Rule: []*RoutingRule{{
TargetTag: &RoutingRule_Tag{Tag: "out"},
RuleTag: "rule",
InboundTag: []string{"in"},
Networks: []net.Network{net.Network_TCP},
Ip: []*geodata.IPRule{{
Value: &geodata.IPRule_Custom{Custom: &geodata.CIDRRule{
Cidr: &geodata.CIDR{Ip: []byte{127, 0, 0, 0}, Prefix: 8},
}},
}},
}}}, nil, nil, nil); err != nil {
b.Fatal(err)
}
L := lua.NewState()
defer L.Close()
r.RegisterLua(L)
geodata.RegisterLua(L)
if err := L.DoString(`
local router = require("xray.router")
local matcher = require("xray.geodata").BuildIPMatcher("127.0.0.0/8")
function HandleRoute(ctx, inboundTag, sourcePort, targetPort, localPort,
targetDomain, network, protocol, user, vlessRoute, skipDNSResolve)
if inboundTag == "in" and network == router.NetworkTCP and matcher:AnyMatch(ctx:GetTargetIPs()) then
return "out", "rule"
end
end
`); err != nil {
b.Fatal(err)
}
L.SetContext(context.Background())
ctx := newLuaRouteTestContext()
for _, benchmark := range []struct {
name string
route func() (string, string, error)
}{
{"direct", func() (string, string, error) {
route, err := r.PickRoute(ctx)
if err != nil {
return "", "", err
}
return route.GetOutboundTag(), route.GetRuleTag(), nil
}},
{"lua_script", func() (string, string, error) {
if err := callLuaRoute(L, ctx); err != nil {
return "", "", err
}
outboundTag, ruleTag, err := readLuaRouteResult(L)
L.Pop(3)
return outboundTag, ruleTag, err
}},
} {
b.Run(benchmark.name, func(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
var outboundTag, ruleTag string
var err error
for i := 0; i < b.N; i++ {
outboundTag, ruleTag, err = benchmark.route()
if err != nil {
b.Fatal(err)
}
}
b.StopTimer()
if outboundTag != "out" || ruleTag != "rule" {
b.Fatalf("route() = %q, %q; want out, rule", outboundTag, ruleTag)
}
})
}
}
var _ routing.Context = (*luaRouteTestContext)(nil)