gitee.com/chenleup/lego@v1.2.6/benchmarks_test.go (about)

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