aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-06-19 13:54:53 +0900
committerFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-06-19 14:47:02 +0900
commitce14acbe573bdf2853e67ea418940e835c07409b (patch)
tree8fa3e7410a3d65d968cb39b1d1643e2495bf91cc
parent9e0c68dbe0001c71da084fa5bb3f02d6ee4fb4ed (diff)
downloadandroid_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.go11
-rw-r--r--func_test.go19
2 files changed, 26 insertions, 4 deletions
diff --git a/func.go b/func.go
index 550f67b..62e9af4 100644
--- a/func.go
+++ b/func.go
@@ -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)
+ }
+}