From 43d1f5a4996215c591fc6326d4ecd5312800252b Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 28 Nov 2023 11:56:35 +0100 Subject: [PATCH] perf: remove redundant collect (#5600) --- .../src/providers/database/provider.rs | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index da31f50d83..b6e436a972 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -2201,21 +2201,27 @@ impl BlockWriter for DatabaseProvider { let tx_count = block.body.len() as u64; - let senders_len = senders.as_ref().map(|s| s.len()); - let tx_iter = if Some(block.body.len()) == senders_len { - block.body.into_iter().zip(senders.unwrap()).collect::>() - } else { - let senders = TransactionSigned::recover_signers(&block.body, block.body.len()) - .ok_or(ProviderError::SenderRecoveryError)?; - durations_recorder.record_relative(metrics::Action::RecoverSigners); - debug_assert_eq!(senders.len(), block.body.len(), "missing one or more senders"); - block.body.into_iter().zip(senders).collect() + // Ensures we have all the senders for the block's transactions. + let senders = match senders { + Some(senders) if block.body.len() == senders.len() => { + // senders have the correct length as transactions in the block + senders + } + _ => { + // recover senders from transactions + let senders = TransactionSigned::recover_signers(&block.body, block.body.len()) + .ok_or(ProviderError::SenderRecoveryError)?; + durations_recorder.record_relative(metrics::Action::RecoverSigners); + debug_assert_eq!(senders.len(), block.body.len(), "missing one or more senders"); + senders + } }; let mut tx_senders_elapsed = Duration::default(); let mut transactions_elapsed = Duration::default(); let mut tx_hash_numbers_elapsed = Duration::default(); - for (transaction, sender) in tx_iter { + + for (transaction, sender) in block.body.into_iter().zip(senders) { let hash = transaction.hash(); if prune_modes