Commit b7ec659b authored by Rob Pike's avatar Rob Pike

fmt: fix Malloc test

We need to avoid allocating an extra word for the interface value
passing the floating-point value as an interface{}. It's easy.

Fixes #2722.

R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5553044
parent 7585aa6a
...@@ -509,7 +509,7 @@ func BenchmarkSprintfFloat(b *testing.B) { ...@@ -509,7 +509,7 @@ func BenchmarkSprintfFloat(b *testing.B) {
var mallocBuf bytes.Buffer var mallocBuf bytes.Buffer
var mallocTest = []struct { var mallocTest = []struct {
max int count int
desc string desc string
fn func() fn func()
}{ }{
...@@ -518,7 +518,9 @@ var mallocTest = []struct { ...@@ -518,7 +518,9 @@ var mallocTest = []struct {
{1, `Sprintf("%x")`, func() { Sprintf("%x", 7) }}, {1, `Sprintf("%x")`, func() { Sprintf("%x", 7) }},
{2, `Sprintf("%s")`, func() { Sprintf("%s", "hello") }}, {2, `Sprintf("%s")`, func() { Sprintf("%s", "hello") }},
{1, `Sprintf("%x %x")`, func() { Sprintf("%x %x", 7, 112) }}, {1, `Sprintf("%x %x")`, func() { Sprintf("%x %x", 7, 112) }},
{2, `Sprintf("%g")`, func() { Sprintf("%g", 3.14159) }}, // TODO: should be 1. See Issue 2722. // For %g we use a float32, not float64, to guarantee passing the argument
// does not need to allocate memory to store the result in a pointer-sized word.
{2, `Sprintf("%g")`, func() { Sprintf("%g", float32(3.14159)) }},
{0, `Fprintf(buf, "%x %x %x")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%x %x %x", 7, 8, 9) }}, {0, `Fprintf(buf, "%x %x %x")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%x %x %x", 7, 8, 9) }},
{1, `Fprintf(buf, "%s")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%s", "hello") }}, {1, `Fprintf(buf, "%s")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%s", "hello") }},
} }
...@@ -535,8 +537,8 @@ func TestCountMallocs(t *testing.T) { ...@@ -535,8 +537,8 @@ func TestCountMallocs(t *testing.T) {
} }
runtime.UpdateMemStats() runtime.UpdateMemStats()
mallocs += runtime.MemStats.Mallocs mallocs += runtime.MemStats.Mallocs
if mallocs/N > uint64(mt.max) { if mallocs/N > uint64(mt.count) {
t.Errorf("%s: expected at most %d mallocs, got %d", mt.desc, mt.max, mallocs/N) t.Errorf("%s: expected %d mallocs, got %d", mt.desc, mt.count, mallocs/N)
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment