diff --git a/x/evm/keeper/benchmark_test.go b/x/evm/keeper/benchmark_test.go index df366cd8..382cbfe8 100644 --- a/x/evm/keeper/benchmark_test.go +++ b/x/evm/keeper/benchmark_test.go @@ -12,6 +12,7 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" ethermint "github.com/tharsis/ethermint/types" + "github.com/tharsis/ethermint/x/evm/keeper" "github.com/tharsis/ethermint/x/evm/types" ) @@ -95,3 +96,40 @@ func BenchmarkTokenMint(b *testing.B) { return types.NewTx(suite.app.EvmKeeper.ChainID(), nonce, &contract, big.NewInt(0), 410000, big.NewInt(1), nil, nil, input, nil) }) } + +func DoBenchmarkDeepContextStack(b *testing.B, depth int) { + begin := []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + end := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + + suite := KeeperTestSuite{} + suite.DoSetupTest(b) + + transientKey := suite.app.GetTKey(types.TransientKey) + + var stack keeper.ContextStack + stack.Reset(suite.ctx) + + for i := 0; i < depth; i++ { + stack.Snapshot() + + store := stack.CurrentContext().TransientStore(transientKey) + store.Set(begin, []byte("value")) + } + + store := stack.CurrentContext().TransientStore(transientKey) + for i := 0; i < b.N; i++ { + store.Iterator(begin, end) + } +} + +func BenchmarkDeepContextStack1(b *testing.B) { + DoBenchmarkDeepContextStack(b, 1) +} + +func BenchmarkDeepContextStack10(b *testing.B) { + DoBenchmarkDeepContextStack(b, 10) +} + +func BenchmarkDeepContextStack13(b *testing.B) { + DoBenchmarkDeepContextStack(b, 13) +} diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index d331f20e..07db5a53 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -199,6 +199,8 @@ func (k *Keeper) ApplyTransaction(tx *ethtypes.Transaction) (*types.MsgEthereumT } // flatten the cache contexts to improve efficiency of following db operations + // the reason is some operations under deep context stack is extremely slow, + // refer to `benchmark_test.go:BenchmarkDeepContextStack13`. k.ctxStack.CommitToRevision(revision) k.IncreaseTxIndexTransient()