diff options
author | Fumitoshi Ukai <fumitoshi.ukai@gmail.com> | 2015-06-19 13:54:53 +0900 |
---|---|---|
committer | Fumitoshi Ukai <fumitoshi.ukai@gmail.com> | 2015-06-19 14:47:02 +0900 |
commit | ce14acbe573bdf2853e67ea418940e835c07409b (patch) | |
tree | 8fa3e7410a3d65d968cb39b1d1643e2495bf91cc | |
parent | 9e0c68dbe0001c71da084fa5bb3f02d6ee4fb4ed (diff) | |
download | android_build_kati-ce14acbe573bdf2853e67ea418940e835c07409b.tar.gz android_build_kati-ce14acbe573bdf2853e67ea418940e835c07409b.tar.bz2 android_build_kati-ce14acbe573bdf2853e67ea418940e835c07409b.zip |
reduce ssvWriter allocation in funcSort
mark old ns/op new ns/op delta
BenchmarkFuncSort 1572 1413 -10.11%
benchmark old allocs new allocs delta
BenchmarkFuncSort 8 7 -12.50%
benchmark old bytes new bytes delta
benchmarkFuncSort 188 156 -17.02%
-rw-r--r-- | func.go | 11 | ||||
-rw-r--r-- | func_test.go | 19 |
2 files changed, 26 insertions, 4 deletions
@@ -303,12 +303,15 @@ func (f *funcSort) Eval(w io.Writer, ev *Evaluator) { // Remove duplicate words. var prev string - sw := ssvWriter{w: w} for _, tok := range toks { - if prev != tok { - sw.WriteString(tok) - prev = tok + if prev == tok { + continue + } + if prev != "" { + writeByte(w, ' ') } + io.WriteString(w, tok) + prev = tok } addStats("funcbody", "sort", t) } diff --git a/func_test.go b/func_test.go index 07b00a0..7fae5f2 100644 --- a/func_test.go +++ b/func_test.go @@ -37,3 +37,22 @@ func BenchmarkFuncStrip(b *testing.B) { strip.Eval(&buf, ev) } } + +func BenchmarkFuncSort(b *testing.B) { + sort := &funcSort{ + fclosure: fclosure{ + args: []Value{ + literal("(sort"), + literal("foo bar lose"), + }, + }, + } + ev := newEvaluator(make(map[string]Var)) + var buf bytes.Buffer + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + buf.Reset() + sort.Eval(&buf, ev) + } +} |