github.com/eyediy/gin@v0.0.0-20161013033330-7ccf12d19375/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(200, data) 54 }) 55 runRequest(B, router, "GET", "/json") 56 } 57 58 var htmlContentType = []string{"text/html; charset=utf-8"} 59 60 func BenchmarkOneRouteHTML(B *testing.B) { 61 router := New() 62 t := template.Must(template.New("index").Parse(` 63 <html><body><h1>{{.}}</h1></body></html>`)) 64 router.SetHTMLTemplate(t) 65 66 router.GET("/html", func(c *Context) { 67 c.HTML(200, "index", "hola") 68 }) 69 runRequest(B, router, "GET", "/html") 70 } 71 72 func BenchmarkOneRouteSet(B *testing.B) { 73 router := New() 74 router.GET("/ping", func(c *Context) { 75 c.Set("key", "value") 76 }) 77 runRequest(B, router, "GET", "/ping") 78 } 79 80 func BenchmarkOneRouteString(B *testing.B) { 81 router := New() 82 router.GET("/text", func(c *Context) { 83 c.String(200, "this is a plain text") 84 }) 85 runRequest(B, router, "GET", "/text") 86 } 87 88 func BenchmarkManyRoutesFist(B *testing.B) { 89 router := New() 90 router.Any("/ping", func(c *Context) {}) 91 runRequest(B, router, "GET", "/ping") 92 } 93 94 func BenchmarkManyRoutesLast(B *testing.B) { 95 router := New() 96 router.Any("/ping", func(c *Context) {}) 97 runRequest(B, router, "OPTIONS", "/ping") 98 } 99 100 func Benchmark404(B *testing.B) { 101 router := New() 102 router.Any("/something", func(c *Context) {}) 103 router.NoRoute(func(c *Context) {}) 104 runRequest(B, router, "GET", "/ping") 105 } 106 107 func Benchmark404Many(B *testing.B) { 108 router := New() 109 router.GET("/", func(c *Context) {}) 110 router.GET("/path/to/something", func(c *Context) {}) 111 router.GET("/post/:id", func(c *Context) {}) 112 router.GET("/view/:id", func(c *Context) {}) 113 router.GET("/favicon.ico", func(c *Context) {}) 114 router.GET("/robots.txt", func(c *Context) {}) 115 router.GET("/delete/:id", func(c *Context) {}) 116 router.GET("/user/:id/:mode", func(c *Context) {}) 117 118 router.NoRoute(func(c *Context) {}) 119 runRequest(B, router, "GET", "/viewfake") 120 } 121 122 type mockWriter struct { 123 headers http.Header 124 } 125 126 func newMockWriter() *mockWriter { 127 return &mockWriter{ 128 http.Header{}, 129 } 130 } 131 132 func (m *mockWriter) Header() (h http.Header) { 133 return m.headers 134 } 135 136 func (m *mockWriter) Write(p []byte) (n int, err error) { 137 return len(p), nil 138 } 139 140 func (m *mockWriter) WriteString(s string) (n int, err error) { 141 return len(s), nil 142 } 143 144 func (m *mockWriter) WriteHeader(int) {} 145 146 func runRequest(B *testing.B, r *Engine, method, path string) { 147 // create fake request 148 req, err := http.NewRequest(method, path, nil) 149 if err != nil { 150 panic(err) 151 } 152 w := newMockWriter() 153 B.ReportAllocs() 154 B.ResetTimer() 155 for i := 0; i < B.N; i++ { 156 r.ServeHTTP(w, req) 157 } 158 }