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  }