github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/mapspeed_test.go (about)

     1  // Copyright 2013 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  package runtime_test
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  	"testing"
    10  )
    11  
    12  const size = 10
    13  
    14  func BenchmarkHashStringSpeed(b *testing.B) {
    15  	strings := make([]string, size)
    16  	for i := 0; i < size; i++ {
    17  		strings[i] = fmt.Sprintf("string#%d", i)
    18  	}
    19  	sum := 0
    20  	m := make(map[string]int, size)
    21  	for i := 0; i < size; i++ {
    22  		m[strings[i]] = 0
    23  	}
    24  	idx := 0
    25  	b.ResetTimer()
    26  	for i := 0; i < b.N; i++ {
    27  		sum += m[strings[idx]]
    28  		idx++
    29  		if idx == size {
    30  			idx = 0
    31  		}
    32  	}
    33  }
    34  
    35  func BenchmarkHashInt32Speed(b *testing.B) {
    36  	ints := make([]int32, size)
    37  	for i := 0; i < size; i++ {
    38  		ints[i] = int32(i)
    39  	}
    40  	sum := 0
    41  	m := make(map[int32]int, size)
    42  	for i := 0; i < size; i++ {
    43  		m[ints[i]] = 0
    44  	}
    45  	idx := 0
    46  	b.ResetTimer()
    47  	for i := 0; i < b.N; i++ {
    48  		sum += m[ints[idx]]
    49  		idx++
    50  		if idx == size {
    51  			idx = 0
    52  		}
    53  	}
    54  }
    55  
    56  func BenchmarkHashInt64Speed(b *testing.B) {
    57  	ints := make([]int64, size)
    58  	for i := 0; i < size; i++ {
    59  		ints[i] = int64(i)
    60  	}
    61  	sum := 0
    62  	m := make(map[int64]int, size)
    63  	for i := 0; i < size; i++ {
    64  		m[ints[i]] = 0
    65  	}
    66  	idx := 0
    67  	b.ResetTimer()
    68  	for i := 0; i < b.N; i++ {
    69  		sum += m[ints[idx]]
    70  		idx++
    71  		if idx == size {
    72  			idx = 0
    73  		}
    74  	}
    75  }
    76  func BenchmarkHashStringArraySpeed(b *testing.B) {
    77  	stringpairs := make([][2]string, size)
    78  	for i := 0; i < size; i++ {
    79  		for j := 0; j < 2; j++ {
    80  			stringpairs[i][j] = fmt.Sprintf("string#%d/%d", i, j)
    81  		}
    82  	}
    83  	sum := 0
    84  	m := make(map[[2]string]int, size)
    85  	for i := 0; i < size; i++ {
    86  		m[stringpairs[i]] = 0
    87  	}
    88  	idx := 0
    89  	b.ResetTimer()
    90  	for i := 0; i < b.N; i++ {
    91  		sum += m[stringpairs[idx]]
    92  		idx++
    93  		if idx == size {
    94  			idx = 0
    95  		}
    96  	}
    97  }
    98  
    99  func BenchmarkMegMap(b *testing.B) {
   100  	m := make(map[string]bool)
   101  	for suffix := 'A'; suffix <= 'G'; suffix++ {
   102  		m[strings.Repeat("X", 1<<20-1)+fmt.Sprint(suffix)] = true
   103  	}
   104  	key := strings.Repeat("X", 1<<20-1) + "k"
   105  	b.ResetTimer()
   106  	for i := 0; i < b.N; i++ {
   107  		_, _ = m[key]
   108  	}
   109  }
   110  
   111  func BenchmarkMegOneMap(b *testing.B) {
   112  	m := make(map[string]bool)
   113  	m[strings.Repeat("X", 1<<20)] = true
   114  	key := strings.Repeat("Y", 1<<20)
   115  	b.ResetTimer()
   116  	for i := 0; i < b.N; i++ {
   117  		_, _ = m[key]
   118  	}
   119  }
   120  
   121  func BenchmarkMegEqMap(b *testing.B) {
   122  	m := make(map[string]bool)
   123  	key1 := strings.Repeat("X", 1<<20)
   124  	key2 := strings.Repeat("X", 1<<20) // equal but different instance
   125  	m[key1] = true
   126  	b.ResetTimer()
   127  	for i := 0; i < b.N; i++ {
   128  		_, _ = m[key2]
   129  	}
   130  }
   131  
   132  func BenchmarkMegEmptyMap(b *testing.B) {
   133  	m := make(map[string]bool)
   134  	key := strings.Repeat("X", 1<<20)
   135  	b.ResetTimer()
   136  	for i := 0; i < b.N; i++ {
   137  		_, _ = m[key]
   138  	}
   139  }
   140  
   141  func BenchmarkSmallStrMap(b *testing.B) {
   142  	m := make(map[string]bool)
   143  	for suffix := 'A'; suffix <= 'G'; suffix++ {
   144  		m[fmt.Sprint(suffix)] = true
   145  	}
   146  	key := "k"
   147  	b.ResetTimer()
   148  	for i := 0; i < b.N; i++ {
   149  		_, _ = m[key]
   150  	}
   151  }
   152  
   153  func BenchmarkMapStringKeysEight_16(b *testing.B) { benchmarkMapStringKeysEight(b, 16) }
   154  func BenchmarkMapStringKeysEight_32(b *testing.B) { benchmarkMapStringKeysEight(b, 32) }
   155  func BenchmarkMapStringKeysEight_64(b *testing.B) { benchmarkMapStringKeysEight(b, 64) }
   156  func BenchmarkMapStringKeysEight_1M(b *testing.B) { benchmarkMapStringKeysEight(b, 1<<20) }
   157  
   158  func benchmarkMapStringKeysEight(b *testing.B, keySize int) {
   159  	m := make(map[string]bool)
   160  	for i := 0; i < 8; i++ {
   161  		m[strings.Repeat("K", i+1)] = true
   162  	}
   163  	key := strings.Repeat("K", keySize)
   164  	b.ResetTimer()
   165  	for i := 0; i < b.N; i++ {
   166  		_ = m[key]
   167  	}
   168  }
   169  
   170  func BenchmarkIntMap(b *testing.B) {
   171  	m := make(map[int]bool)
   172  	for i := 0; i < 8; i++ {
   173  		m[i] = true
   174  	}
   175  	b.ResetTimer()
   176  	for i := 0; i < b.N; i++ {
   177  		_, _ = m[7]
   178  	}
   179  }
   180  
   181  // Accessing the same keys in a row.
   182  func benchmarkRepeatedLookup(b *testing.B, lookupKeySize int) {
   183  	m := make(map[string]bool)
   184  	// At least bigger than a single bucket:
   185  	for i := 0; i < 64; i++ {
   186  		m[fmt.Sprintf("some key %d", i)] = true
   187  	}
   188  	base := strings.Repeat("x", lookupKeySize-1)
   189  	key1 := base + "1"
   190  	key2 := base + "2"
   191  	b.ResetTimer()
   192  	for i := 0; i < b.N/4; i++ {
   193  		_ = m[key1]
   194  		_ = m[key1]
   195  		_ = m[key2]
   196  		_ = m[key2]
   197  	}
   198  }
   199  
   200  func BenchmarkRepeatedLookupStrMapKey32(b *testing.B) { benchmarkRepeatedLookup(b, 32) }
   201  func BenchmarkRepeatedLookupStrMapKey1M(b *testing.B) { benchmarkRepeatedLookup(b, 1<<20) }
   202  
   203  func BenchmarkNewEmptyMap(b *testing.B) {
   204  	b.ReportAllocs()
   205  	for i := 0; i < b.N; i++ {
   206  		_ = make(map[int]int)
   207  	}
   208  }