diff options
author | Fumitoshi Ukai <fumitoshi.ukai@gmail.com> | 2015-05-07 12:56:12 +0900 |
---|---|---|
committer | Fumitoshi Ukai <fumitoshi.ukai@gmail.com> | 2015-05-07 15:12:44 +0900 |
commit | b06cd9d54075f942445f0030da9993368a1f49ab (patch) | |
tree | 6a99750aeed9863b8040c6f6d3d8d2402a4c74de /expr.go | |
parent | 5ca0ecded9bc653fd9de59a2fad414d6f2da3bcf (diff) | |
download | android_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.go | 38 |
1 files changed, 30 insertions, 8 deletions
@@ -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) |