diff --git a/gin.go b/gin.go index 49091303..292aea3c 100644 --- a/gin.go +++ b/gin.go @@ -113,8 +113,8 @@ type Engine struct { noMethod HandlersChain pool sync.Pool trees methodTrees - // paramsPool sync.Pool - maxParams uint16 + paramsPool sync.Pool + maxParams uint16 } var _ IRouter = &Engine{} @@ -258,7 +258,7 @@ func (engine *Engine) addRoute(method, path string, handlers HandlersChain) { assert1(len(handlers) > 0, "there must be at least one handler") debugPrintRoute(method, path, handlers) - // varsCount := uint16(0) + varsCount := uint16(0) root := engine.trees.get(method) if root == nil { @@ -269,17 +269,17 @@ func (engine *Engine) addRoute(method, path string, handlers HandlersChain) { root.addRoute(path, handlers) // Update maxParams - // if paramsCount := countParams(path); paramsCount+varsCount > root.maxParams { - // engine.maxParams = paramsCount + varsCount - // } + if paramsCount := countParams(path); paramsCount+varsCount > root.maxParams { + engine.maxParams = paramsCount + varsCount + } // Lazy-init paramsPool alloc func - // if engine.paramsPool.New == nil && engine.maxParams > 0 { - // engine.paramsPool.New = func() interface{} { - // ps := make(Params, 0, engine.maxParams) - // return &ps - // } - // } + if engine.paramsPool.New == nil && engine.maxParams > 0 { + engine.paramsPool.New = func() interface{} { + ps := make(Params, 0, engine.maxParams) + return &ps + } + } } // Routes returns a slice of registered routes, including some useful information, such as: @@ -398,22 +398,22 @@ func (engine *Engine) HandleContext(c *Context) { c.index = oldIndexValue } -// func (engine *Engine) getParams() *Params { -// // c := engine.pool.Get().(*Context) -// // c.Params = c.Params[0:0] -// ps := engine.paramsPool.Get().(*Params) -// *ps = (*ps)[0:0] // reset slice -// return ps -// } +func (engine *Engine) getParams() *Params { + // c := engine.pool.Get().(*Context) + // c.Params = c.Params[0:0] + ps := engine.paramsPool.Get().(*Params) + *ps = (*ps)[0:0] // reset slice + return ps +} -// func (engine *Engine) putParams(ps *Params) { -// // c := engine.pool.Get().(*Context) -// // c.Params = *ps -// // engine.pool.Put(c) -// if ps != nil { -// engine.paramsPool.Put(ps) -// } -// } +func (engine *Engine) putParams(ps *Params) { + // c := engine.pool.Get().(*Context) + // c.Params = *ps + // engine.pool.Put(c) + if ps != nil { + engine.paramsPool.Put(ps) + } +} func (engine *Engine) handleHTTPRequest(c *Context) { httpMethod := c.Request.Method @@ -436,9 +436,9 @@ func (engine *Engine) handleHTTPRequest(c *Context) { } root := t[i].root // Find route in tree - value := root.getValue(rPath, &c.Params, unescape) + value := root.getValue(rPath, engine.getParams, unescape) if value.params != nil { - // engine.putParams(value.params) + engine.putParams(value.params) c.Params = *value.params } if value.handlers != nil { diff --git a/tree.go b/tree.go index d2aec06c..c4ccc71c 100644 --- a/tree.go +++ b/tree.go @@ -5,6 +5,7 @@ package gin import ( + "log" "strings" "unicode" "unicode/utf8" @@ -418,7 +419,7 @@ type nodeValue struct { // If no handle can be found, a TSR (trailing slash redirect) recommendation is // made if a handle exists with an extra (without the) trailing slash for the // given path. -func (n *node) getValue(path string, params *Params, unescape bool) (value nodeValue) { +func (n *node) getValue(path string, params func() *Params, unescape bool) (value nodeValue) { value = nodeValue{} walk: // Outer loop for walking the tree for { @@ -473,10 +474,12 @@ walk: // Outer loop for walking the tree // } if params != nil { if value.params == nil { - value.params = params + value.params = params() } // Expand slice within preallocated capacity i := len(*value.params) + log.Println(i) + log.Println(*value.params) *value.params = (*value.params)[:i+1] // val := path[:end] // if unescape { @@ -535,7 +538,7 @@ walk: // Outer loop for walking the tree // Save param value if params != nil { if value.params == nil { - value.params = params + value.params = params() } // Expand slice within preallocated capacity i := len(*value.params)