storage/benchfmt: reuse maps when identical

Change-Id: Ia38657da41f5ba5b68347f8e3e3dea112f8130ea
Reviewed-on: https://go-review.googlesource.com/35673
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/storage/benchfmt/benchfmt.go b/storage/benchfmt/benchfmt.go
index 00e696a..37f33b7 100644
--- a/storage/benchfmt/benchfmt.go
+++ b/storage/benchfmt/benchfmt.go
@@ -34,6 +34,9 @@
 	// file or provided by AddLabels. They cannot be overridden.
 	permLabels Labels
 	lineNum    int
+	// cached from last call to newResult, to save on allocations
+	lastName       string
+	lastNameLabels Labels
 	// cached from the last call to Next
 	result *Result
 	err    error
@@ -160,15 +163,19 @@
 }
 
 // newResult parses a line and returns a Result object for the line.
-func newResult(labels Labels, lineNum int, name, content string) *Result {
-	r := &Result{
-		Labels:     labels,
-		NameLabels: make(Labels),
-		LineNum:    lineNum,
-		Content:    content,
+func (r *Reader) newResult(labels Labels, lineNum int, name, content string) *Result {
+	res := &Result{
+		Labels:  labels,
+		LineNum: lineNum,
+		Content: content,
 	}
-	parseNameLabels(name, r.NameLabels)
-	return r
+	if r.lastName != name {
+		r.lastName = name
+		r.lastNameLabels = make(Labels)
+		parseNameLabels(name, r.lastNameLabels)
+	}
+	res.NameLabels = r.lastNameLabels
+	return res
 }
 
 // copy returns a new copy of the labels map, to protect against
@@ -221,7 +228,7 @@
 			}
 		}
 		if fullName, ok := parseBenchmarkLine(line); ok {
-			r.result = newResult(r.labels, r.lineNum, fullName, line)
+			r.result = r.newResult(r.labels, r.lineNum, fullName, line)
 			return true
 		}
 	}