Skip to content

Commit

Permalink
rotate patterns; add disjoint shortcut to comparePaths
Browse files Browse the repository at this point in the history
  • Loading branch information
jba committed Jun 14, 2023
1 parent 67b34c4 commit ae0b671
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 0 deletions.
3 changes: 3 additions & 0 deletions pattern.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,9 @@ func (p1 *Pattern) compareMethods(p2 *Pattern) relationship {
// overlaps: there is a path that both match, but neither is more specific
// disjoint: there is no path that both match
func (p1 *Pattern) comparePaths(p2 *Pattern) relationship {
if len(p1.segments) != len(p2.segments) && !p1.isMulti() && !p2.isMulti() {
return disjoint
}
// Track whether a single (non-multi) wildcard in p1 matched
// a literal in p2, and vice versa.
// We care about these because if a wildcard matches a literal, then the
Expand Down
30 changes: 30 additions & 0 deletions register-disjoint-shortcut-rotated-pat.bench
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
goos: linux
goarch: amd64
pkg: github.com/jba/muxpatterns
cpu: Intel(R) Xeon(R) CPU @ 2.20GHz
BenchmarkRegister-8 1 1192955135 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1203853379 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1161608161 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1185815843 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1162129242 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1193139316 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
PASS
ok github.com/jba/muxpatterns 7.141s
48 changes: 48 additions & 0 deletions register-disjoint-shortcut.bench
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
goos: linux
goarch: amd64
pkg: github.com/jba/muxpatterns
cpu: Intel(R) Xeon(R) CPU @ 2.20GHz
BenchmarkRegister-8 2 947193948 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:154: conflict calls: 13517400
BenchmarkRegister-8 2 934951642 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:154: conflict calls: 13517400
BenchmarkRegister-8 2 940600999 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:154: conflict calls: 13517400
BenchmarkRegister-8 2 963159562 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:154: conflict calls: 13517400
BenchmarkRegister-8 2 929820226 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:154: conflict calls: 13517400
BenchmarkRegister-8 2 934770076 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:144: benchmarking with 5200 patterns
server_test.go:154: conflict calls: 13517400
server_test.go:154: conflict calls: 13517400
PASS
ok github.com/jba/muxpatterns 17.035s
30 changes: 30 additions & 0 deletions register-rotated-pat.bench
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
goos: linux
goarch: amd64
pkg: github.com/jba/muxpatterns
cpu: Intel(R) Xeon(R) CPU @ 2.20GHz
BenchmarkRegister-8 1 1259945549 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1283687262 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1277344750 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1293561461 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1295861943 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
BenchmarkRegister-8 1 1295704471 ns/op
--- BENCH: BenchmarkRegister-8
server_test.go:145: benchmarking with 5200 patterns
server_test.go:160: conflict calls: 13517400
PASS
ok github.com/jba/muxpatterns 7.746s
22 changes: 22 additions & 0 deletions server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"net/url"
"os"
"path/filepath"
"strings"
"testing"
)

Expand Down Expand Up @@ -142,6 +143,11 @@ func BenchmarkRegister(b *testing.B) {
b.Fatal(scan.Err())
}
b.Logf("benchmarking with %d patterns", len(patterns))
// To make path comparison harder, move API name to the end.
for i, p := range patterns {
patterns[i] = moveFirstSegmentToEnd(p)
}

b.ResetTimer()

for i := 0; i < b.N; i++ {
Expand All @@ -154,3 +160,19 @@ func BenchmarkRegister(b *testing.B) {
b.Logf("conflict calls: %d", mux.conflictCalls.Load())
}
}

func moveFirstSegmentToEnd(pat string) string {
method, path, found := strings.Cut(pat, " ")
if !found {
panic("bad pattern:" + pat)
}
if len(path) == 0 || path[0] != '/' {
panic("bad path: " + path)
}
first, rest, found := strings.Cut(path[1:], "/")
if !found {
panic("missing /:" + path[1:])
}
path = "/" + rest + "/" + first
return method + " " + path
}

0 comments on commit ae0b671

Please sign in to comment.