chore: reduce memory and allocations
This commit is contained in:
parent
2cd16f811b
commit
0a047a82ad
2 changed files with 29 additions and 6 deletions
|
|
@ -28,11 +28,13 @@ func Size() int64 {
|
|||
type logger struct {
|
||||
mu sync.RWMutex
|
||||
data *ring.Ring
|
||||
size int
|
||||
}
|
||||
|
||||
func New(size int) *logger {
|
||||
return &logger{
|
||||
data: ring.New(size),
|
||||
data: ring.New(1),
|
||||
size: size,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -44,6 +46,12 @@ func (l *logger) Write(p []byte) (n int, err error) {
|
|||
|
||||
if !strings.HasPrefix(string(p), "[cache ]") {
|
||||
l.data.Value = element(string(p))
|
||||
|
||||
// dynamically grow the ring
|
||||
if l.data.Len() < l.size {
|
||||
l.data.Link(ring.New(1))
|
||||
}
|
||||
|
||||
l.data = l.data.Next()
|
||||
}
|
||||
|
||||
|
|
@ -95,7 +103,7 @@ func (l *logger) All(areas []string, level jww.Threshold, count int) []string {
|
|||
r := l.data
|
||||
all := len(areas) == 0 && level == jww.LevelTrace
|
||||
|
||||
var res []string
|
||||
res := make([]string, 0, r.Len())
|
||||
for range r.Len() {
|
||||
r = r.Next()
|
||||
if e, ok := r.Value.(element); ok && e != "" && (all || e.match(areas, level)) {
|
||||
|
|
|
|||
|
|
@ -7,13 +7,15 @@ import (
|
|||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
var (
|
||||
s1 = "[test1 ] TRACE test1"
|
||||
s2 = "[test2 ] ERROR test2"
|
||||
s3 = "[test1 ] TRACE test3"
|
||||
)
|
||||
|
||||
func TestLog(t *testing.T) {
|
||||
log := New(10)
|
||||
|
||||
s1 := "[test1 ] TRACE test1"
|
||||
s2 := "[test2 ] ERROR test2"
|
||||
s3 := "[test1 ] TRACE test3"
|
||||
|
||||
// old to new
|
||||
log.Write([]byte(s1))
|
||||
log.Write([]byte(s2))
|
||||
|
|
@ -33,3 +35,16 @@ func TestLog(t *testing.T) {
|
|||
assert.Equal(t, idx, log.data, "data should not be changed after All() call")
|
||||
assert.Equal(t, []string{"test1", "test2"}, log.Areas())
|
||||
}
|
||||
|
||||
func BenchmarkLog(b *testing.B) {
|
||||
log := New(10000)
|
||||
|
||||
// old to new
|
||||
log.Write([]byte(s1))
|
||||
log.Write([]byte(s2))
|
||||
log.Write([]byte(s3))
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
log.All(nil, jww.LevelTrace, 1)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue