The speed is the same as old implementation, but the new one uses slightly
less memory and make the code easier to maintain.
name old time/op new time/op delta
SanitizeBalances500-8 933µs ± 1% 935µs ± 1% ~ (p=0.400 n=9+10)
SanitizeBalances1000-8 1.91ms ± 0% 1.92ms ± 0% +0.58% (p=0.000 n=10+10)
name old alloc/op new alloc/op delta
SanitizeBalances500-8 588kB ± 0% 556kB ± 0% -5.41% (p=0.000 n=9+9)
SanitizeBalances1000-8 1.18MB ± 0% 1.12MB ± 0% -5.37% (p=0.000 n=9+9)
name old allocs/op new allocs/op delta
SanitizeBalances500-8 5.02k ± 0% 4.02k ± 0% -19.94% (p=0.000 n=10+10)
SanitizeBalances1000-8 10.0k ± 0% 8.0k ± 0% -19.93% (p=0.000 n=9+10)
Fixes#9259
After continuously profiling InitGensis with 100K accounts, it showed
pathologically slow code, that was the result of a couple of patterns:
* Unconditional and not always necessary map lookups
* O(n^2) sdk.AccAddressFromBech32 retrievals when the code is expensive,
during a quicksort
The remedy involved 4 parts:
* O(n) sdk.AccAddressFromBech32 invocations, down from O(n^2) in the quicksort
* Only doing map lookups when the domain key check has passed
* Using a black magic compiler technique of the map clearing idiom
* Zero allocation []byte<->string conversion
With 100K accounts, this brings InitGenesis down to ~6min, instead of
20+min, it reduces the sort code from ~7sec down to 50ms.
Also some simple benchmark reflect the change:
```shell
name old time/op new time/op delta
SanitizeBalances500-8 19.3ms ±10% 1.5ms ± 5% -92.46% (p=0.000 n=20+20)
SanitizeBalances1000-8 41.9ms ± 8% 3.0ms ±12% -92.92% (p=0.000 n=20+20)
name old alloc/op new alloc/op delta
SanitizeBalances500-8 9.05MB ± 6% 0.56MB ± 0% -93.76% (p=0.000 n=20+18)
SanitizeBalances1000-8 20.2MB ± 3% 1.1MB ± 0% -94.37% (p=0.000 n=20+19)
name old allocs/op new allocs/op delta
SanitizeBalances500-8 72.4k ± 6% 4.5k ± 0% -93.76% (p=0.000 n=20+20)
SanitizeBalances1000-8 162k ± 3% 9k ± 0% -94.40% (p=0.000 n=20+20)
```
The CPU profiles show the radical change as per
https://github.com/cosmos/cosmos-sdk/issues/7766#issuecomment-786671734
Later on, we shall do more profiling and fixes but for now this brings
down the run-time for InitGenesis.
Fixes#7766
Co-authored-by: Alessio Treglia <alessio@tendermint.com>