mirror of
https://github.com/shopspring/decimal.git
synced 2024-11-23 04:40:49 +01:00
Add a fast track to d.Cmp(d2) when d.exp == d2.exp
This makes a noticeable difference when one is sorting a large slice of decimals when most of them have the same precision, as it is saving a lot of calls to rescale().
This commit is contained in:
parent
9995dc92ee
commit
cb949cead4
2 changed files with 24 additions and 0 deletions
|
@ -294,6 +294,13 @@ func (d Decimal) Div(d2 Decimal) Decimal {
|
||||||
// +1 if d > d2
|
// +1 if d > d2
|
||||||
//
|
//
|
||||||
func (d Decimal) Cmp(d2 Decimal) int {
|
func (d Decimal) Cmp(d2 Decimal) int {
|
||||||
|
d.ensureInitialized()
|
||||||
|
d2.ensureInitialized()
|
||||||
|
|
||||||
|
if d.exp == d2.exp {
|
||||||
|
return d.value.Cmp(d2.value)
|
||||||
|
}
|
||||||
|
|
||||||
baseExp := min(d.exp, d2.exp)
|
baseExp := min(d.exp, d2.exp)
|
||||||
rd := d.rescale(baseExp)
|
rd := d.rescale(baseExp)
|
||||||
rd2 := d2.rescale(baseExp)
|
rd2 := d2.rescale(baseExp)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"math"
|
"math"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -895,3 +896,19 @@ func didPanic(f func()) bool {
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DecimalSlice []Decimal
|
||||||
|
|
||||||
|
func (p DecimalSlice) Len() int { return len(p) }
|
||||||
|
func (p DecimalSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
||||||
|
func (p DecimalSlice) Less(i, j int) bool { return p[i].Cmp(p[j]) < 0 }
|
||||||
|
func Benchmark_Cmp(b *testing.B) {
|
||||||
|
decimals := DecimalSlice([]Decimal{})
|
||||||
|
for i := 0; i < 1000000; i++ {
|
||||||
|
decimals = append(decimals, New(int64(i), 0))
|
||||||
|
}
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
sort.Sort(decimals)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue