| // 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 | |
| }) | |
| } |