1// Copyright 2022 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 5package slog 6 7import ( 8 "internal/testenv" 9 "testing" 10 "time" 11) 12 13func TestAttrNoAlloc(t *testing.T) { 14 testenv.SkipIfOptimizationOff(t) 15 // Assign values just to make sure the compiler doesn't optimize away the statements. 16 var ( 17 i int64 18 u uint64 19 f float64 20 b bool 21 s string 22 x any 23 p = &i 24 d time.Duration 25 ) 26 a := int(testing.AllocsPerRun(5, func() { 27 i = Int64("key", 1).Value.Int64() 28 u = Uint64("key", 1).Value.Uint64() 29 f = Float64("key", 1).Value.Float64() 30 b = Bool("key", true).Value.Bool() 31 s = String("key", "foo").Value.String() 32 d = Duration("key", d).Value.Duration() 33 x = Any("key", p).Value.Any() 34 })) 35 if a != 0 { 36 t.Errorf("got %d allocs, want zero", a) 37 } 38 _ = u 39 _ = f 40 _ = b 41 _ = s 42 _ = x 43} 44 45func BenchmarkAttrString(b *testing.B) { 46 var ( 47 is string 48 u string 49 f string 50 bn string 51 s string 52 x string 53 ds string 54 p = &is 55 d time.Duration 56 ) 57 b.ReportAllocs() 58 for i := 0; i < b.N; i++ { 59 is = Int64("key", 1).String() 60 u = Uint64("key", 1).String() 61 f = Float64("key", 1).String() 62 bn = Bool("key", true).String() 63 s = String("key", "foo").String() 64 ds = Duration("key", d).String() 65 x = Any("key", p).String() 66 } 67 _ = u 68 _ = f 69 _ = bn 70 _ = s 71 _ = x 72 _ = ds 73 _ = p 74} 75