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