From 39213c1fdb74dffb02617b6a8ac5b482d9aa4fc7 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 13 Dec 2011 14:49:26 -0800 Subject: [PATCH] strconv: some allocation tests R=rsc, r CC=golang-dev https://golang.org/cl/5477084 --- src/pkg/strconv/ftoa_test.go | 17 +++++++++++++++++ src/pkg/strconv/itoa_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/pkg/strconv/ftoa_test.go b/src/pkg/strconv/ftoa_test.go index a6205ac477..40c71a28b4 100644 --- a/src/pkg/strconv/ftoa_test.go +++ b/src/pkg/strconv/ftoa_test.go @@ -149,6 +149,23 @@ func TestFtoa(t *testing.T) { } } +func TestAppendFloatDoesntAllocate(t *testing.T) { + n := numAllocations(func() { + var buf [64]byte + AppendFloat(buf[:0], 1.23, 'g', 5, 64) + }) + want := 1 // TODO(bradfitz): this might be 0, once escape analysis is better + if n != want { + t.Errorf("with local buffer, did %d allocations, want %d", n, want) + } + n = numAllocations(func() { + AppendFloat(globalBuf[:0], 1.23, 'g', 5, 64) + }) + if n != 0 { + t.Errorf("with reused buffer, did %d allocations, want 0", n) + } +} + func BenchmarkFormatFloatDecimal(b *testing.B) { for i := 0; i < b.N; i++ { FormatFloat(33909, 'g', -1, 64) diff --git a/src/pkg/strconv/itoa_test.go b/src/pkg/strconv/itoa_test.go index e0213ae9af..d4b09a5d87 100644 --- a/src/pkg/strconv/itoa_test.go +++ b/src/pkg/strconv/itoa_test.go @@ -5,6 +5,7 @@ package strconv_test import ( + "runtime" . "strconv" "testing" ) @@ -125,6 +126,33 @@ func TestUitoa(t *testing.T) { } } +func numAllocations(f func()) int { + runtime.UpdateMemStats() + n0 := runtime.MemStats.Mallocs + f() + runtime.UpdateMemStats() + return int(runtime.MemStats.Mallocs - n0) +} + +var globalBuf [64]byte + +func TestAppendUintDoesntAllocate(t *testing.T) { + n := numAllocations(func() { + var buf [64]byte + AppendInt(buf[:0], 123, 10) + }) + want := 1 // TODO(bradfitz): this might be 0, once escape analysis is better + if n != want { + t.Errorf("with local buffer, did %d allocations, want %d", n, want) + } + n = numAllocations(func() { + AppendInt(globalBuf[:0], 123, 10) + }) + if n != 0 { + t.Errorf("with reused buffer, did %d allocations, want 0", n) + } +} + func BenchmarkFormatInt(b *testing.B) { for i := 0; i < b.N; i++ { for _, test := range itob64tests {