From 2abbc00bafe63b270674d70c97f06be1cbeb972b Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 19 Oct 2021 10:06:52 +0200 Subject: [PATCH] More bank/cw20 benchmarks (#651) * Add blocks of 1000 tx * Increase Block.MasGas for tests/benchmarks * Add huge initialization --- app/test_helpers.go | 5 +- benchmarks/app_test.go | 8 +- benchmarks/bench_test.go | 184 ++++++++++++++++++++++----------------- 3 files changed, 111 insertions(+), 86 deletions(-) diff --git a/app/test_helpers.go b/app/test_helpers.go index 3fafc811..54c89661 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -5,11 +5,12 @@ import ( "encoding/hex" "encoding/json" "fmt" - "github.com/CosmWasm/wasmd/x/wasm" "strconv" "testing" "time" + "github.com/CosmWasm/wasmd/x/wasm" + "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" @@ -36,7 +37,7 @@ import ( var DefaultConsensusParams = &abci.ConsensusParams{ Block: &abci.BlockParams{ MaxBytes: 8000000, - MaxGas: 80000000, + MaxGas: 1234000000, }, Evidence: &tmproto.EvidenceParams{ MaxAgeNumBlocks: 302400, diff --git a/benchmarks/app_test.go b/benchmarks/app_test.go index eb90a089..93892f57 100644 --- a/benchmarks/app_test.go +++ b/benchmarks/app_test.go @@ -140,13 +140,13 @@ func InitializeWasmApp(b testing.TB, db dbm.DB, numAccounts int) AppInfo { } initialBalances[i] = balance{ Address: acct, - Amount: 1000000000, + Amount: 1000000000, } } init := cw20InitMsg{ - Name: "Cash Money", - Symbol: "CASH", - Decimals: 2, + Name: "Cash Money", + Symbol: "CASH", + Decimals: 2, InitialBalances: initialBalances, } initBz, err := json.Marshal(init) diff --git a/benchmarks/bench_test.go b/benchmarks/bench_test.go index ecbab75c..b8200d6e 100644 --- a/benchmarks/bench_test.go +++ b/benchmarks/bench_test.go @@ -19,6 +19,110 @@ import ( wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" ) +func BenchmarkTxSending(b *testing.B) { + cases := map[string]struct { + db func(*testing.B) dbm.DB + txBuilder func(*testing.B, *AppInfo) []sdk.Tx + blockSize int + numAccounts int + }{ + "basic send - memdb": { + db: buildMemDB, + blockSize: 20, + txBuilder: buildTxFromMsg(bankSendMsg), + numAccounts: 50, + }, + "cw20 transfer - memdb": { + db: buildMemDB, + blockSize: 20, + txBuilder: buildTxFromMsg(cw20TransferMsg), + numAccounts: 50, + }, + "basic send - leveldb": { + db: buildLevelDB, + blockSize: 20, + txBuilder: buildTxFromMsg(bankSendMsg), + numAccounts: 50, + }, + "cw20 transfer - leveldb": { + db: buildLevelDB, + blockSize: 20, + txBuilder: buildTxFromMsg(cw20TransferMsg), + numAccounts: 50, + }, + "basic send - leveldb - 8k accounts": { + db: buildLevelDB, + blockSize: 20, + txBuilder: buildTxFromMsg(bankSendMsg), + numAccounts: 8000, + }, + "cw20 transfer - leveldb - 8k accounts": { + db: buildLevelDB, + blockSize: 20, + txBuilder: buildTxFromMsg(cw20TransferMsg), + numAccounts: 8000, + }, + "basic send - leveldb - 8k accounts - huge blocks": { + db: buildLevelDB, + blockSize: 1000, + txBuilder: buildTxFromMsg(bankSendMsg), + numAccounts: 8000, + }, + "cw20 transfer - leveldb - 8k accounts - huge blocks": { + db: buildLevelDB, + blockSize: 1000, + txBuilder: buildTxFromMsg(cw20TransferMsg), + numAccounts: 8000, + }, + "basic send - leveldb - 80k accounts": { + db: buildLevelDB, + blockSize: 20, + txBuilder: buildTxFromMsg(bankSendMsg), + numAccounts: 80000, + }, + "cw20 transfer - leveldb - 80k accounts": { + db: buildLevelDB, + blockSize: 20, + txBuilder: buildTxFromMsg(cw20TransferMsg), + numAccounts: 80000, + }, + } + + for name, tc := range cases { + b.Run(name, func(b *testing.B) { + db := tc.db(b) + appInfo := InitializeWasmApp(b, db, tc.numAccounts) + txs := tc.txBuilder(b, &appInfo) + + // number of Tx per block for the benchmarks + blockSize := tc.blockSize + height := int64(3) + txEncoder := appInfo.TxConfig.TxEncoder() + + b.ResetTimer() + + for i := 0; i < b.N/blockSize; i++ { + appInfo.App.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height, Time: time.Now()}}) + + for j := 0; j < blockSize; j++ { + idx := i*blockSize + j + + _, _, err := appInfo.App.Check(txEncoder, txs[idx]) + if err != nil { + panic("something is broken in checking transaction") + } + _, _, err = appInfo.App.Deliver(txEncoder, txs[idx]) + require.NoError(b, err) + } + + appInfo.App.EndBlock(abci.RequestEndBlock{Height: height}) + appInfo.App.Commit() + height++ + } + }) + } +} + func bankSendMsg(info *AppInfo) ([]sdk.Msg, error) { // Precompute all txs rcpt := sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address()) @@ -61,83 +165,3 @@ func buildLevelDB(b *testing.B) dbm.DB { require.NoError(b, err) return levelDB } - -func BenchmarkTxSending(b *testing.B) { - cases := map[string]struct { - db func(*testing.B) dbm.DB - txBuilder func(*testing.B, *AppInfo) []sdk.Tx - blockSize int - numAccounts int - }{ - "basic send - memdb": { - db: buildMemDB, - blockSize: 20, - txBuilder: buildTxFromMsg(bankSendMsg), - numAccounts: 50, - }, - "cw20 transfer - memdb": { - db: buildMemDB, - blockSize: 20, - txBuilder: buildTxFromMsg(cw20TransferMsg), - numAccounts: 50, - }, - "basic send - leveldb": { - db: buildLevelDB, - blockSize: 20, - txBuilder: buildTxFromMsg(bankSendMsg), - numAccounts: 50, - }, - "cw20 transfer - leveldb": { - db: buildLevelDB, - blockSize: 20, - txBuilder: buildTxFromMsg(cw20TransferMsg), - numAccounts: 50, - }, - "basic send - leveldb - 8k accounts": { - db: buildLevelDB, - blockSize: 20, - txBuilder: buildTxFromMsg(bankSendMsg), - numAccounts: 8000, - }, - "cw20 transfer - leveldb - 8k accounts": { - db: buildLevelDB, - blockSize: 20, - txBuilder: buildTxFromMsg(cw20TransferMsg), - numAccounts: 8000, - }, - } - - for name, tc := range cases { - b.Run(name, func(b *testing.B) { - db := tc.db(b) - appInfo := InitializeWasmApp(b, db, tc.numAccounts) - txs := tc.txBuilder(b, &appInfo) - - // number of Tx per block for the benchmarks - blockSize := tc.blockSize - height := int64(3) - txEncoder := appInfo.TxConfig.TxEncoder() - - b.ResetTimer() - - for i := 0; i < b.N/blockSize; i++ { - appInfo.App.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height, Time: time.Now()}}) - - for j := 0; j < blockSize; j++ { - idx := i*blockSize + j - - _, _, err := appInfo.App.Check(txEncoder, txs[idx]) - if err != nil { - panic("something is broken in checking transaction") - } - _, _, err = appInfo.App.Deliver(txEncoder, txs[idx]) - require.NoError(b, err) - } - - appInfo.App.EndBlock(abci.RequestEndBlock{Height: height}) - appInfo.App.Commit() - height++ - } - }) - } -}