diff --git a/README.md b/README.md index f8ccd5c..cc2d1c0 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,22 @@ # benchmarks +- goos: linux +- goarch: amd64 +- cpu: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz + ## Web +Router tree with 203 routes (GitHub): + ``` -BenchmarkAero/Hello-12 26931560 41.81 ns/op 0 B/op 0 allocs/op -BenchmarkAero/GitHub-12 14009696 81.21 ns/op 0 B/op 0 allocs/op -BenchmarkAkyoto/Hello-12 33492621 33.18 ns/op 0 B/op 0 allocs/op -BenchmarkAkyoto/GitHub-12 16838250 67.83 ns/op 0 B/op 0 allocs/op -BenchmarkBeego/Hello-12 1000000 1102 ns/op 880 B/op 8 allocs/op -BenchmarkBeego/GitHub-12 624705 1662 ns/op 929 B/op 9 allocs/op -BenchmarkBone/Hello-12 42657504 27.23 ns/op 0 B/op 0 allocs/op -BenchmarkBone/GitHub-12 99516 11865 ns/op 4705 B/op 67 allocs/op -BenchmarkChi/Hello-12 3925130 304.0 ns/op 336 B/op 2 allocs/op -BenchmarkChi/GitHub-12 3351840 358.3 ns/op 336 B/op 2 allocs/op -BenchmarkEcho/Hello-12 22363914 50.36 ns/op 0 B/op 0 allocs/op -BenchmarkEcho/GitHub-12 11246779 108.3 ns/op 0 B/op 0 allocs/op -BenchmarkGin/Hello-12 22194129 53.52 ns/op 0 B/op 0 allocs/op -BenchmarkGin/GitHub-12 12067813 98.31 ns/op 0 B/op 0 allocs/op -BenchmarkJSHR/Hello-12 53599078 21.58 ns/op 0 B/op 0 allocs/op -BenchmarkJSHR/GitHub-12 9453891 123.2 ns/op 96 B/op 1 allocs/op -BenchmarkPat/Hello-12 13931152 84.22 ns/op 48 B/op 1 allocs/op -BenchmarkPat/GitHub-12 20864 84397 ns/op 374291 B/op 235 allocs/op -BenchmarkWay/Hello-12 4725717 252.8 ns/op 307 B/op 3 allocs/op -BenchmarkWay/GitHub-12 119774 9904 ns/op 4979 B/op 177 allocs/op +BenchmarkAero/GitHub-12 14560964 80.22 ns/op 0 B/op 0 allocs/op +BenchmarkAkyoto/GitHub-12 18967251 62.96 ns/op 0 B/op 0 allocs/op +BenchmarkBeego/GitHub-12 656966 1656 ns/op 929 B/op 9 allocs/op +BenchmarkBone/GitHub-12 86756 11830 ns/op 4705 B/op 67 allocs/op +BenchmarkChi/GitHub-12 3274795 359.6 ns/op 336 B/op 2 allocs/op +BenchmarkEcho/GitHub-12 10842609 108.1 ns/op 0 B/op 0 allocs/op +BenchmarkGin/GitHub-12 11746930 108.2 ns/op 0 B/op 0 allocs/op +BenchmarkJSHR/GitHub-12 9244504 123.1 ns/op 96 B/op 1 allocs/op +BenchmarkPat/GitHub-12 20920 83830 ns/op 375238 B/op 235 allocs/op +BenchmarkWay/GitHub-12 117394 9808 ns/op 4979 B/op 177 allocs/op ``` \ No newline at end of file diff --git a/web/common_test.go b/web/common_test.go index bdc5deb..25f0c35 100644 --- a/web/common_test.go +++ b/web/common_test.go @@ -9,7 +9,6 @@ import ( ) var ( - helloRoute = "/" githubRoute = "/repos/:owner/:repo" payloadString = "Hello" payload = []byte(payloadString) @@ -25,17 +24,6 @@ func (r *NullResponse) WriteHeader(int) {} // bench is the core benchmarking function. func bench[T http.Handler](b *testing.B, init func() T, addRoute func(T, string, string)) { - b.Run("Hello", func(b *testing.B) { - request := httptest.NewRequest("GET", helloRoute, nil) - response := &NullResponse{} - router := init() - addRoute(router, "GET", "/") - - for range b.N { - router.ServeHTTP(response, request) - } - }) - b.Run("GitHub", func(b *testing.B) { request := httptest.NewRequest("GET", githubRoute, nil) response := &NullResponse{} diff --git a/web/go.mod b/web/go.mod index 6471667..cb95f7f 100644 --- a/web/go.mod +++ b/web/go.mod @@ -4,7 +4,7 @@ go 1.22.1 require ( git.akyoto.dev/go/router v0.1.3 - git.akyoto.dev/go/server v0.0.0-20240313230620-594cad69db74 + git.akyoto.dev/go/server v0.0.0-20240314115203-fe184c089268 github.com/aerogo/aero v1.3.59 github.com/beego/beego/v2 v2.1.6 github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f @@ -67,6 +67,6 @@ require ( golang.org/x/net v0.21.0 // indirect golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/web/go.sum b/web/go.sum index 42e433d..68ac8e5 100644 --- a/web/go.sum +++ b/web/go.sum @@ -2,8 +2,8 @@ git.akyoto.dev/go/assert v0.1.3 h1:QwCUbmG4aZYsNk/OuRBz1zWVKmGlDUHhOnnDBfn8Qw8= git.akyoto.dev/go/assert v0.1.3/go.mod h1:0GzMaM0eURuDwtGkJJkCsI7r2aUKr+5GmWNTFPgDocM= git.akyoto.dev/go/router v0.1.3 h1:H4wJCYdDD3/i9miYSK/e5sCoGiXe9OX7KmgH4/Toa60= git.akyoto.dev/go/router v0.1.3/go.mod h1:VfSsK/Z6fUhT3pWaAAnuAcj++bWRZD+bzNaqJoTAunU= -git.akyoto.dev/go/server v0.0.0-20240313230620-594cad69db74 h1:maCXHWOVHEC9A3FGZ6DSlWC5klNWaPA8GZqBAG1xKBk= -git.akyoto.dev/go/server v0.0.0-20240313230620-594cad69db74/go.mod h1:VVr9rDl+CPnQyXphXpOcpSovrjzPGsSk00PjUBHkx1c= +git.akyoto.dev/go/server v0.0.0-20240314115203-fe184c089268 h1:hJKwhtTMvJKa8ZLHvbL985cRgc3Eujgr5tFbAY1uWKE= +git.akyoto.dev/go/server v0.0.0-20240314115203-fe184c089268/go.mod h1:VVr9rDl+CPnQyXphXpOcpSovrjzPGsSk00PjUBHkx1c= github.com/aerogo/aero v1.3.59 h1:5yu+kk/uIXAXADKSLCFKhxAzThCehvpbF6gst+G32Fw= github.com/aerogo/aero v1.3.59/go.mod h1:ehwj+mb117xQRTvp11jlnrRNPgbcYL6s6aBk9wbIZ0o= github.com/aerogo/csp v0.1.10 h1:2PJf9gkdRvCFYOA0baTUyp34vwPp5ZJJX8GZRCYc/nM= @@ -173,8 +173,8 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/web/way_test.go b/web/way_test.go index 4da742f..c35688b 100644 --- a/web/way_test.go +++ b/web/way_test.go @@ -2,41 +2,21 @@ package main_test import ( "net/http" - "net/http/httptest" "testing" - "git.akyoto.dev/go/router/testdata" "github.com/matryer/way" ) func BenchmarkWay(b *testing.B) { - response := &NullResponse{} - - b.Run("Hello", func(b *testing.B) { - request := httptest.NewRequest("GET", helloRoute, nil) - router := way.NewRouter() - - router.HandleFunc("GET", "/", func(w http.ResponseWriter, r *http.Request) { - w.Write(payload) - }) - - for range b.N { - router.ServeHTTP(response, request) - } - }) - - b.Run("GitHub", func(b *testing.B) { - request := httptest.NewRequest("GET", githubRoute, nil) - router := way.NewRouter() - - for _, route := range testdata.Routes("testdata/github.txt") { - router.HandleFunc(route.Method, route.Path, func(w http.ResponseWriter, r *http.Request) { + bench( + b, + func() *way.Router { + return way.NewRouter() + }, + func(r *way.Router, method string, path string) { + r.HandleFunc(method, path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write(payload) - }) - } - - for range b.N { - router.ServeHTTP(response, request) - } - }) + })) + }, + ) }