211 lines
4.1 KiB
Go
211 lines
4.1 KiB
Go
|
package inf
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"math/big"
|
||
|
"math/rand"
|
||
|
"sync"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
const maxcap = 1024 * 1024
|
||
|
const bits = 256
|
||
|
const maxscale = 32
|
||
|
|
||
|
var once sync.Once
|
||
|
|
||
|
var decInput [][2]Dec
|
||
|
var intInput [][2]big.Int
|
||
|
|
||
|
var initBench = func() {
|
||
|
decInput = make([][2]Dec, maxcap)
|
||
|
intInput = make([][2]big.Int, maxcap)
|
||
|
max := new(big.Int).Lsh(big.NewInt(1), bits)
|
||
|
r := rand.New(rand.NewSource(0))
|
||
|
for i := 0; i < cap(decInput); i++ {
|
||
|
decInput[i][0].SetUnscaledBig(new(big.Int).Rand(r, max)).
|
||
|
SetScale(Scale(r.Int31n(int32(2*maxscale-1)) - int32(maxscale)))
|
||
|
decInput[i][1].SetUnscaledBig(new(big.Int).Rand(r, max)).
|
||
|
SetScale(Scale(r.Int31n(int32(2*maxscale-1)) - int32(maxscale)))
|
||
|
}
|
||
|
for i := 0; i < cap(intInput); i++ {
|
||
|
intInput[i][0].Rand(r, max)
|
||
|
intInput[i][1].Rand(r, max)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func doBenchmarkDec1(b *testing.B, f func(z *Dec)) {
|
||
|
once.Do(initBench)
|
||
|
b.ResetTimer()
|
||
|
b.StartTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
f(&decInput[i%maxcap][0])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func doBenchmarkDec2(b *testing.B, f func(x, y *Dec)) {
|
||
|
once.Do(initBench)
|
||
|
b.ResetTimer()
|
||
|
b.StartTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
f(&decInput[i%maxcap][0], &decInput[i%maxcap][1])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func doBenchmarkInt1(b *testing.B, f func(z *big.Int)) {
|
||
|
once.Do(initBench)
|
||
|
b.ResetTimer()
|
||
|
b.StartTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
f(&intInput[i%maxcap][0])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func doBenchmarkInt2(b *testing.B, f func(x, y *big.Int)) {
|
||
|
once.Do(initBench)
|
||
|
b.ResetTimer()
|
||
|
b.StartTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
f(&intInput[i%maxcap][0], &intInput[i%maxcap][1])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_String(b *testing.B) {
|
||
|
doBenchmarkDec1(b, func(x *Dec) {
|
||
|
x.String()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_StringScan(b *testing.B) {
|
||
|
doBenchmarkDec1(b, func(x *Dec) {
|
||
|
s := x.String()
|
||
|
d := new(Dec)
|
||
|
fmt.Sscan(s, d)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_GobEncode(b *testing.B) {
|
||
|
doBenchmarkDec1(b, func(x *Dec) {
|
||
|
x.GobEncode()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_GobEnDecode(b *testing.B) {
|
||
|
doBenchmarkDec1(b, func(x *Dec) {
|
||
|
g, _ := x.GobEncode()
|
||
|
new(Dec).GobDecode(g)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_Add(b *testing.B) {
|
||
|
doBenchmarkDec2(b, func(x, y *Dec) {
|
||
|
ys := y.Scale()
|
||
|
y.SetScale(x.Scale())
|
||
|
_ = new(Dec).Add(x, y)
|
||
|
y.SetScale(ys)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_AddMixed(b *testing.B) {
|
||
|
doBenchmarkDec2(b, func(x, y *Dec) {
|
||
|
_ = new(Dec).Add(x, y)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_Sub(b *testing.B) {
|
||
|
doBenchmarkDec2(b, func(x, y *Dec) {
|
||
|
ys := y.Scale()
|
||
|
y.SetScale(x.Scale())
|
||
|
_ = new(Dec).Sub(x, y)
|
||
|
y.SetScale(ys)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_SubMixed(b *testing.B) {
|
||
|
doBenchmarkDec2(b, func(x, y *Dec) {
|
||
|
_ = new(Dec).Sub(x, y)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_Mul(b *testing.B) {
|
||
|
doBenchmarkDec2(b, func(x, y *Dec) {
|
||
|
_ = new(Dec).Mul(x, y)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_Mul_QuoExact(b *testing.B) {
|
||
|
doBenchmarkDec2(b, func(x, y *Dec) {
|
||
|
v := new(Dec).Mul(x, y)
|
||
|
_ = new(Dec).QuoExact(v, y)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_QuoRound_Fixed_Down(b *testing.B) {
|
||
|
doBenchmarkDec2(b, func(x, y *Dec) {
|
||
|
_ = new(Dec).QuoRound(x, y, 0, RoundDown)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Dec_QuoRound_Fixed_HalfUp(b *testing.B) {
|
||
|
doBenchmarkDec2(b, func(x, y *Dec) {
|
||
|
_ = new(Dec).QuoRound(x, y, 0, RoundHalfUp)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_String(b *testing.B) {
|
||
|
doBenchmarkInt1(b, func(x *big.Int) {
|
||
|
x.String()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_StringScan(b *testing.B) {
|
||
|
doBenchmarkInt1(b, func(x *big.Int) {
|
||
|
s := x.String()
|
||
|
d := new(big.Int)
|
||
|
fmt.Sscan(s, d)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_GobEncode(b *testing.B) {
|
||
|
doBenchmarkInt1(b, func(x *big.Int) {
|
||
|
x.GobEncode()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_GobEnDecode(b *testing.B) {
|
||
|
doBenchmarkInt1(b, func(x *big.Int) {
|
||
|
g, _ := x.GobEncode()
|
||
|
new(big.Int).GobDecode(g)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_Add(b *testing.B) {
|
||
|
doBenchmarkInt2(b, func(x, y *big.Int) {
|
||
|
_ = new(big.Int).Add(x, y)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_Sub(b *testing.B) {
|
||
|
doBenchmarkInt2(b, func(x, y *big.Int) {
|
||
|
_ = new(big.Int).Sub(x, y)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_Mul(b *testing.B) {
|
||
|
doBenchmarkInt2(b, func(x, y *big.Int) {
|
||
|
_ = new(big.Int).Mul(x, y)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_Quo(b *testing.B) {
|
||
|
doBenchmarkInt2(b, func(x, y *big.Int) {
|
||
|
_ = new(big.Int).Quo(x, y)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func Benchmark_Int_QuoRem(b *testing.B) {
|
||
|
doBenchmarkInt2(b, func(x, y *big.Int) {
|
||
|
_, _ = new(big.Int).QuoRem(x, y, new(big.Int))
|
||
|
})
|
||
|
}
|