// Copyright 2020 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package test import ( "fmt" "testing" ) var globl int64 var globl32 int32 func BenchmarkLoadAdd(b *testing.B) { x := make([]int64, 1024) y := make([]int64, 1024) for i := 0; i < b.N; i++ { var s int64 for i := range x { s ^= x[i] + y[i] } globl = s } } // Added for ppc64 extswsli on power9 func BenchmarkExtShift(b *testing.B) { x := make([]int32, 1024) for i := 0; i < b.N; i++ { var s int64 for i := range x { s ^= int64(x[i]+32) * 8 } globl = s } } func BenchmarkModify(b *testing.B) { a := make([]int64, 1024) v := globl for i := 0; i < b.N; i++ { for j := range a { a[j] += v } } } func BenchmarkMullImm(b *testing.B) { x := make([]int32, 1024) for i := 0; i < b.N; i++ { var s int32 for i := range x { s += x[i] * 100 } globl32 = s } } func BenchmarkConstModify(b *testing.B) { a := make([]int64, 1024) for i := 0; i < b.N; i++ { for j := range a { a[j] += 3 } } } func BenchmarkBitSet(b *testing.B) { const N = 64 * 8 a := make([]uint64, N/64) for i := 0; i < b.N; i++ { for j := uint64(0); j < N; j++ { a[j/64] |= 1 << (j % 64) } } } func BenchmarkBitClear(b *testing.B) { const N = 64 * 8 a := make([]uint64, N/64) for i := 0; i < b.N; i++ { for j := uint64(0); j < N; j++ { a[j/64] &^= 1 << (j % 64) } } } func BenchmarkBitToggle(b *testing.B) { const N = 64 * 8 a := make([]uint64, N/64) for i := 0; i < b.N; i++ { for j := uint64(0); j < N; j++ { a[j/64] ^= 1 << (j % 64) } } } func BenchmarkBitSetConst(b *testing.B) { const N = 64 a := make([]uint64, N) for i := 0; i < b.N; i++ { for j := range a { a[j] |= 1 << 37 } } } func BenchmarkBitClearConst(b *testing.B) { const N = 64 a := make([]uint64, N) for i := 0; i < b.N; i++ { for j := range a { a[j] &^= 1 << 37 } } } func BenchmarkBitToggleConst(b *testing.B) { const N = 64 a := make([]uint64, N) for i := 0; i < b.N; i++ { for j := range a { a[j] ^= 1 << 37 } } } func BenchmarkMulNeg(b *testing.B) { x := make([]int64, 1024) for i := 0; i < b.N; i++ { var s int64 for i := range x { s = (-x[i]) * 11 } globl = s } } func BenchmarkMul2Neg(b *testing.B) { x := make([]int64, 1024) y := make([]int64, 1024) for i := 0; i < b.N; i++ { var s int64 for i := range x { s = (-x[i]) * (-y[i]) } globl = s } } func BenchmarkSimplifyNegMul(b *testing.B) { x := make([]int64, 1024) y := make([]int64, 1024) b.ResetTimer() for i := 0; i < b.N; i++ { var s int64 for i := range x { s = -(-x[i] * y[i]) } globl = s } } func BenchmarkSimplifyNegDiv(b *testing.B) { x := make([]int64, 1024) y := make([]int64, 1024) for i := range y { y[i] = 42 } b.ResetTimer() for i := 0; i < b.N; i++ { var s int64 for i := range x { s = -(-x[i] / y[i]) } globl = s } } var globbool bool // containsRight compares strs[i] == str (slice element on left). // //go:noinline func containsRight(strs []string, str string) bool { for i := range strs { if strs[i] == str { return true } } return false } // containsLeft compares str == strs[i] (parameter on left). // //go:noinline func containsLeft(strs []string, str string) bool { for i := range strs { if str == strs[i] { return true } } return false } // BenchmarkStringEqParamOrder tests that the operand order of string // equality comparisons does not affect performance. See issue #74471. func BenchmarkStringEqParamOrder(b *testing.B) { strs := []string{ "12312312", "abcsdsfw", "abcdefgh", "qereqwre", "gwertdsg", "hellowod", "iamgroot", "theiswer", "dg323sdf", "gadsewwe", "g42dg4t3", "4hre2323", "23eg4325", "13234234", "32dfgsdg", "23fgre34", "43rerrer", "hh2s2443", "hhwesded", "1swdf23d", "gwcdrwer", "bfgwertd", "badgwe3g", "lhoejyop", } target := fmt.Sprintf("%s", "notfound") b.Run("ParamRight", func(b *testing.B) { for b.Loop() { globbool = containsRight(strs, target) } }) b.Run("ParamLeft", func(b *testing.B) { for b.Loop() { globbool = containsLeft(strs, target) } }) }