aboutsummaryrefslogtreecommitdiffstats
path: root/expr.go
diff options
context:
space:
mode:
authorFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-05-07 12:56:12 +0900
committerFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-05-07 15:12:44 +0900
commitb06cd9d54075f942445f0030da9993368a1f49ab (patch)
tree6a99750aeed9863b8040c6f6d3d8d2402a4c74de /expr.go
parent5ca0ecded9bc653fd9de59a2fad414d6f2da3bcf (diff)
downloadandroid_build_kati-b06cd9d54075f942445f0030da9993368a1f49ab.tar.gz
android_build_kati-b06cd9d54075f942445f0030da9993368a1f49ab.tar.bz2
android_build_kati-b06cd9d54075f942445f0030da9993368a1f49ab.zip
use sync.Pool for temporal bytes.Buffer.
remove ev.Value and ev.Values before: scanblock: 8.22s (14.83%) runtime.MScan_Sweep 4.99s(9.00%) after: scanblock: 7.42s (12.95%) runtime.MScan_Sweep 4.57s(7.98%)
Diffstat (limited to 'expr.go')
-rw-r--r--expr.go38
1 files changed, 30 insertions, 8 deletions
diff --git a/expr.go b/expr.go
index dcf9064..56b567a 100644
--- a/expr.go
+++ b/expr.go
@@ -7,13 +7,28 @@ import (
"io"
"strconv"
"strings"
+ "sync"
"time"
)
var (
errEndOfInput = errors.New("parse: unexpected end of input")
+
+ bufFree = sync.Pool{
+ New: func() interface{} { return new(bytes.Buffer) },
+ }
)
+func newBuf() *bytes.Buffer {
+ buf := bufFree.Get().(*bytes.Buffer)
+ return buf
+}
+
+func freeBuf(buf *bytes.Buffer) {
+ buf.Reset()
+ bufFree.Put(buf)
+}
+
type Value interface {
String() string
Eval(w io.Writer, ev *Evaluator)
@@ -97,8 +112,10 @@ func (v varref) String() string {
func (v varref) Eval(w io.Writer, ev *Evaluator) {
t := time.Now()
- vname := ev.Value(v.varname)
- vv := ev.LookupVar(string(vname))
+ buf := newBuf()
+ v.varname.Eval(buf, ev)
+ vv := ev.LookupVar(buf.String())
+ freeBuf(buf)
vv.Eval(w, ev)
addStats("var", v, t)
}
@@ -146,17 +163,22 @@ func (v varsubst) String() string {
func (v varsubst) Eval(w io.Writer, ev *Evaluator) {
t := time.Now()
- vname := ev.Value(v.varname)
- vv := ev.LookupVar(string(vname))
- vals := ev.Values(vv)
- pat := ev.Value(v.pat)
- subst := ev.Value(v.subst)
+ buf := newBuf()
+ params := ev.args(buf, v.varname, v.pat, v.subst)
+ vname := string(params[0])
+ pat := string(params[1])
+ subst := string(params[2])
+ buf.Reset()
+ vv := ev.LookupVar(vname)
+ vv.Eval(buf, ev)
+ vals := splitSpaces(buf.String())
+ freeBuf(buf)
space := false
for _, val := range vals {
if space {
io.WriteString(w, " ")
}
- io.WriteString(w, substRef(string(pat), string(subst), string(val)))
+ io.WriteString(w, substRef(pat, subst, val))
space = true
}
addStats("varsubst", v, t)