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  }