refactor: allocate less in types.Coins.safeAdd and types.DecCoins.safeAdd (#16477)

This commit is contained in:
Elias Naur 2023-06-09 07:46:32 -06:00 committed by GitHub
parent 9769e2404e
commit 207789f705
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 14 deletions

View File

@ -328,25 +328,25 @@ func (coins Coins) safeAdd(coinsB Coins) (coalesced Coins) {
panic("Wrong argument: coins must be sorted")
}
uniqCoins := make(map[string]Coins, len(coins)+len(coinsB))
uniqCoins := make(map[string]Coin, len(coins)+len(coinsB))
// Traverse all the coins for each of the coins and coinsB.
for _, cL := range []Coins{coins, coinsB} {
for _, c := range cL {
uniqCoins[c.Denom] = append(uniqCoins[c.Denom], c)
if uc, ok := uniqCoins[c.Denom]; ok {
uniqCoins[c.Denom] = uc.Add(c)
} else {
uniqCoins[c.Denom] = c
}
}
}
for denom, cL := range uniqCoins { //#nosec
comboCoin := Coin{Denom: denom, Amount: NewInt(0)}
for _, c := range cL {
comboCoin = comboCoin.Add(c)
coalesced = make(Coins, 0, len(uniqCoins))
for denom, c := range uniqCoins { //#nosec
if c.IsZero() {
continue
}
if !comboCoin.IsZero() {
coalesced = append(coalesced, comboCoin)
}
}
if coalesced == nil {
return Coins{}
c.Denom = denom
coalesced = append(coalesced, c)
}
return coalesced.Sort()
}

View File

@ -242,7 +242,7 @@ func (coins DecCoins) Add(coinsB ...DecCoin) DecCoins {
// denomination and addition only occurs when the denominations match, otherwise
// the coin is simply added to the sum assuming it's not zero.
func (coins DecCoins) safeAdd(coinsB DecCoins) DecCoins {
sum := ([]DecCoin)(nil)
sum := make(DecCoins, 0, len(coins)+len(coinsB))
indexA, indexB := 0, 0
lenA, lenB := len(coins), len(coinsB)

View File

@ -98,7 +98,7 @@ func (s *decCoinTestSuite) TestAddDecCoins() {
}{
{sdk.DecCoins{{testDenom1, one}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, one}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, two}, {testDenom2, two}}},
{sdk.DecCoins{{testDenom1, zero}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom2, one}}},
{sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins(nil)},
{sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{}},
}
for tcIndex, tc := range cases {