gitee.com/gopher2011/gin@v1.7.2/benchmarks_test.go (about) 1 package gin 2 3 import ( 4 "html/template" 5 "net/http" 6 "os" 7 "testing" 8 ) 9 10 func BenchmarkOneRoute(B *testing.B) { 11 router := New() 12 router.GET("/ping", func(c *Context) {}) 13 runRequest(B, router, "GET", "/ping") 14 } 15 16 func BenchmarkRecoveryMiddleware(B *testing.B) { 17 router := New() 18 router.Use(Recovery()) 19 router.GET("/", func(c *Context) {}) 20 runRequest(B, router, "GET", "/") 21 } 22 23 func BenchmarkLoggerMiddleware(B *testing.B) { 24 router := New() 25 router.Use(LoggerWithWriter(newMockWriter())) 26 router.GET("/", func(c *Context) {}) 27 runRequest(B, router, "GET", "/") 28 } 29 30 func BenchmarkManyHandlers(B *testing.B) { 31 router := New() 32 router.Use(Recovery(), LoggerWithWriter(newMockWriter())) 33 router.Use(func(c *Context) {}) 34 router.Use(func(c *Context) {}) 35 router.GET("/ping", func(c *Context) {}) 36 runRequest(B, router, "GET", "/ping") 37 } 38 39 func Benchmark5Params(B *testing.B) { 40 DefaultWriter = os.Stdout 41 router := New() 42 router.Use(func(c *Context) {}) 43 router.GET("/param/:param1/:params2/:param3/:param4/:param5", func(c *Context) {}) 44 runRequest(B, router, "GET", "/param/path/to/parameter/john/12345") 45 } 46 47 func BenchmarkOneRouteJSON(B *testing.B) { 48 router := New() 49 data := struct { 50 Status string `json:"status"` 51 }{"ok"} 52 router.GET("/json", func(c *Context) { 53 c.JSON(http.StatusOK, data) 54 }) 55 runRequest(B, router, "GET", "/json") 56 } 57 58 func BenchmarkOneRouteHTML(B *testing.B) { 59 router := New() 60 t := template.Must(template.New("index").Parse(` 61 <html><body><h1>{{.}}</h1></body></html>`)) 62 router.SetHTMLTemplate(t) 63 64 router.GET("/html", func(c *Context) { 65 c.HTML(http.StatusOK, "index", "hola") 66 }) 67 runRequest(B, router, "GET", "/html") 68 } 69 70 func BenchmarkOneRouteSet(B *testing.B) { 71 router := New() 72 router.GET("/ping", func(c *Context) { 73 c.Set("key", "value") 74 }) 75 runRequest(B, router, "GET", "/ping") 76 } 77 78 func BenchmarkOneRouteString(B *testing.B) { 79 router := New() 80 router.GET("/text", func(c *Context) { 81 c.String(http.StatusOK, "this is a plain text") 82 }) 83 runRequest(B, router, "GET", "/text") 84 } 85 86 func BenchmarkManyRoutesFist(B *testing.B) { 87 router := New() 88 router.Any("/ping", func(c *Context) {}) 89 runRequest(B, router, "GET", "/ping") 90 } 91 92 func BenchmarkManyRoutesLast(B *testing.B) { 93 router := New() 94 router.Any("/ping", func(c *Context) {}) 95 runRequest(B, router, "OPTIONS", "/ping") 96 } 97 98 func Benchmark404(B *testing.B) { 99 router := New() 100 router.Any("/something", func(c *Context) {}) 101 router.NoRoute(func(c *Context) {}) 102 runRequest(B, router, "GET", "/ping") 103 } 104 105 func Benchmark404Many(B *testing.B) { 106 router := New() 107 router.GET("/", func(c *Context) {}) 108 router.GET("/path/to/something", func(c *Context) {}) 109 router.GET("/post/:id", func(c *Context) {}) 110 router.GET("/view/:id", func(c *Context) {}) 111 router.GET("/favicon.ico", func(c *Context) {}) 112 router.GET("/robots.txt", func(c *Context) {}) 113 router.GET("/delete/:id", func(c *Context) {}) 114 router.GET("/user/:id/:mode", func(c *Context) {}) 115 116 router.NoRoute(func(c *Context) {}) 117 runRequest(B, router, "GET", "/viewfake") 118 } 119 120 type mockWriter struct { 121 headers http.Header 122 } 123 124 func newMockWriter() *mockWriter { 125 return &mockWriter{ 126 http.Header{}, 127 } 128 } 129 130 func (m *mockWriter) Header() (h http.Header) { 131 return m.headers 132 } 133 134 func (m *mockWriter) Write(p []byte) (n int, err error) { 135 return len(p), nil 136 } 137 138 func (m *mockWriter) WriteString(s string) (n int, err error) { 139 return len(s), nil 140 } 141 142 func (m *mockWriter) WriteHeader(int) {} 143 144 func runRequest(B *testing.B, r *Engine, method, path string) { 145 // create fake request 146 req, err := http.NewRequest(method, path, nil) 147 if err != nil { 148 panic(err) 149 } 150 w := newMockWriter() 151 B.ReportAllocs() 152 B.ResetTimer() 153 for i := 0; i < B.N; i++ { 154 r.ServeHTTP(w, req) 155 } 156 }