blob: 1d74d39a49fe780280ad194d018d5c56bbddd717 [file] [edit]
// 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)
}
})
}