From 6764ef2f6cf16bcf2e91766afc5d911ed3ea7e2e Mon Sep 17 00:00:00 2001 From: bianyuanop Date: Fri, 19 Jan 2024 17:05:46 -0500 Subject: [PATCH] preallocate memory for merkle array and consumebytes flag --- chain/block.go | 5 +++-- hypersdk.code-workspace | 8 ++++++++ utils/utils.go | 6 +++--- 3 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 hypersdk.code-workspace diff --git a/chain/block.go b/chain/block.go index 2a10ae17bb..beaf74ce10 100644 --- a/chain/block.go +++ b/chain/block.go @@ -293,7 +293,7 @@ func (b *StatelessBlock) initializeBuilt( } // transaction hash generation - var merkleItems [][]byte + merkleItems := make([][]byte, 0, len(b.Txs)+len(b.results)) for _, tx := range b.Txs { merkleItems = append(merkleItems, tx.Bytes()) } @@ -301,7 +301,8 @@ func (b *StatelessBlock) initializeBuilt( merkleItems = append(merkleItems, result.Output) } - root, _, err := utils.GenerateMerkleRoot(ctx, b.vm.Tracer(), merkleItems) + // consume bytes to avoid extra copying + root, _, err := utils.GenerateMerkleRoot(ctx, b.vm.Tracer(), merkleItems, true) if err != nil { return err } diff --git a/hypersdk.code-workspace b/hypersdk.code-workspace new file mode 100644 index 0000000000..876a1499c0 --- /dev/null +++ b/hypersdk.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/utils/utils.go b/utils/utils.go index 86384e1034..fac2f0bacc 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -125,8 +125,8 @@ func LoadBytes(filename string, expectedSize int) ([]byte, error) { // Generate merkle root for a set of items // this function does not take ownership of given bytes array -func GenerateMerkleRoot(ctx context.Context, tracer trace.Tracer, merkleItems [][]byte) ([]byte, merkledb.MerkleDB, error) { - var batchOps []database.BatchOp +func GenerateMerkleRoot(ctx context.Context, tracer trace.Tracer, merkleItems [][]byte, consumeBytes bool) ([]byte, merkledb.MerkleDB, error) { + batchOps := make([]database.BatchOp, 0, len(merkleItems)) for _, item := range merkleItems { key := ToID(item) @@ -148,7 +148,7 @@ func GenerateMerkleRoot(ctx context.Context, tracer trace.Tracer, merkleItems [] return nil, nil, err } - view, err := db.NewView(ctx, merkledb.ViewChanges{BatchOps: batchOps}) + view, err := db.NewView(ctx, merkledb.ViewChanges{BatchOps: batchOps, ConsumeBytes: consumeBytes}) if err != nil { return nil, nil, err }