1
0
mirror of https://github.com/golang/go synced 2024-11-12 08:20:22 -07:00

fmt: make benchmarks parallel

This seems to be the best target to benchmark sync.Pool changes.

This is resend of cl/49910043 which was LGTMed by
TBR=bradfitz

R=golang-codereviews
CC=golang-codereviews
https://golang.org/cl/50140045
This commit is contained in:
Dmitriy Vyukov 2014-01-10 13:51:11 +04:00
parent bb7cd9659b
commit 7f62d08777

View File

@ -11,6 +11,7 @@ import (
"math" "math"
"runtime" "runtime"
"strings" "strings"
"sync/atomic"
"testing" "testing"
"time" "time"
"unicode" "unicode"
@ -606,46 +607,66 @@ func TestReorder(t *testing.T) {
} }
func BenchmarkSprintfEmpty(b *testing.B) { func BenchmarkSprintfEmpty(b *testing.B) {
for i := 0; i < b.N; i++ { benchmarkSprintf(b, func(buf *bytes.Buffer) {
Sprintf("") Sprintf("")
} })
} }
func BenchmarkSprintfString(b *testing.B) { func BenchmarkSprintfString(b *testing.B) {
for i := 0; i < b.N; i++ { benchmarkSprintf(b, func(buf *bytes.Buffer) {
Sprintf("%s", "hello") Sprintf("%s", "hello")
} })
} }
func BenchmarkSprintfInt(b *testing.B) { func BenchmarkSprintfInt(b *testing.B) {
for i := 0; i < b.N; i++ { benchmarkSprintf(b, func(buf *bytes.Buffer) {
Sprintf("%d", 5) Sprintf("%d", 5)
} })
} }
func BenchmarkSprintfIntInt(b *testing.B) { func BenchmarkSprintfIntInt(b *testing.B) {
for i := 0; i < b.N; i++ { benchmarkSprintf(b, func(buf *bytes.Buffer) {
Sprintf("%d %d", 5, 6) Sprintf("%d %d", 5, 6)
} })
} }
func BenchmarkSprintfPrefixedInt(b *testing.B) { func BenchmarkSprintfPrefixedInt(b *testing.B) {
for i := 0; i < b.N; i++ { benchmarkSprintf(b, func(buf *bytes.Buffer) {
Sprintf("This is some meaningless prefix text that needs to be scanned %d", 6) Sprintf("This is some meaningless prefix text that needs to be scanned %d", 6)
} })
} }
func BenchmarkSprintfFloat(b *testing.B) { func BenchmarkSprintfFloat(b *testing.B) {
for i := 0; i < b.N; i++ { benchmarkSprintf(b, func(buf *bytes.Buffer) {
Sprintf("%g", 5.23184) Sprintf("%g", 5.23184)
} })
} }
func BenchmarkManyArgs(b *testing.B) { func BenchmarkManyArgs(b *testing.B) {
var buf bytes.Buffer benchmarkSprintf(b, func(buf *bytes.Buffer) {
for i := 0; i < b.N; i++ {
buf.Reset() buf.Reset()
Fprintf(&buf, "%2d/%2d/%2d %d:%d:%d %s %s\n", 3, 4, 5, 11, 12, 13, "hello", "world") Fprintf(buf, "%2d/%2d/%2d %d:%d:%d %s %s\n", 3, 4, 5, 11, 12, 13, "hello", "world")
})
}
func benchmarkSprintf(b *testing.B, f func(buf *bytes.Buffer)) {
const CallsPerSched = 1000
procs := runtime.GOMAXPROCS(-1)
N := int32(b.N / CallsPerSched)
c := make(chan bool, procs)
for p := 0; p < procs; p++ {
go func() {
var buf bytes.Buffer
for atomic.AddInt32(&N, -1) >= 0 {
for g := 0; g < CallsPerSched; g++ {
f(&buf)
}
}
c <- true
}()
}
for p := 0; p < procs; p++ {
<-c
} }
} }