| // 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 | |
| } | |
| //go:noinline | |
| func benchSpillReloadSink() {} | |
| // benchSpillReloadDistinctAutos loads two values from independent pointers, | |
| // spills both across a call, and returns them as a pair. The spills and | |
| // reloads do not exist when the SSA pair pass runs (regalloc inserts them | |
| // later), so only the late pair pass in cmd/compile/internal/arm64 can fuse | |
| // the reloads into a single LDP. | |
| // | |
| //go:noinline | |
| func benchSpillReloadDistinctAutos(p, q *int) (int, int) { | |
| a := *p | |
| b := *q | |
| benchSpillReloadSink() | |
| return a, b | |
| } | |
| // BenchmarkSpillReloadPair exercises the spill/reload pattern the late | |
| // arm64 pair pass fuses but the SSA pair pass cannot. The numbers are not | |
| // meaningful in absolute terms; the benchmark exists so builds with and | |
| // without the pass can be compared. | |
| func BenchmarkSpillReloadPair(b *testing.B) { | |
| x, y := 1, 2 | |
| var s int | |
| for b.Loop() { | |
| a, c := benchSpillReloadDistinctAutos(&x, &y) | |
| s += a + c | |
| } | |
| globl = int64(s) | |
| } | |
| // 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) | |
| } | |
| }) | |
| } |