1
0
mirror of https://github.com/labstack/echo.git synced 2025-11-06 08:59:21 +02:00

Now using sync.Pool

Signed-off-by: Vishal Rana <vr@labstack.com>
This commit is contained in:
Vishal Rana
2016-02-04 14:40:08 -08:00
parent 443a0bb48d
commit f405794a7c
18 changed files with 317 additions and 235 deletions

View File

@@ -1,6 +1,9 @@
package engine
import "io"
import (
"io"
"time"
)
type (
Type uint8
@@ -31,6 +34,8 @@ type (
Status() int
Size() int64
Committed() bool
SetWriter(io.Writer)
Writer() io.Writer
}
Header interface {
@@ -49,7 +54,11 @@ type (
}
Config struct {
Address string
Address string
ReadTimeout time.Duration
WriteTimeout time.Duration
TLSCertfile string
TLSKeyfile string
}
)

View File

@@ -1,6 +1,8 @@
package fasthttp
import (
"io"
"github.com/labstack/echo/engine"
"github.com/valyala/fasthttp"
)
@@ -12,6 +14,7 @@ type (
status int
size int64
committed bool
writer io.Writer
}
)
@@ -38,3 +41,11 @@ func (r *Response) Size() int64 {
func (r *Response) Committed() bool {
return r.committed
}
func (r *Response) SetWriter(w io.Writer) {
r.writer = w
}
func (r *Response) Writer() io.Writer {
return r.writer
}

View File

@@ -1,8 +1,9 @@
package fasthttp
import (
"log"
"net/http"
"github.com/labstack/gommon/log"
)
import (
"github.com/labstack/echo/engine"
@@ -27,7 +28,6 @@ func NewServer(config *engine.Config, handler engine.HandlerFunc) *Server {
func (s *Server) Start() {
fasthttp.ListenAndServe(s.config.Address, func(ctx *fasthttp.RequestCtx) {
println("FastHTTP")
req := &Request{
context: ctx,
url: &URL{ctx.URI()},

View File

@@ -4,22 +4,26 @@ import "net/http"
type (
Header struct {
http.Header
header http.Header
}
)
func (h *Header) Add(key, val string) {
h.Header.Add(key, val)
h.header.Add(key, val)
}
func (h *Header) Del(key string) {
h.Header.Del(key)
h.header.Del(key)
}
func (h *Header) Get(key string) string {
return h.Header.Get(key)
return h.header.Get(key)
}
func (h *Header) Set(key, val string) {
h.Header.Set(key, val)
h.header.Set(key, val)
}
func (h *Header) reset(hdr http.Header) {
h.header = hdr
}

View File

@@ -18,7 +18,7 @@ type (
func NewRequest(r *http.Request) *Request {
return &Request{
request: r,
url: NewURL(r.URL),
url: &URL{url: r.URL},
header: &Header{r.Header},
}
}
@@ -54,3 +54,9 @@ func (r *Request) Body() io.ReadCloser {
func (r *Request) FormValue(name string) string {
return r.request.FormValue(name)
}
func (r *Request) reset(req *http.Request, h engine.Header, u engine.URL) {
r.request = req
r.header = h
r.url = u
}

View File

@@ -1,7 +1,11 @@
package standard
import "net/http"
import "github.com/labstack/echo/engine"
import (
"io"
"net/http"
"github.com/labstack/echo/engine"
)
type (
Response struct {
@@ -10,6 +14,7 @@ type (
status int
size int64
committed bool
writer io.Writer
}
)
@@ -17,6 +22,7 @@ func NewResponse(w http.ResponseWriter) *Response {
return &Response{
response: w,
header: &Header{w.Header()},
writer: w,
}
}
@@ -35,7 +41,7 @@ func (r *Response) WriteHeader(code int) {
}
func (r *Response) Write(b []byte) (n int, err error) {
n, err = r.response.Write(b)
n, err = r.writer.Write(b)
r.size += int64(n)
return
}
@@ -51,3 +57,20 @@ func (r *Response) Size() int64 {
func (r *Response) Committed() bool {
return r.committed
}
func (r *Response) SetWriter(w io.Writer) {
r.writer = w
}
func (r *Response) Writer() io.Writer {
return r.writer
}
func (r *Response) reset(w http.ResponseWriter, h engine.Header) {
r.response = w
r.header = h
r.status = http.StatusOK
r.size = 0
r.committed = false
r.writer = w
}

View File

@@ -3,6 +3,7 @@ package standard
import (
"log"
"net/http"
"sync"
"github.com/labstack/echo/engine"
)
@@ -12,6 +13,14 @@ type (
*http.Server
config *engine.Config
handler engine.HandlerFunc
pool *Pool
}
Pool struct {
request sync.Pool
response sync.Pool
header sync.Pool
url sync.Pool
}
)
@@ -20,13 +29,54 @@ func NewServer(config *engine.Config, handler engine.HandlerFunc) *Server {
Server: new(http.Server),
config: config,
handler: handler,
pool: &Pool{
request: sync.Pool{
New: func() interface{} {
return &Request{}
},
},
response: sync.Pool{
New: func() interface{} {
return &Response{}
},
},
header: sync.Pool{
New: func() interface{} {
return &Header{}
},
},
url: sync.Pool{
New: func() interface{} {
return &URL{}
},
},
},
}
}
func (s *Server) Start() {
s.Addr = s.config.Address
s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
s.handler(NewRequest(r), NewResponse(w))
// Request
req := s.pool.request.Get().(*Request)
reqHdr := s.pool.request.Get().(*Header)
reqURL := s.pool.request.Get().(*URL)
reqHdr.reset(r.Header)
reqURL.reset(r.URL)
req.reset(r, reqHdr, reqURL)
// Response
res := s.pool.request.Get().(*Response)
resHdr := s.pool.request.Get().(*Header)
res.reset(w, reqHdr)
s.handler(req, res)
s.pool.request.Put(req)
s.pool.header.Put(reqHdr)
s.pool.url.Put(reqURL)
s.pool.response.Put(res)
s.pool.header.Put(resHdr)
})
log.Fatal(s.ListenAndServe())
}

View File

@@ -9,10 +9,6 @@ type (
}
)
func NewURL(u *url.URL) *URL {
return &URL{url: u}
}
func (u *URL) URL() *url.URL {
return u.url
}
@@ -39,3 +35,7 @@ func (u *URL) QueryValue(name string) string {
}
return u.query.Get(name)
}
func (u *URL) reset(url *url.URL) {
u.url = url
}