Calling it will show memory allocation statistics for that
single benchmark (if -test.benchmem is not provided)
R=golang-dev, rsc, kevlar, bradfitz
CC=golang-dev
https://golang.org/cl/
7027046
}
b.SetBytes(int64(len(buf)))
runtime.GC()
- var ms runtime.MemStats
- runtime.ReadMemStats(&ms)
- mallocs := ms.Mallocs
+ b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
Parse(bytes.NewBuffer(buf))
}
- b.StopTimer()
- runtime.ReadMemStats(&ms)
- mallocs = ms.Mallocs - mallocs
- b.Logf("%d iterations, %d mallocs per iteration\n", b.N, int(mallocs)/b.N)
}
}
b.SetBytes(int64(len(buf)))
runtime.GC()
- var ms runtime.MemStats
- runtime.ReadMemStats(&ms)
- mallocs := ms.Mallocs
+ b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
z := NewTokenizer(bytes.NewBuffer(buf))
}
}
}
- b.StopTimer()
- runtime.ReadMemStats(&ms)
- mallocs = ms.Mallocs - mallocs
- b.Logf("%d iterations, %d mallocs per iteration\n", b.N, int(mallocs)/b.N)
}
func BenchmarkRawLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, rawLevel) }
// timing and to specify the number of iterations to run.
type B struct {
common
- N int
- benchmark InternalBenchmark
- bytes int64
- timerOn bool
- result BenchmarkResult
+ N int
+ benchmark InternalBenchmark
+ bytes int64
+ timerOn bool
+ showAllocResult bool
+ result BenchmarkResult
// The initial states of memStats.Mallocs and memStats.TotalAlloc.
startAllocs uint64
startBytes uint64
// If this is called, the benchmark will report ns/op and MB/s.
func (b *B) SetBytes(n int64) { b.bytes = n }
+// ReportAllocs enables malloc statistics for this benchmark.
+// It is equivalent to setting -test.benchmem, but it only affects the
+// benchmark function that calls ReportAllocs.
+func (b *B) ReportAllocs() {
+ b.showAllocResult = true
+}
+
func (b *B) nsPerOp() int64 {
if b.N <= 0 {
return 0
continue
}
results := r.String()
- if *benchmarkMemory {
+ if *benchmarkMemory || b.showAllocResult {
results += "\t" + r.MemString()
}
fmt.Println(results)