[go] maps, slices: modernize tests and benchmarks

1 view
Skip to first unread message

Tobias Klauser (Gerrit)

unread,
4:50 AM (3 hours ago) 4:50 AM
to goph...@pubsubhelper.golang.org, golang-co...@googlegroups.com

Tobias Klauser has uploaded the change for review

Commit message

maps, slices: modernize tests and benchmarks

Use range-over-int and testing.B.Loop in tests and benchmarks.
Change-Id: Ied6d9c2df4a513fdf8b030c55f7fd51710486a15

Change diff

diff --git a/src/maps/iter_test.go b/src/maps/iter_test.go
index 64ea42a..951435b 100644
--- a/src/maps/iter_test.go
+++ b/src/maps/iter_test.go
@@ -10,7 +10,7 @@
)

func TestAll(t *testing.T) {
- for size := 0; size < 10; size++ {
+ for size := range 10 {
m := make(map[int]int)
for i := range size {
m[i] = i
@@ -30,7 +30,7 @@
}

func TestKeys(t *testing.T) {
- for size := 0; size < 10; size++ {
+ for size := range 10 {
var want []int
m := make(map[int]int)
for i := range size {
@@ -50,7 +50,7 @@
}

func TestValues(t *testing.T) {
- for size := 0; size < 10; size++ {
+ for size := range 10 {
var want []int
m := make(map[int]int)
for i := range size {
diff --git a/src/maps/maps_test.go b/src/maps/maps_test.go
index c8ee3cd..615d11c 100644
--- a/src/maps/maps_test.go
+++ b/src/maps/maps_test.go
@@ -138,18 +138,18 @@

func BenchmarkMapClone(b *testing.B) {
var m = make(map[int]int)
- for i := 0; i < 1000000; i++ {
+ for i := range 1000000 {
m[i] = i
}
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
+
+ for b.Loop() {
n = Clone(m)
}
}

func TestCloneWithDelete(t *testing.T) {
var m = make(map[int]int)
- for i := 0; i < 32; i++ {
+ for i := range 32 {
m[i] = i
}
for i := 8; i < 32; i++ {
@@ -159,7 +159,7 @@
if len(m2) != 8 {
t.Errorf("len2(m2) = %d, want %d", len(m2), 8)
}
- for i := 0; i < 8; i++ {
+ for i := range 8 {
if m2[i] != m[i] {
t.Errorf("m2[%d] = %d, want %d", i, m2[i], m[i])
}
@@ -169,14 +169,14 @@
func TestCloneWithMapAssign(t *testing.T) {
var m = make(map[int]int)
const N = 25
- for i := 0; i < N; i++ {
+ for i := range N {
m[i] = i
}
m2 := Clone(m)
if len(m2) != N {
t.Errorf("len2(m2) = %d, want %d", len(m2), N)
}
- for i := 0; i < N; i++ {
+ for i := range N {
if m2[i] != m[i] {
t.Errorf("m2[%d] = %d, want %d", i, m2[i], m[i])
}
@@ -191,7 +191,7 @@
var zero float64
negZero := -zero

- for tst := 0; tst < 3; tst++ {
+ for tst := range 3 {
// Initialize m with a key and value.
m := map[K]V{}
var k1 K
@@ -205,7 +205,7 @@
// 1 entry already
// 7 more fill up 1 bucket
// 1 more to grow to 2 buckets
- for i := 0; i < 7+1; i++ {
+ for i := range 7 + 1 {
m[K{float64(i) + 1}] = V{}
}
case 2:
@@ -215,7 +215,7 @@
// 5 more (13 total) fill up 2 buckets
// 13 more (26 total) fill up 4 buckets
// 1 more to start the 4->8 bucket grow
- for i := 0; i < 7+5+13+1; i++ {
+ for i := range 7 + 5 + 13 + 1 {
m[K{float64(i) + 1}] = V{}
}
}
diff --git a/src/slices/iter_test.go b/src/slices/iter_test.go
index 07d73e9..7f96109 100644
--- a/src/slices/iter_test.go
+++ b/src/slices/iter_test.go
@@ -12,7 +12,7 @@
)

func TestAll(t *testing.T) {
- for size := 0; size < 10; size++ {
+ for size := range 10 {
var s []int
for i := range size {
s = append(s, i)
@@ -34,7 +34,7 @@
}

func TestBackward(t *testing.T) {
- for size := 0; size < 10; size++ {
+ for size := range 10 {
var s []int
for i := range size {
s = append(s, i)
@@ -56,7 +56,7 @@
}

func TestValues(t *testing.T) {
- for size := 0; size < 10; size++ {
+ for size := range 10 {
var s []int
for i := range size {
s = append(s, i)
diff --git a/src/slices/slices_test.go b/src/slices/slices_test.go
index 19a3e9b..56ac2c7 100644
--- a/src/slices/slices_test.go
+++ b/src/slices/slices_test.go
@@ -134,7 +134,7 @@

xs := make([]Large, 1024)
ys := make([]Large, 1024)
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_ = EqualFunc(xs, ys, func(x, y Large) bool { return x == y })
}
}
@@ -396,7 +396,7 @@
type Large [4 * 1024]byte

ss := make([]Large, 1024)
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_ = Index(ss, Large{1})
}
}
@@ -421,7 +421,7 @@
type Large [4 * 1024]byte

ss := make([]Large, 1024)
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_ = IndexFunc(ss, func(e Large) bool {
return e == Large{1}
})
@@ -504,7 +504,7 @@
const count = 50
n := testing.AllocsPerRun(10, func() {
s := []int{1, 2, 3}
- for i := 0; i < count; i++ {
+ for range count {
s = Insert(s, 0, 1)
}
})
@@ -522,7 +522,7 @@
for i := 0; i <= n; i++ { // insertion point
for x := 0; x <= N; x++ { // start of inserted data
for y := x; y <= N; y++ { // end of inserted data
- for k := 0; k < N; k++ {
+ for k := range N {
a[k] = k
}
want = want[:0]
@@ -795,7 +795,7 @@
for _, c := range compactTests {
b.Run(c.name, func(b *testing.B) {
ss := make([]int, 0, 64)
- for k := 0; k < b.N; k++ {
+ for b.Loop() {
ss = ss[:0]
ss = append(ss, c.s...)
_ = Compact(ss)
@@ -811,7 +811,7 @@
b.Run("all_dup", func(b *testing.B) {
ss := make([]Large, N)
b.ResetTimer()
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_ = Compact(ss)
}
})
@@ -821,7 +821,7 @@
ss[i][0] = i
}
b.ResetTimer()
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_ = Compact(ss)
}
})
@@ -894,7 +894,7 @@
for _, c := range compactTests {
b.Run(c.name, func(b *testing.B) {
ss := make([]int, 0, 64)
- for k := 0; k < b.N; k++ {
+ for b.Loop() {
ss = ss[:0]
ss = append(ss, c.s...)
_ = CompactFunc(ss, func(a, b int) bool { return a == b })
@@ -910,7 +910,7 @@
b.Run("all_dup", func(b *testing.B) {
ss := make([]Element, N)
b.ResetTimer()
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_ = CompactFunc(ss, func(a, b Element) bool { return a == b })
}
})
@@ -920,7 +920,7 @@
ss[i] = i
}
b.ResetTimer()
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_ = CompactFunc(ss, func(a, b Element) bool { return a == b })
}
})
@@ -1146,7 +1146,7 @@
for j := i; j <= n; j++ { // insertion point 2
for x := 0; x <= N; x++ { // start of inserted data
for y := x; y <= N; y++ { // end of inserted data
- for k := 0; k < N; k++ {
+ for k := range N {
a[k] = k
}
want = want[:0]
@@ -1209,14 +1209,14 @@

for _, c := range cases {
b.Run("naive-"+c.name, func(b *testing.B) {
- for k := 0; k < b.N; k++ {
+ for b.Loop() {
s := c.s()
v := c.v()
_ = naiveReplace(s, c.i, c.j, v...)
}
})
b.Run("optimized-"+c.name, func(b *testing.B) {
- for k := 0; k < b.N; k++ {
+ for b.Loop() {
s := c.s()
v := c.v()
_ = Replace(s, c.i, c.j, v...)
@@ -1231,7 +1231,7 @@
maxCap := cap(b)
nGrow := 0
const N = 1e6
- for i := 0; i < N; i++ {
+ for range int(N) {
b = Insert(b, len(b)-1, 0)
if cap(b) > maxCap {
maxCap = cap(b)
@@ -1249,7 +1249,7 @@
maxCap := cap(b)
nGrow := 0
const N = 1e6
- for i := 0; i < N; i++ {
+ for range int(N) {
b = Replace(b, len(b)-2, len(b)-1, 0, 0)
if cap(b) > maxCap {
maxCap = cap(b)
diff --git a/src/slices/sort_benchmark_test.go b/src/slices/sort_benchmark_test.go
index cafb1a4..5c2a34d 100644
--- a/src/slices/sort_benchmark_test.go
+++ b/src/slices/sort_benchmark_test.go
@@ -21,8 +21,7 @@
}
midpoint := len(floats) / 2
needle := (floats[midpoint] + floats[midpoint+1]) / 2
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_, _ = slices.BinarySearch(floats, needle)
}
})
@@ -44,8 +43,7 @@
midpoint := len(structs) / 2
needle := &myStruct{n: (structs[midpoint].n + structs[midpoint+1].n) / 2}
cmpFunc := func(a, b *myStruct) int { return a.n - b.n }
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
_, _ = slices.BinarySearchFunc(structs, needle, cmpFunc)
}
})
@@ -70,8 +68,7 @@
}
// Presort the slice so all benchmark iterations are identical.
slices.SortFunc(structs, cmpFunc)
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
+ for b.Loop() {
// Sort the slice twice because slices.SortFunc modifies the slice in place.
slices.SortFunc(structs, func(a, b *myStruct) int { return cmpFunc(b, a) })
slices.SortFunc(structs, cmpFunc)
diff --git a/src/slices/sort_test.go b/src/slices/sort_test.go
index 855f861c..dc80703 100644
--- a/src/slices/sort_test.go
+++ b/src/slices/sort_test.go
@@ -61,7 +61,7 @@
n /= 100
}
data := make([]int, n)
- for i := 0; i < len(data); i++ {
+ for i := range data {
data[i] = rand.Intn(100)
}
if IsSorted(data) {
@@ -95,7 +95,7 @@
// If reversed is true, expect reverse ordering.
func (d intPairs) inOrder(reversed bool) bool {
lastA, lastB := -1, 0
- for i := 0; i < len(d); i++ {
+ for i := range d {
if lastA != d[i].a {
lastA = d[i].a
lastB = d[i].b
@@ -123,7 +123,7 @@
data := make(intPairs, n)

// random distribution
- for i := 0; i < len(data); i++ {
+ for i := range data {
data[i].a = rand.Intn(m)
}
if IsSortedFunc(data, intPairCmp) {
@@ -149,7 +149,7 @@
}

// sorted reversed
- for i := 0; i < len(data); i++ {
+ for i := range data {
data[i].a = len(data) - i
}
data.initB()
@@ -244,7 +244,7 @@

// No matter which element of fs is replaced with a NaN, both Min and Max
// should propagate the NaN to their output.
- for i := 0; i < len(fs); i++ {
+ for i := range fs {
testfs := Clone(fs)
testfs[i] = math.NaN()

Change information

Files:
  • M src/maps/iter_test.go
  • M src/maps/maps_test.go
  • M src/slices/iter_test.go
  • M src/slices/slices_test.go
  • M src/slices/sort_benchmark_test.go
  • M src/slices/sort_test.go
Change size: M
Delta: 6 files changed, 40 insertions(+), 43 deletions(-)
Open in Gerrit

Related details

Attention set is empty
Submit Requirements:
  • requirement is not satisfiedCode-Review
  • requirement satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
  • requirement is not satisfiedTryBots-Pass
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: newchange
Gerrit-Project: go
Gerrit-Branch: master
Gerrit-Change-Id: Ied6d9c2df4a513fdf8b030c55f7fd51710486a15
Gerrit-Change-Number: 779660
Gerrit-PatchSet: 1
Gerrit-Owner: Tobias Klauser <tobias....@gmail.com>
Gerrit-Reviewer: Tobias Klauser <tobias....@gmail.com>
unsatisfied_requirement
satisfied_requirement
open
diffy

Florian Lehner (Gerrit)

unread,
7:37 AM (1 hour ago) 7:37 AM
to Tobias Klauser, goph...@pubsubhelper.golang.org, golang...@luci-project-accounts.iam.gserviceaccount.com, Ian Lance Taylor, Eli Bendersky‎, Gopher Robot, golang-co...@googlegroups.com
Attention needed from Ian Lance Taylor and Tobias Klauser

Florian Lehner voted Code-Review+1

Code-Review+1
Open in Gerrit

Related details

Attention is currently required from:
  • Ian Lance Taylor
  • Tobias Klauser
Submit Requirements:
    • requirement is not satisfiedCode-Review
    • requirement satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    • requirement satisfiedTryBots-Pass
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: go
    Gerrit-Branch: master
    Gerrit-Change-Id: Ied6d9c2df4a513fdf8b030c55f7fd51710486a15
    Gerrit-Change-Number: 779660
    Gerrit-PatchSet: 1
    Gerrit-Owner: Tobias Klauser <tobias....@gmail.com>
    Gerrit-Reviewer: Florian Lehner <lehner.f...@gmail.com>
    Gerrit-Reviewer: Ian Lance Taylor <ia...@golang.org>
    Gerrit-Reviewer: Tobias Klauser <tobias....@gmail.com>
    Gerrit-CC: Eli Bendersky‎ <eli...@golang.org>
    Gerrit-CC: Gopher Robot <go...@golang.org>
    Gerrit-Attention: Ian Lance Taylor <ia...@golang.org>
    Gerrit-Attention: Tobias Klauser <tobias....@gmail.com>
    Gerrit-Comment-Date: Tue, 19 May 2026 11:37:21 +0000
    Gerrit-HasComments: No
    Gerrit-Has-Labels: Yes
    unsatisfied_requirement
    satisfied_requirement
    open
    diffy
    Reply all
    Reply to author
    Forward
    0 new messages