From 918a5da308d7b82d3082dab596f704bba2c15007 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Mon, 23 Nov 2020 23:43:17 +0100 Subject: [PATCH] Many operations do not pass refs to Write. Similarly adding ...interface{} requires constructing a slice, which is slow. This cuts about 100ns from RRect and Border benchmark. Signed-off-by: Egon Elbre --- io/key/key.go | 2 +- io/pointer/pointer.go | 2 +- io/profile/profile.go | 2 +- op/op.go | 19 ++++++++++++++++--- op/paint/paint.go | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/io/key/key.go b/io/key/key.go index 365bb790..09655b82 100644 --- a/io/key/key.go +++ b/io/key/key.go @@ -113,7 +113,7 @@ func (m Modifiers) Contain(m2 Modifiers) bool { } func (h InputOp) Add(o *op.Ops) { - data := o.Write(opconst.TypeKeyInputLen, h.Tag) + data := o.Write1(opconst.TypeKeyInputLen, h.Tag) data[0] = byte(opconst.TypeKeyInput) if h.Focus { data[1] = 1 diff --git a/io/pointer/pointer.go b/io/pointer/pointer.go index 3344d6ba..2c0010a7 100644 --- a/io/pointer/pointer.go +++ b/io/pointer/pointer.go @@ -159,7 +159,7 @@ func (op AreaOp) Add(o *op.Ops) { } func (h InputOp) Add(o *op.Ops) { - data := o.Write(opconst.TypePointerInputLen, h.Tag) + data := o.Write1(opconst.TypePointerInputLen, h.Tag) data[0] = byte(opconst.TypePointerInput) if h.Grab { data[1] = 1 diff --git a/io/profile/profile.go b/io/profile/profile.go index 24bf52b3..6e6adbfe 100644 --- a/io/profile/profile.go +++ b/io/profile/profile.go @@ -24,7 +24,7 @@ type Event struct { } func (p Op) Add(o *op.Ops) { - data := o.Write(opconst.TypeProfileLen, p.Tag) + data := o.Write1(opconst.TypeProfileLen, p.Tag) data[0] = byte(opconst.TypeProfile) } diff --git a/op/op.go b/op/op.go index 174d3185..35dbc0b9 100644 --- a/op/op.go +++ b/op/op.go @@ -192,9 +192,22 @@ func (o *Ops) Version() int { } // Write is for internal use only. -func (o *Ops) Write(n int, refs ...interface{}) []byte { +func (o *Ops) Write(n int) []byte { o.data = append(o.data, make([]byte, n)...) - o.refs = append(o.refs, refs...) + return o.data[len(o.data)-n:] +} + +// Write1 is for internal use only. +func (o *Ops) Write1(n int, ref1 interface{}) []byte { + o.data = append(o.data, make([]byte, n)...) + o.refs = append(o.refs, ref1) + return o.data[len(o.data)-n:] +} + +// Write2 is for internal use only. +func (o *Ops) Write2(n int, ref1, ref2 interface{}) []byte { + o.data = append(o.data, make([]byte, n)...) + o.refs = append(o.refs, ref1, ref2) return o.data[len(o.data)-n:] } @@ -244,7 +257,7 @@ func (c CallOp) Add(o *Ops) { if c.ops == nil { return } - data := o.Write(opconst.TypeCallLen, c.ops) + data := o.Write1(opconst.TypeCallLen, c.ops) data[0] = byte(opconst.TypeCall) bo := binary.LittleEndian bo.PutUint32(data[1:], uint32(c.pc.data)) diff --git a/op/paint/paint.go b/op/paint/paint.go index 291348f1..dbff7be0 100644 --- a/op/paint/paint.go +++ b/op/paint/paint.go @@ -99,7 +99,7 @@ func (i ImageOp) Add(o *op.Ops) { }.Add(o) return } - data := o.Write(opconst.TypeImageLen, i.src, i.handle) + data := o.Write2(opconst.TypeImageLen, i.src, i.handle) data[0] = byte(opconst.TypeImage) }