1 // Copyright 2012 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.
25 func (TS
) Method1() {}
26 func (TS
) Method2() {}
27 func (TM
) Method1() {}
28 func (TM
) Method2() {}
29 func (TL
) Method1() {}
30 func (TL
) Method2() {}
39 func (T8
) Method1() {}
40 func (T16
) Method1() {}
41 func (T32
) Method1() {}
42 func (T64
) Method1() {}
43 func (Tstr
) Method1() {}
44 func (Tslice
) Method1() {}
58 func TestCmpIfaceConcreteAlloc(t
*testing
.T
) {
59 if runtime
.Compiler
!= "gc" {
60 t
.Skip("skipping on non-gc compiler")
63 n
:= testing
.AllocsPerRun(1, func() {
70 t
.Fatalf("iface cmp allocs=%v; want 0", n
)
74 func BenchmarkEqEfaceConcrete(b
*testing
.B
) {
75 for i
:= 0; i
< b
.N
; i
++ {
80 func BenchmarkEqIfaceConcrete(b
*testing
.B
) {
81 for i
:= 0; i
< b
.N
; i
++ {
86 func BenchmarkNeEfaceConcrete(b
*testing
.B
) {
87 for i
:= 0; i
< b
.N
; i
++ {
92 func BenchmarkNeIfaceConcrete(b
*testing
.B
) {
93 for i
:= 0; i
< b
.N
; i
++ {
98 func BenchmarkConvT2ESmall(b
*testing
.B
) {
99 for i
:= 0; i
< b
.N
; i
++ {
104 func BenchmarkConvT2EUintptr(b
*testing
.B
) {
105 for i
:= 0; i
< b
.N
; i
++ {
110 func BenchmarkConvT2ELarge(b
*testing
.B
) {
111 for i
:= 0; i
< b
.N
; i
++ {
116 func BenchmarkConvT2ISmall(b
*testing
.B
) {
117 for i
:= 0; i
< b
.N
; i
++ {
122 func BenchmarkConvT2IUintptr(b
*testing
.B
) {
123 for i
:= 0; i
< b
.N
; i
++ {
128 func BenchmarkConvT2ILarge(b
*testing
.B
) {
129 for i
:= 0; i
< b
.N
; i
++ {
134 func BenchmarkConvI2E(b
*testing
.B
) {
136 for i
:= 0; i
< b
.N
; i
++ {
141 func BenchmarkConvI2I(b
*testing
.B
) {
143 for i
:= 0; i
< b
.N
; i
++ {
148 func BenchmarkAssertE2T(b
*testing
.B
) {
150 for i
:= 0; i
< b
.N
; i
++ {
155 func BenchmarkAssertE2TLarge(b
*testing
.B
) {
157 for i
:= 0; i
< b
.N
; i
++ {
162 func BenchmarkAssertE2I(b
*testing
.B
) {
164 for i
:= 0; i
< b
.N
; i
++ {
169 func BenchmarkAssertI2T(b
*testing
.B
) {
171 for i
:= 0; i
< b
.N
; i
++ {
176 func BenchmarkAssertI2I(b
*testing
.B
) {
178 for i
:= 0; i
< b
.N
; i
++ {
183 func BenchmarkAssertI2E(b
*testing
.B
) {
185 for i
:= 0; i
< b
.N
; i
++ {
190 func BenchmarkAssertE2E(b
*testing
.B
) {
192 for i
:= 0; i
< b
.N
; i
++ {
197 func BenchmarkAssertE2T2(b
*testing
.B
) {
199 for i
:= 0; i
< b
.N
; i
++ {
204 func BenchmarkAssertE2T2Blank(b
*testing
.B
) {
206 for i
:= 0; i
< b
.N
; i
++ {
211 func BenchmarkAssertI2E2(b
*testing
.B
) {
213 for i
:= 0; i
< b
.N
; i
++ {
214 e
, ok
= i1
.(interface{})
218 func BenchmarkAssertI2E2Blank(b
*testing
.B
) {
220 for i
:= 0; i
< b
.N
; i
++ {
221 _
, ok
= i1
.(interface{})
225 func BenchmarkAssertE2E2(b
*testing
.B
) {
227 for i
:= 0; i
< b
.N
; i
++ {
228 e_
, ok
= e
.(interface{})
232 func BenchmarkAssertE2E2Blank(b
*testing
.B
) {
234 for i
:= 0; i
< b
.N
; i
++ {
235 _
, ok
= e
.(interface{})
239 func TestNonEscapingConvT2E(t
*testing
.T
) {
240 if runtime
.Compiler
== "gccgo" {
241 t
.Skip("does not work on gccgo without better escape analysis")
244 m
:= make(map[interface{}]bool)
247 t
.Fatalf("42 is not present in the map")
250 t
.Fatalf("0 is present in the map")
253 n
:= testing
.AllocsPerRun(1000, func() {
255 t
.Fatalf("0 is present in the map")
259 t
.Fatalf("want 0 allocs, got %v", n
)
263 func TestNonEscapingConvT2I(t
*testing
.T
) {
264 if runtime
.Compiler
== "gccgo" {
265 t
.Skip("does not work on gccgo without better escape analysis")
268 m
:= make(map[I1
]bool)
271 t
.Fatalf("42 is not present in the map")
274 t
.Fatalf("0 is present in the map")
277 n
:= testing
.AllocsPerRun(1000, func() {
279 t
.Fatalf("0 is present in the map")
283 t
.Fatalf("want 0 allocs, got %v", n
)
287 func TestZeroConvT2x(t
*testing
.T
) {
288 if runtime
.Compiler
== "gccgo" {
289 t
.Skip("does not work on gccgo without better escape analysis")
296 {name
: "E8", fn
: func() { e
= eight8
}}, // any byte-sized value does not allocate
297 {name
: "E16", fn
: func() { e
= zero16
}}, // zero values do not allocate
298 {name
: "E32", fn
: func() { e
= zero32
}},
299 {name
: "E64", fn
: func() { e
= zero64
}},
300 {name
: "Estr", fn
: func() { e
= zerostr
}},
301 {name
: "Eslice", fn
: func() { e
= zeroslice
}},
302 {name
: "Econstflt", fn
: func() { e
= 99.0 }}, // constants do not allocate
303 {name
: "Econststr", fn
: func() { e
= "change" }},
304 {name
: "I8", fn
: func() { i1
= eight8I
}},
305 {name
: "I16", fn
: func() { i1
= zero16I
}},
306 {name
: "I32", fn
: func() { i1
= zero32I
}},
307 {name
: "I64", fn
: func() { i1
= zero64I
}},
308 {name
: "Istr", fn
: func() { i1
= zerostrI
}},
309 {name
: "Islice", fn
: func() { i1
= zerosliceI
}},
312 for _
, test
:= range tests
{
313 t
.Run(test
.name
, func(t
*testing
.T
) {
314 n
:= testing
.AllocsPerRun(1000, test
.fn
)
316 t
.Errorf("want zero allocs, got %v", n
)
342 zeroslice
[]byte = nil
343 zerosliceI Tslice
= nil
344 nzslice
[]byte = []byte("abc")
347 nzbig
[512]byte = [512]byte{511: 1}
350 func BenchmarkConvT2Ezero(b
*testing
.B
) {
351 b
.Run("zero", func(b
*testing
.B
) {
352 b
.Run("16", func(b
*testing
.B
) {
353 for i
:= 0; i
< b
.N
; i
++ {
357 b
.Run("32", func(b
*testing
.B
) {
358 for i
:= 0; i
< b
.N
; i
++ {
362 b
.Run("64", func(b
*testing
.B
) {
363 for i
:= 0; i
< b
.N
; i
++ {
367 b
.Run("str", func(b
*testing
.B
) {
368 for i
:= 0; i
< b
.N
; i
++ {
372 b
.Run("slice", func(b
*testing
.B
) {
373 for i
:= 0; i
< b
.N
; i
++ {
377 b
.Run("big", func(b
*testing
.B
) {
378 for i
:= 0; i
< b
.N
; i
++ {
383 b
.Run("nonzero", func(b
*testing
.B
) {
384 b
.Run("16", func(b
*testing
.B
) {
385 for i
:= 0; i
< b
.N
; i
++ {
389 b
.Run("32", func(b
*testing
.B
) {
390 for i
:= 0; i
< b
.N
; i
++ {
394 b
.Run("64", func(b
*testing
.B
) {
395 for i
:= 0; i
< b
.N
; i
++ {
399 b
.Run("str", func(b
*testing
.B
) {
400 for i
:= 0; i
< b
.N
; i
++ {
404 b
.Run("slice", func(b
*testing
.B
) {
405 for i
:= 0; i
< b
.N
; i
++ {
409 b
.Run("big", func(b
*testing
.B
) {
410 for i
:= 0; i
< b
.N
; i
++ {