Performance improvement

- Reduces number of allocations per context
- Improves CPU cache usage
This commit is contained in:
Manu Mtz-Almeida 2014-07-18 00:10:28 +02:00
parent 184a02ee2d
commit 48f4914165
3 changed files with 14 additions and 11 deletions

View File

@ -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, // 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. // manage the flow, validate the JSON of a request and render a JSON response for example.
type Context struct { type Context struct {
Request *http.Request writermem responseWriter
Writer ResponseWriter Request *http.Request
Keys map[string]interface{} Writer ResponseWriter
Errors errorMsgs Keys map[string]interface{}
Params httprouter.Params Errors errorMsgs
Engine *Engine Params httprouter.Params
handlers []HandlerFunc Engine *Engine
index int8 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 { func (engine *Engine) createContext(w http.ResponseWriter, req *http.Request, params httprouter.Params, handlers []HandlerFunc) *Context {
c := engine.cache.Get().(*Context) c := engine.cache.Get().(*Context)
c.Writer.reset(w) c.writermem.reset(w)
c.Request = req c.Request = req
c.Params = params c.Params = params
c.handlers = handlers c.handlers = handlers

4
gin.go
View File

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

View File

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