Просмотр исходного кода

Performance improvement

- Reduces number of allocations per context
- Improves CPU cache usage
Manu Mtz-Almeida 11 лет назад
Родитель
Сommit
48f4914165
3 измененных файлов с 14 добавлено и 11 удалено
  1. 11 9
      context.go
  2. 3 1
      gin.go
  3. 0 1
      response_writer.go

+ 11 - 9
context.go

@@ -54,14 +54,15 @@ func (a errorMsgs) String() string {
 // Context is the most important part of gin. It allows us to pass variables between middleware,
 // manage the flow, validate the JSON of a request and render a JSON response for example.
 type Context struct {
-	Request  *http.Request
-	Writer   ResponseWriter
-	Keys     map[string]interface{}
-	Errors   errorMsgs
-	Params   httprouter.Params
-	Engine   *Engine
-	handlers []HandlerFunc
-	index    int8
+	writermem responseWriter
+	Request   *http.Request
+	Writer    ResponseWriter
+	Keys      map[string]interface{}
+	Errors    errorMsgs
+	Params    httprouter.Params
+	Engine    *Engine
+	handlers  []HandlerFunc
+	index     int8
 }
 
 /************************************/
@@ -70,7 +71,8 @@ type Context struct {
 
 func (engine *Engine) createContext(w http.ResponseWriter, req *http.Request, params httprouter.Params, handlers []HandlerFunc) *Context {
 	c := engine.cache.Get().(*Context)
-	c.Writer.reset(w)
+	c.writermem.reset(w)
+
 	c.Request = req
 	c.Params = params
 	c.handlers = handlers

+ 3 - 1
gin.go

@@ -60,7 +60,9 @@ func New() *Engine {
 	engine.router = httprouter.New()
 	engine.router.NotFound = engine.handle404
 	engine.cache.New = func() interface{} {
-		return &Context{Engine: engine, Writer: &responseWriter{}}
+		c := &Context{Engine: engine}
+		c.Writer = &c.writermem
+		return c
 	}
 	return engine
 }

+ 0 - 1
response_writer.go

@@ -11,7 +11,6 @@ type (
 		Written() bool
 
 		// private
-		reset(http.ResponseWriter)
 		setStatus(int)
 	}