refactor sync.Pool usages, improve file reading perf, trim leading '/' in request
Signed-off-by: kim (grufwub) <grufwub@gmail.com>master
parent
ac38ecce80
commit
529d28e62e
@ -1,112 +0,0 @@
|
|||||||
package core
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"io"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
connBufferedReaderPool sync.Pool
|
|
||||||
connBufferedWriterPool sync.Pool
|
|
||||||
fileBufferedReaderPool sync.Pool
|
|
||||||
|
|
||||||
fileReadBufferPool sync.Pool
|
|
||||||
)
|
|
||||||
|
|
||||||
func newConnBufferedReaderPool(size int) sync.Pool {
|
|
||||||
return sync.Pool{
|
|
||||||
New: func() interface{} {
|
|
||||||
return bufio.NewReaderSize(nil, size)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func newConnBufferedWriterPool(size int) sync.Pool {
|
|
||||||
return sync.Pool{
|
|
||||||
New: func() interface{} {
|
|
||||||
return bufio.NewWriterSize(nil, size)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func newFileBufferedReaderPool(size int) sync.Pool {
|
|
||||||
return sync.Pool{
|
|
||||||
New: func() interface{} {
|
|
||||||
return bufio.NewReaderSize(nil, size)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func newFileReadBufferPool(size int) sync.Pool {
|
|
||||||
return sync.Pool{
|
|
||||||
New: func() interface{} {
|
|
||||||
return make([]byte, size)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getConnBufferedReader(r io.Reader) *bufio.Reader {
|
|
||||||
// Get buffered reader
|
|
||||||
br := connBufferedReaderPool.Get().(*bufio.Reader)
|
|
||||||
|
|
||||||
// Reset to new reader
|
|
||||||
br.Reset(r)
|
|
||||||
|
|
||||||
// Return!
|
|
||||||
return br
|
|
||||||
}
|
|
||||||
|
|
||||||
func putConnBufferedReader(br *bufio.Reader) {
|
|
||||||
// Reset to ensure not hanging onto old reader
|
|
||||||
br.Reset(nil)
|
|
||||||
|
|
||||||
// Put back in pool
|
|
||||||
connBufferedReaderPool.Put(br)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getConnBufferedWriter(w io.Writer) *bufio.Writer {
|
|
||||||
// Get buffered writer
|
|
||||||
bw := connBufferedWriterPool.Get().(*bufio.Writer)
|
|
||||||
|
|
||||||
// Reset to new writer
|
|
||||||
bw.Reset(w)
|
|
||||||
|
|
||||||
// Return!
|
|
||||||
return bw
|
|
||||||
}
|
|
||||||
|
|
||||||
func putConnBufferedWriter(bw *bufio.Writer) {
|
|
||||||
// Reset to ensure not hanging onto old writer
|
|
||||||
bw.Reset(nil)
|
|
||||||
|
|
||||||
// Put back in pool
|
|
||||||
connBufferedWriterPool.Put(bw)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getFileBufferedReader(r io.Reader) *bufio.Reader {
|
|
||||||
// Get buffered reader
|
|
||||||
br := fileBufferedReaderPool.Get().(*bufio.Reader)
|
|
||||||
|
|
||||||
// Reset to new reader
|
|
||||||
br.Reset(r)
|
|
||||||
|
|
||||||
// Return!
|
|
||||||
return br
|
|
||||||
}
|
|
||||||
|
|
||||||
func putFileBufferedReader(br *bufio.Reader) {
|
|
||||||
// Reset to ensure not hanging onto old reader
|
|
||||||
br.Reset(nil)
|
|
||||||
|
|
||||||
// Put back in pool
|
|
||||||
fileBufferedReaderPool.Put(br)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getFileReadBuffer() []byte {
|
|
||||||
return fileReadBufferPool.Get().([]byte)
|
|
||||||
}
|
|
||||||
|
|
||||||
func putFileReadBuffer(b []byte) {
|
|
||||||
fileReadBufferPool.Put(b)
|
|
||||||
}
|
|
@ -0,0 +1,108 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"io"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
connBufferedReaderPool *bufferedReaderPool
|
||||||
|
connBufferedWriterPool *bufferedWriterPool
|
||||||
|
fileBufferedReaderPool *bufferedReaderPool
|
||||||
|
fileBufferPool *bufferPool
|
||||||
|
)
|
||||||
|
|
||||||
|
type bufferPool struct {
|
||||||
|
pool sync.Pool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBufferPool(size int) *bufferPool {
|
||||||
|
return &bufferPool{
|
||||||
|
pool: sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return make([]byte, size)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *bufferPool) Get() []byte {
|
||||||
|
// Just return and cast a buffer
|
||||||
|
return bp.pool.Get().([]byte)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *bufferPool) Put(b []byte) {
|
||||||
|
// Just put back in pool
|
||||||
|
bp.pool.Put(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
type bufferedReaderPool struct {
|
||||||
|
pool sync.Pool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBufferedReaderPool(size int) *bufferedReaderPool {
|
||||||
|
return &bufferedReaderPool{
|
||||||
|
pool: sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return bufio.NewReaderSize(nil, size)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *bufferedReaderPool) Get(r io.Reader) *bufio.Reader {
|
||||||
|
// Get a buffered reader from the pool
|
||||||
|
br := bp.pool.Get().(*bufio.Reader)
|
||||||
|
|
||||||
|
// Reset to use our new reader!
|
||||||
|
br.Reset(r)
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return br
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *bufferedReaderPool) Put(br *bufio.Reader) {
|
||||||
|
// We must reset again here to ensure
|
||||||
|
// we don't mess with GC with unused underlying
|
||||||
|
// reader.
|
||||||
|
br.Reset(nil)
|
||||||
|
|
||||||
|
// Put back in the pool
|
||||||
|
bp.pool.Put(br)
|
||||||
|
}
|
||||||
|
|
||||||
|
type bufferedWriterPool struct {
|
||||||
|
pool sync.Pool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBufferedWriterPool(size int) *bufferedWriterPool {
|
||||||
|
return &bufferedWriterPool{
|
||||||
|
pool: sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return bufio.NewWriterSize(nil, size)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *bufferedWriterPool) Get(w io.Writer) *bufio.Writer {
|
||||||
|
// Get a buffered writer from the pool
|
||||||
|
bw := bp.pool.Get().(*bufio.Writer)
|
||||||
|
|
||||||
|
// Reset to user our new writer
|
||||||
|
bw.Reset(w)
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return bw
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bp *bufferedWriterPool) Put(bw *bufio.Writer) {
|
||||||
|
// We must reset again here to ensure
|
||||||
|
// we don't mess with GC with unused underlying
|
||||||
|
// writer.
|
||||||
|
bw.Reset(nil)
|
||||||
|
|
||||||
|
// Put back in the pool
|
||||||
|
bp.pool.Put(bw)
|
||||||
|
}
|
Loading…
Reference in New Issue