Go to file
Emmanuel T Odeke dbb9923917
store/cachekv, x/bank/types: algorithmically fix pathologically slow code (#8719)
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>
2021-02-27 07:26:22 -08:00
.github docker m1 (#8710) 2021-02-26 11:25:48 +00:00
baseapp Make gRPC requests go through tendermint Query (#8549) 2021-02-15 10:01:44 +00:00
client Fix legacy rest api (#8434) 2021-02-26 08:28:48 +00:00
codec codec/types: avoid unnecessary allocations for NewAnyWithCustomTypeURL on error (#8605) 2021-02-17 10:13:00 +00:00
contrib Refactor store keys for variable-length addresses (#8363) 2021-02-01 13:17:44 +00:00
cosmovisor cosmovisor: ln -s docs/run-node/cosmovisor.md cosmovisor/README.md (#8526) 2021-02-05 15:17:52 +00:00
crypto update ed25519 (#8690) 2021-02-26 10:09:05 +00:00
docs ADR-019/020 cleanups: HybridCodec, Pubkey (#8683) 2021-02-25 15:40:04 +00:00
proto bank: name and symbol metadata fields (#8677) 2021-02-24 20:06:04 -03:00
scripts scripts: indent multiline commands (#8706) 2021-02-25 20:57:41 +00:00
server keyring: remove hardcoded default passphrase on NewMnemonic (#8662) 2021-02-23 16:49:09 +00:00
simapp x{stake,slash,gov,distrib} In-place Store Migrations (#8504) 2021-02-25 10:43:31 +00:00
snapshots snapshots: document use of ioutil.TempDir() (#8508) 2021-02-04 09:54:01 +00:00
std Add ADR 031 BaseApp and codec infrastructure (#7519) 2020-10-15 13:07:59 +00:00
store store/cachekv, x/bank/types: algorithmically fix pathologically slow code (#8719) 2021-02-27 07:26:22 -08:00
telemetry Minor Code Cleanup - gRPC queries (#6862) 2020-07-28 12:53:35 +00:00
tests Add in-place store migrations (#8485) 2021-02-10 17:49:31 +00:00
testutil Bump tendermint to v0.34.7 (#8616) 2021-02-18 08:33:56 +00:00
third_party/proto gRPC-gateway routes as alternative to legacy tendermint REST endpoints (#7965) 2020-11-25 15:58:11 +00:00
types types: intern AccAddress.String() to gut wasted expensive recomputations (#8694) 2021-02-25 03:01:03 -08:00
version version --long displays replaced build dependencies (#7941) 2020-11-16 10:00:34 +00:00
x store/cachekv, x/bank/types: algorithmically fix pathologically slow code (#8719) 2021-02-27 07:26:22 -08:00
.build.sh fix library file path (#8301) 2021-01-12 10:08:42 +00:00
.clang-format Fix clang-format to specific version (#7350) 2020-10-27 10:04:34 +00:00
.codecov.yml CI: Fix codecov flag project config (#7994) 2020-11-20 09:13:25 -05:00
.dockerignore Add basic Dockerfile to build all binaries and export gaiad 2018-04-10 12:39:47 +02:00
.gitattributes Merge PR #6426: Migrate API Server 2020-06-15 13:39:09 -04:00
.gitignore All Makefile proto commands use Docker (#7931) 2020-11-13 16:36:58 +00:00
.golangci.yml linter: enable nolintlint (#6162) 2020-05-08 08:46:12 +00:00
.goreleaser.yml ci: automate release post tag push (#6230) 2020-05-25 20:02:08 +02:00
.mergify.yml add mergify config for automated launchpad backports (#8667) 2021-02-24 07:22:19 +00:00
buf.yaml fix proto generation (#8361) 2021-01-18 12:41:34 -03:00
CHANGELOG.md store/cachekv, x/bank/types: algorithmically fix pathologically slow code (#8719) 2021-02-27 07:26:22 -08:00
CODE_OF_CONDUCT.md Update CODE_OF_CONDUCT.md (#7381) 2020-09-28 11:28:30 +02:00
CONTRIBUTING.md Update CONTRIBUTING.md Point Release Procedure (#7999) 2020-12-11 01:50:07 +00:00
docker-compose.yml buildsystem: simplify Makefile and ci automation (#7189) 2020-08-31 15:39:05 +02:00
Dockerfile Makefile: simplify and clean-up (#7453) 2020-10-05 10:22:18 +02:00
go.mod update ed25519 (#8690) 2021-02-26 10:09:05 +00:00
go.sum update ed25519 (#8690) 2021-02-26 10:09:05 +00:00
LICENSE Add README.md to Basecoin; Update licenses 2018-01-28 18:17:19 -08:00
Makefile add tm version to makefile (#8689) 2021-02-24 19:43:12 +00:00
README.md update readme to link starport instead of scaffold (#7613) 2020-10-21 08:08:20 +00:00
SECURITY.md update SECURITY.md (#6263) 2020-05-21 11:12:51 +02:00
STABLE_RELEASES.md Stable Releases: Definition and Process (#6394) 2020-07-14 10:28:53 +02:00

Cosmos SDK

banner

The Cosmos-SDK is a framework for building blockchain applications in Golang. It is being used to build Gaia, the first implementation of the Cosmos Hub.

WARNING: The SDK has mostly stabilized, but we are still making some breaking changes.

Note: Requires Go 1.15+

Quick Start

To learn how the SDK works from a high-level perspective, go to the SDK Intro.

If you want to get started quickly and learn how to build on top of the SDK, please follow the SDK Application Tutorial. You can also fork the tutorial's repository to get started building your own Cosmos SDK application.

For more, please go to the Cosmos SDK Docs.

Cosmos Hub Mainnet

The Cosmos Hub application, gaia, has moved to its own repository. Go there to join the Cosmos Hub mainnet and more.

Starport

If you are starting a new app or a new module you can use Starport to help you get started and speed up development. If you have any questions or find a bug, feel free to open an issue in the repo.

Disambiguation

This Cosmos-SDK project is not related to the React-Cosmos project (yet). Many thanks to Evan Coury and Ovidiu (@skidding) for this Github organization name. As per our agreement, this disambiguation notice will stay here.