From a04ee709a55d2ee9d8173b12f7abacbc37e66601 Mon Sep 17 00:00:00 2001 From: kyrie-yl Date: Wed, 20 Oct 2021 14:34:57 +0800 Subject: [PATCH] add metrics for contract code bitmap cache Signed-off-by: kyrie-yl --- core/vm/contract.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/vm/contract.go b/core/vm/contract.go index 6fac7f98584d..dfc3ecd73f8a 100644 --- a/core/vm/contract.go +++ b/core/vm/contract.go @@ -22,12 +22,18 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/metrics" "github.com/holiman/uint256" ) const codeBitmapCacheSize = 2000 -var codeBitmapCache, _ = lru.New(codeBitmapCacheSize) +var ( + codeBitmapCache, _ = lru.New(codeBitmapCacheSize) + + contractCodeBitmapHitMeter = metrics.NewRegisteredMeter("vm/contract/code/bitmap/hit", nil) + contractCodeBitmapMissMeter = metrics.NewRegisteredMeter("vm/contract/code/bitmap/miss", nil) +) // ContractRef is a reference to the contract's backing object type ContractRef interface { @@ -117,12 +123,14 @@ func (c *Contract) isCode(udest uint64) bool { analysis, exist := c.jumpdests[c.CodeHash] if !exist { if cached, ok := codeBitmapCache.Get(c.CodeHash); ok { + contractCodeBitmapHitMeter.Mark(1) analysis = cached.(bitvec) } else { // Do the analysis and save in parent context // We do not need to store it in c.analysis analysis = codeBitmap(c.Code) c.jumpdests[c.CodeHash] = analysis + contractCodeBitmapMissMeter.Mark(1) codeBitmapCache.Add(c.CodeHash, analysis) } }