summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2024-03-09 05:06:36 +0700
committerShulhan <ms@kilabit.info>2024-03-14 23:51:34 +0700
commit9da27235f996db4b2be0ba29f4bcecae1511519b (patch)
tree46fe8aa027a900276d89c94fd699807ffa28ef39
parent3ecf5e7b4844a565fce590ebb507f6e7cc98b798 (diff)
downloadpakakeh.go-9da27235f996db4b2be0ba29f4bcecae1511519b.tar.xz
lib/http: add benchmark for Server handleDelete and registerDelete
-rw-r--r--.gitignore2
-rw-r--r--lib/http/server_benchmark_test.go131
2 files changed, 132 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 29345ce6..0aeea614 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
**/testdata/bench
**/testdata/pprof
*.bak
-*.bench
*.cprof
*.csv
*.dat
@@ -69,6 +68,7 @@
/lib/websocket/testdata/lib
/lib/websocket/testdata/pip-selfcheck.json
/lib/websocket/testdata/server/server
+bench_*
cover.*
share-tools/
src/
diff --git a/lib/http/server_benchmark_test.go b/lib/http/server_benchmark_test.go
new file mode 100644
index 00000000..b9161d41
--- /dev/null
+++ b/lib/http/server_benchmark_test.go
@@ -0,0 +1,131 @@
+package http
+
+import (
+ "bytes"
+ "context"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+)
+
+// Bencmark route.Parse before replacing it.
+//
+// Result:
+//
+// $ benchstat bench_handleDelete_before.txt bench_handleDelete_after.txt
+// goos: linux
+// goarch: amd64
+// pkg: git.sr.ht/~shulhan/pakakeh.go/lib/http
+// cpu: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
+//
+// │ bench_handleDelete_before.txt │ bench_handleDelete_after.txt │
+// │ sec/op │ sec/op vs base │
+//
+// Server_handleDelete-4 1.703µ ± 1% 1.702µ ± 2% ~ (p=0.956 n=10)
+//
+// │ bench_handleDelete_before.txt │ bench_handleDelete_after.txt │
+// │ B/op │ B/op vs base │
+//
+// Server_handleDelete-4 1.125Ki ± 0% 1.125Ki ± 0% ~ (p=1.000 n=10) ¹
+// ¹ all samples are equal
+//
+// │ bench_handleDelete_before.txt │ bench_handleDelete_after.txt │
+// │ allocs/op │ allocs/op vs base │
+//
+// Server_handleDelete-4 9.000 ± 0% 9.000 ± 0% ~ (p=1.000 n=10) ¹
+// ¹ all samples are equal
+func BenchmarkServer_handleDelete(b *testing.B) {
+ var (
+ srv = &Server{}
+ err error
+ )
+
+ err = srv.RegisterEndpoint(Endpoint{
+ Method: RequestMethodDelete,
+ Path: `/a/b/c/:d/e`,
+ Call: func(_ *EndpointRequest) ([]byte, error) {
+ return nil, nil
+ },
+ })
+ if err != nil {
+ b.Fatal(err)
+ }
+
+ var (
+ httpWriter = httptest.NewRecorder()
+ httpReqMatched *http.Request
+ httpReqNotFound *http.Request
+ body bytes.Buffer
+ )
+
+ httpReqMatched, err = http.NewRequestWithContext(context.Background(),
+ http.MethodDelete, `/a/b/c/dddd/e`, &body)
+ if err != nil {
+ b.Fatal(err)
+ }
+
+ httpReqNotFound, err = http.NewRequestWithContext(context.Background(),
+ http.MethodDelete, `/a/b/c/dddd`, &body)
+ if err != nil {
+ b.Fatal(err)
+ }
+
+ b.ResetTimer()
+
+ var x int
+ for ; x < b.N; x++ {
+ srv.handleDelete(httpWriter, httpReqMatched)
+ srv.handleDelete(httpWriter, httpReqNotFound)
+ }
+}
+
+// Result:
+//
+// goos: linux
+// goarch: amd64
+// pkg: git.sr.ht/~shulhan/pakakeh.go/lib/http
+// cpu: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
+//
+// │ bench_registerDelete_before.txt │ bench_registerDelete_after.txt │
+// │ sec/op │ sec/op vs base │
+//
+// Server_registerDelete-4 2.411µ ± 2% 4.232µ ± 1% +75.53% (p=0.000 n=10)
+//
+// │ bench_registerDelete_before.txt │ bench_registerDelete_after.txt │
+// │ B/op │ B/op vs base │
+//
+// Server_registerDelete-4 660.0 ± 0% 796.0 ± 0% +20.61% (p=0.000 n=10)
+//
+// │ bench_registerDelete_before.txt │ bench_registerDelete_after.txt │
+// │ allocs/op │ allocs/op vs base │
+//
+// Server_registerDelete-4 8.000 ± 0% 19.000 ± 0% +137.50% (p=0.000 n=10)
+//
+// Summary: creating new route and matching the nodes result in increase
+// ops and memory usage.
+func BenchmarkServer_registerDelete(b *testing.B) {
+ var (
+ srv *Server
+ err error
+ )
+
+ srv, err = NewServer(ServerOptions{})
+ if err != nil {
+ b.Fatal(err)
+ }
+
+ var ep = Endpoint{
+ Method: RequestMethodDelete,
+ Path: `/a/b/c/:d/e`,
+ Call: func(_ *EndpointRequest) ([]byte, error) {
+ return nil, nil
+ },
+ }
+
+ b.ResetTimer()
+
+ var x int
+ for ; x < b.N; x++ {
+ _ = srv.RegisterEndpoint(ep)
+ }
+}