| // 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 "testing" |
| |
| // Benchmark multiplication of an integer by various constants. |
| // |
| // The comment above each sub-benchmark provides an example of how the |
| // target multiplication operation might be implemented using shift |
| // (multiplication by a power of 2), addition and subtraction |
| // operations. It is platform-dependent whether these transformations |
| // are actually applied. |
| |
| var ( |
| mulSinkI32 int32 |
| mulSinkI64 int64 |
| mulSinkU32 uint32 |
| mulSinkU64 uint64 |
| ) |
| |
| func BenchmarkMulconstI32(b *testing.B) { |
| // 3x = 2x + x |
| b.Run("3", func(b *testing.B) { |
| x := int32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 3 |
| } |
| mulSinkI32 = x |
| }) |
| // 5x = 4x + x |
| b.Run("5", func(b *testing.B) { |
| x := int32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 5 |
| } |
| mulSinkI32 = x |
| }) |
| // 12x = 8x + 4x |
| b.Run("12", func(b *testing.B) { |
| x := int32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 12 |
| } |
| mulSinkI32 = x |
| }) |
| // 120x = 128x - 8x |
| b.Run("120", func(b *testing.B) { |
| x := int32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 120 |
| } |
| mulSinkI32 = x |
| }) |
| // -120x = 8x - 120x |
| b.Run("-120", func(b *testing.B) { |
| x := int32(1) |
| for i := 0; i < b.N; i++ { |
| x *= -120 |
| } |
| mulSinkI32 = x |
| }) |
| // 65537x = 65536x + x |
| b.Run("65537", func(b *testing.B) { |
| x := int32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 65537 |
| } |
| mulSinkI32 = x |
| }) |
| // 65538x = 65536x + 2x |
| b.Run("65538", func(b *testing.B) { |
| x := int32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 65538 |
| } |
| mulSinkI32 = x |
| }) |
| } |
| |
| func BenchmarkMulconstI64(b *testing.B) { |
| // 3x = 2x + x |
| b.Run("3", func(b *testing.B) { |
| x := int64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 3 |
| } |
| mulSinkI64 = x |
| }) |
| // 5x = 4x + x |
| b.Run("5", func(b *testing.B) { |
| x := int64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 5 |
| } |
| mulSinkI64 = x |
| }) |
| // 12x = 8x + 4x |
| b.Run("12", func(b *testing.B) { |
| x := int64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 12 |
| } |
| mulSinkI64 = x |
| }) |
| // 120x = 128x - 8x |
| b.Run("120", func(b *testing.B) { |
| x := int64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 120 |
| } |
| mulSinkI64 = x |
| }) |
| // -120x = 8x - 120x |
| b.Run("-120", func(b *testing.B) { |
| x := int64(1) |
| for i := 0; i < b.N; i++ { |
| x *= -120 |
| } |
| mulSinkI64 = x |
| }) |
| // 65537x = 65536x + x |
| b.Run("65537", func(b *testing.B) { |
| x := int64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 65537 |
| } |
| mulSinkI64 = x |
| }) |
| // 65538x = 65536x + 2x |
| b.Run("65538", func(b *testing.B) { |
| x := int64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 65538 |
| } |
| mulSinkI64 = x |
| }) |
| } |
| |
| func BenchmarkMulconstU32(b *testing.B) { |
| // 3x = 2x + x |
| b.Run("3", func(b *testing.B) { |
| x := uint32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 3 |
| } |
| mulSinkU32 = x |
| }) |
| // 5x = 4x + x |
| b.Run("5", func(b *testing.B) { |
| x := uint32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 5 |
| } |
| mulSinkU32 = x |
| }) |
| // 12x = 8x + 4x |
| b.Run("12", func(b *testing.B) { |
| x := uint32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 12 |
| } |
| mulSinkU32 = x |
| }) |
| // 120x = 128x - 8x |
| b.Run("120", func(b *testing.B) { |
| x := uint32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 120 |
| } |
| mulSinkU32 = x |
| }) |
| // 65537x = 65536x + x |
| b.Run("65537", func(b *testing.B) { |
| x := uint32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 65537 |
| } |
| mulSinkU32 = x |
| }) |
| // 65538x = 65536x + 2x |
| b.Run("65538", func(b *testing.B) { |
| x := uint32(1) |
| for i := 0; i < b.N; i++ { |
| x *= 65538 |
| } |
| mulSinkU32 = x |
| }) |
| } |
| |
| func BenchmarkMulconstU64(b *testing.B) { |
| // 3x = 2x + x |
| b.Run("3", func(b *testing.B) { |
| x := uint64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 3 |
| } |
| mulSinkU64 = x |
| }) |
| // 5x = 4x + x |
| b.Run("5", func(b *testing.B) { |
| x := uint64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 5 |
| } |
| mulSinkU64 = x |
| }) |
| // 12x = 8x + 4x |
| b.Run("12", func(b *testing.B) { |
| x := uint64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 12 |
| } |
| mulSinkU64 = x |
| }) |
| // 120x = 128x - 8x |
| b.Run("120", func(b *testing.B) { |
| x := uint64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 120 |
| } |
| mulSinkU64 = x |
| }) |
| // 65537x = 65536x + x |
| b.Run("65537", func(b *testing.B) { |
| x := uint64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 65537 |
| } |
| mulSinkU64 = x |
| }) |
| // 65538x = 65536x + 2x |
| b.Run("65538", func(b *testing.B) { |
| x := uint64(1) |
| for i := 0; i < b.N; i++ { |
| x *= 65538 |
| } |
| mulSinkU64 = x |
| }) |
| } |