Reduce the size of the buffered reader to improve CPU performance
This commit is contained in:
parent
d701b35954
commit
de04e73e82
|
@ -46,7 +46,14 @@ func MustInt(v string) int {
|
||||||
// over the websocket. If a line exceeds that size, it is truncated and only that
|
// over the websocket. If a line exceeds that size, it is truncated and only that
|
||||||
// amount is sent over.
|
// amount is sent over.
|
||||||
func ScanReader(r io.Reader, callback func(line []byte)) error {
|
func ScanReader(r io.Reader, callback func(line []byte)) error {
|
||||||
br := bufio.NewReader(r)
|
// Based on benchmarking this seems to be the best size for the reader buffer
|
||||||
|
// to maintain fast enough workflows without hammering the CPU for allocations.
|
||||||
|
//
|
||||||
|
// Additionally, most games are outputting a high-frequency of smaller lines,
|
||||||
|
// rather than a bunch of massive lines. This allocation amount is the total
|
||||||
|
// number of bytes being output for each call to ReadLine() before it moves on
|
||||||
|
// to the next data pull.
|
||||||
|
br := bufio.NewReaderSize(r, 256)
|
||||||
// Avoid constantly re-allocating memory when we're flooding lines through this
|
// Avoid constantly re-allocating memory when we're flooding lines through this
|
||||||
// function by using the same buffer for the duration of the call and just truncating
|
// function by using the same buffer for the duration of the call and just truncating
|
||||||
// the value back to 0 every loop.
|
// the value back to 0 every loop.
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
package system
|
package system
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/rand"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
. "github.com/franela/goblin"
|
. "github.com/franela/goblin"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestScanReader(t *testing.T) {
|
func Test_Utils(t *testing.T) {
|
||||||
g := Goblin(t)
|
g := Goblin(t)
|
||||||
|
|
||||||
g.Describe("ScanReader", func() {
|
g.Describe("ScanReader", func() {
|
||||||
|
@ -39,3 +41,19 @@ func TestScanReader(t *testing.T) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Benchmark_ScanReader(b *testing.B) {
|
||||||
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
var str string
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
str += strings.Repeat("hello \rworld", r.Intn(2000)) + "\n"
|
||||||
|
}
|
||||||
|
reader := strings.NewReader(str)
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
_ = ScanReader(reader, func(line []byte) {
|
||||||
|
// no op
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user