Skip to content

Commit a8ad7d7

Browse files
committed
chore: reduce realloc
1 parent 112fb17 commit a8ad7d7

34 files changed

+101
-97
lines changed

crates/rbuilder/src/backtest/backtest_build_block.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ fn print_onchain_block_data(
319319
orders: &[Order],
320320
block_data: &BlockData,
321321
) {
322-
let mut executed_orders = Vec::new();
322+
let mut executed_orders = Vec::with_capacity(tx_sim_results.len());
323323

324324
let txs_to_idx: HashMap<_, _> = tx_sim_results
325325
.iter()

crates/rbuilder/src/backtest/fetch/flashbots_db.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
use crate::backtest::BuiltBlockData;
2-
use crate::primitives::OrderId;
31
use crate::{
42
backtest::{
53
fetch::data_source::{BlockRef, DataSource, DatasourceData},
6-
OrdersWithTimestamp,
4+
BuiltBlockData, OrdersWithTimestamp,
75
},
86
primitives::{
97
serialize::{RawBundle, RawOrder, RawShareBundle, TxEncoding},
10-
Order, SimValue,
8+
Order, OrderId, SimValue,
119
},
1210
};
1311
use alloy_primitives::I256;
@@ -19,8 +17,7 @@ use bigdecimal::{
1917
use eyre::WrapErr;
2018
use reth_primitives::{Bytes, B256, U256, U64};
2119
use sqlx::postgres::PgPool;
22-
use std::collections::HashSet;
23-
use std::{ops::Mul, str::FromStr};
20+
use std::{collections::HashSet, ops::Mul, str::FromStr};
2421
use time::{OffsetDateTime, PrimitiveDateTime};
2522
use tracing::trace;
2623
use uuid::Uuid;
@@ -333,7 +330,8 @@ impl RelayDB {
333330
.fetch_all(&self.pool)
334331
.await?;
335332

336-
let mut included_orders = Vec::new();
333+
let mut included_orders =
334+
Vec::with_capacity(included_bundles.len() + included_sbundles.len());
337335
for (bundle_uuid,) in included_bundles {
338336
let order_id = OrderId::Bundle(bundle_uuid);
339337
included_orders.push(order_id);

crates/rbuilder/src/backtest/fetch/mempool.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
//! Implementation of [`DataSource`] to bring mempool txs from flashbots' mempool dumpster.
22
//! It downloads all the needed parquet files and keeps them cached for future use.
3-
use crate::backtest::fetch::data_source::DatasourceData;
43
use crate::{
54
backtest::{
6-
fetch::data_source::{BlockRef, DataSource},
5+
fetch::data_source::{BlockRef, DataSource, DatasourceData},
76
OrdersWithTimestamp,
87
},
98
primitives::{

crates/rbuilder/src/backtest/mod.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@ pub use backtest_build_block::run_backtest_build_block;
1212
pub use backtest_build_range::run_backtest_build_range;
1313
use std::collections::HashSet;
1414

15-
use crate::primitives::{OrderId, OrderReplacementKey};
16-
use crate::utils::offset_datetime_to_timestamp_ms;
1715
use crate::{
1816
mev_boost::BuilderBlockReceived,
1917
primitives::{
2018
serialize::{RawOrder, RawOrderConvertError, TxEncoding},
21-
AccountNonce, Order, SimValue,
19+
AccountNonce, Order, OrderId, OrderReplacementKey, SimValue,
2220
},
21+
utils::offset_datetime_to_timestamp_ms,
2322
};
2423
use alloy_primitives::{Address, TxHash, I256};
2524
use alloy_rpc_types::{BlockTransactions, Transaction};

crates/rbuilder/src/backtest/redistribute/cli/csv_output.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
use alloy_primitives::{Address, B256, U256};
2-
use std::fs::File;
3-
use std::io;
4-
use std::io::Write;
5-
use std::path::Path;
2+
use std::{fs::File, io, io::Write, path::Path};
63

74
#[derive(Debug)]
85
pub struct CSVOutputRow {

crates/rbuilder/src/backtest/redistribute/mod.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ where
293293
})
294294
.collect::<Vec<_>>();
295295

296-
let mut simplified_orders = Vec::new();
296+
let mut simplified_orders = Vec::with_capacity(included_orders_available.len());
297297

298298
for available_order in included_orders_available {
299299
simplified_orders.push(SimplifiedOrder::new_from_order(&available_order.order));
@@ -880,7 +880,11 @@ fn calc_inclusion_change(
880880
exclusion_result: &ExclusionResult,
881881
included_before: &[(OrderId, U256)],
882882
) -> Vec<OrderInclusionChange> {
883-
let mut result = Vec::new();
883+
let mut result = Vec::with_capacity(
884+
exclusion_result.new_orders_included.len()
885+
+ exclusion_result.new_orders_failed.len()
886+
+ exclusion_result.orders_profit_changed.len(),
887+
);
884888
for (id, profit_after) in &exclusion_result.new_orders_included {
885889
result.push((
886890
*id,

crates/rbuilder/src/backtest/redistribute/redistribution_algo.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,11 @@ pub fn calculate_redistribution(data: RedistributionCalculator) -> Redistributio
141141
}
142142

143143
let mut total_value_redistributed = U256::ZERO;
144-
let mut redistribution_entity_result = Vec::new();
144+
let mut redistribution_entity_result = Vec::with_capacity(n);
145145
for i in 0..n {
146-
let mut order_id_vector = Vec::new();
147-
let mut order_contrib_vector = Vec::new();
146+
let mut order_id_vector = Vec::with_capacity(data.identity_data[i].included_orders.len());
147+
let mut order_contrib_vector =
148+
Vec::with_capacity(data.identity_data[i].included_orders.len());
148149
for landed_order in &data.identity_data[i].included_orders {
149150
order_id_vector.push(landed_order.id);
150151
order_contrib_vector.push(landed_order.realized_value);
@@ -230,7 +231,7 @@ fn split_value(value: U256, split_vector: &[U256]) -> Vec<U256> {
230231
if total_split.is_zero() {
231232
return split_vector.iter().map(|_| U256::ZERO).collect();
232233
}
233-
let mut result = Vec::new();
234+
let mut result = Vec::with_capacity(split_vector.len());
234235
for split in split_vector {
235236
result.push((value * split) / total_split);
236237
}

crates/rbuilder/src/backtest/restore_landed_orders/find_landed_orders.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
use crate::primitives::{Order, OrderId, ShareBundleBody, ShareBundleInner, TxRevertBehavior};
2-
use crate::utils::get_percent;
1+
use crate::{
2+
primitives::{Order, OrderId, ShareBundleBody, ShareBundleInner, TxRevertBehavior},
3+
utils::get_percent,
4+
};
35
use ahash::HashMap;
46
use alloy_primitives::{B256, I256, U256};
57

@@ -408,8 +410,10 @@ fn find_landed_order_data(
408410
#[cfg(test)]
409411
mod tests {
410412
use super::*;
411-
use crate::primitives::{Bundle, MempoolTx, Refund, ShareBundle, ShareBundleTx};
412-
use crate::utils::test_utils::*;
413+
use crate::{
414+
primitives::{Bundle, MempoolTx, Refund, ShareBundle, ShareBundleTx},
415+
utils::test_utils::*,
416+
};
413417

414418
fn assert_result(
415419
executed_txs: Vec<ExecutedBlockTx>,

crates/rbuilder/src/backtest/store.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
// store orders in the sqlite database
22

3-
use crate::backtest::BuiltBlockData;
4-
use crate::primitives::OrderId;
5-
use crate::utils::timestamp_ms_to_offset_datetime;
63
use crate::{
7-
backtest::{BlockData, OrdersWithTimestamp, RawOrdersWithTimestamp},
4+
backtest::{BlockData, BuiltBlockData, OrdersWithTimestamp, RawOrdersWithTimestamp},
85
mev_boost::BuilderBlockReceived,
9-
primitives::serialize::{RawOrder, TxEncoding},
6+
primitives::{
7+
serialize::{RawOrder, TxEncoding},
8+
OrderId,
9+
},
10+
utils::timestamp_ms_to_offset_datetime,
1011
};
1112
use ahash::{HashMap, HashSet};
12-
use alloy_primitives::utils::{ParseUnits, Unit};
1313
use alloy_primitives::{
14-
utils::{format_ether, parse_ether},
14+
utils::{format_ether, parse_ether, ParseUnits, Unit},
1515
Address, B256, I256, U256,
1616
};
1717
use lz4_flex::{block::DecompressError, compress_prepend_size, decompress_size_prepended};
@@ -20,10 +20,10 @@ use sqlx::{
2020
sqlite::{SqliteConnectOptions, SqliteRow},
2121
ConnectOptions, Connection, Executor, Row, SqliteConnection,
2222
};
23-
use std::str::FromStr;
2423
use std::{
2524
ffi::OsString,
2625
path::{Path, PathBuf},
26+
str::FromStr,
2727
};
2828

2929
/// Version of the data/format on the DB.

crates/rbuilder/src/bin/backtest-distribute.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
use rbuilder::backtest::redistribute::run_backtest_redistribute;
2-
use rbuilder::live_builder::config::Config;
1+
use rbuilder::{backtest::redistribute::run_backtest_redistribute, live_builder::config::Config};
32

43
#[tokio::main]
54
async fn main() -> eyre::Result<()> {

crates/rbuilder/src/building/block_orders/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ pub fn block_orders_from_sim_orders(
197197
) -> ProviderResult<BlockOrders> {
198198
let mut onchain_nonces = vec![];
199199
for order in sim_orders {
200+
onchain_nonces.reserve_exact(order.order.nonces().len());
200201
for nonce in order.order.nonces() {
201202
let value = state_provider
202203
.account_nonce(nonce.address)?

crates/rbuilder/src/building/block_orders/test_context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl<TestedSinkType: SimulatedOrderSink> TestContext<TestedSinkType> {
111111
/// tx is the same in all backruns
112112
pub fn create_multiple_sbundle_tx_br(&mut self, sbundle_count: usize) -> Vec<ShareBundle> {
113113
let tx = self.create_share_bundle_tx_bundle(TxRevertBehavior::AllowedExcluded);
114-
let mut res = Vec::new();
114+
let mut res = Vec::with_capacity(sbundle_count);
115115
for _ in 0..sbundle_count {
116116
let body = vec![
117117
tx.clone(),

crates/rbuilder/src/building/builders/ordering_builder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
//! The described algorithm is ran continuously adding new SimulatedOrders (they arrive on real time!) on each iteration until we run out of time (slot ends).
66
//! Sorting criteria are described on [`Sorting`].
77
//! For some more details see [`OrderingBuilderConfig`]
8-
use crate::roothash::RootHashConfig;
98
use crate::{
109
building::{
1110
block_orders_from_sim_orders,
@@ -15,6 +14,7 @@ use crate::{
1514
BlockBuildingContext, BlockOrders, ExecutionError, Sorting,
1615
},
1716
primitives::{AccountNonce, OrderId},
17+
roothash::RootHashConfig,
1818
};
1919
use ahash::{HashMap, HashSet};
2020
use alloy_primitives::Address;

crates/rbuilder/src/building/builders/parallel_builder/block_building_result_assembler.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ use reth::tasks::pool::BlockingTaskPool;
88
use reth_db::Database;
99
use reth_payload_builder::database::CachedReads;
1010
use reth_provider::{DatabaseProviderFactory, StateProviderFactory};
11-
use std::sync::Arc;
12-
use std::{marker::PhantomData, time::Instant};
11+
use std::{marker::PhantomData, sync::Arc, time::Instant};
1312
use time::OffsetDateTime;
1413
use tokio_util::sync::CancellationToken;
1514
use tracing::{trace, warn};

crates/rbuilder/src/building/builders/parallel_builder/conflict_resolvers.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@ use std::sync::Arc;
1010
use tokio_util::sync::CancellationToken;
1111
use tracing::trace;
1212

13-
use super::simulation_cache::{CachedSimulationState, SharedSimulationCache};
14-
use super::{Algorithm, ConflictTask, ResolutionResult};
13+
use super::{
14+
simulation_cache::{CachedSimulationState, SharedSimulationCache},
15+
Algorithm, ConflictTask, ResolutionResult,
16+
};
1517

16-
use crate::building::{BlockBuildingContext, BlockState, PartialBlock};
17-
use crate::building::{ExecutionError, ExecutionResult};
18-
use crate::primitives::{OrderId, SimulatedOrder};
18+
use crate::{
19+
building::{BlockBuildingContext, BlockState, ExecutionError, ExecutionResult, PartialBlock},
20+
primitives::{OrderId, SimulatedOrder},
21+
};
1922

2023
/// Context for resolving conflicts in merging tasks.
2124
#[derive(Debug)]
@@ -352,7 +355,7 @@ fn generate_sequences_of_orders_to_try(task: &ConflictTask) -> Vec<Vec<usize>> {
352355
///
353356
/// A vector of randomly generated sequences of order indices.
354357
fn generate_random_permutations(task: &ConflictTask, seed: u64, count: usize) -> Vec<Vec<usize>> {
355-
let mut sequences_of_orders = vec![];
358+
let mut sequences_of_orders = Vec::with_capacity(count);
356359

357360
let order_group = &task.group;
358361
let mut indexes = (0..order_group.orders.len()).collect::<Vec<_>>();

crates/rbuilder/src/building/builders/parallel_builder/conflict_resolving_pool.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@ use crossbeam_queue::SegQueue;
33
use eyre::Result;
44
use rayon::{ThreadPool, ThreadPoolBuilder};
55
use reth_provider::StateProviderFactory;
6-
use std::sync::mpsc as std_mpsc;
7-
use std::sync::Arc;
8-
use std::time::Instant;
6+
use std::{
7+
sync::{mpsc as std_mpsc, Arc},
8+
time::Instant,
9+
};
910
use tokio_util::sync::CancellationToken;
1011
use tracing::{trace, warn};
1112

12-
use super::conflict_task_generator::get_tasks_for_group;
13-
use super::ConflictResolutionResultPerGroup;
14-
use super::TaskPriority;
1513
use super::{
16-
conflict_resolvers::ResolverContext, simulation_cache::SharedSimulationCache, ConflictGroup,
17-
ConflictTask, GroupId, ResolutionResult,
14+
conflict_resolvers::ResolverContext, conflict_task_generator::get_tasks_for_group,
15+
simulation_cache::SharedSimulationCache, ConflictGroup, ConflictResolutionResultPerGroup,
16+
ConflictTask, GroupId, ResolutionResult, TaskPriority,
1817
};
1918
use crate::building::BlockBuildingContext;
2019

crates/rbuilder/src/building/builders/parallel_builder/conflict_task_generator.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
use crate::primitives::SimulatedOrder;
2-
use ahash::HashMap;
3-
use ahash::HashSet;
2+
use ahash::{HashMap, HashSet};
43
use alloy_primitives::{utils::format_ether, U256};
54
use crossbeam_queue::SegQueue;
65
use itertools::Itertools;
76
use std::time::Instant;
87
use tracing::{trace, warn};
98

10-
use super::task::ConflictTask;
11-
use super::ConflictGroup;
12-
use super::ConflictResolutionResultPerGroup;
13-
use super::GroupId;
14-
use super::ResolutionResult;
15-
use super::{Algorithm, TaskPriority, TaskQueue};
9+
use super::{
10+
task::ConflictTask, Algorithm, ConflictGroup, ConflictResolutionResultPerGroup, GroupId,
11+
ResolutionResult, TaskPriority, TaskQueue,
12+
};
1613
use std::sync::mpsc as std_mpsc;
1714

1815
const THRESHOLD_FOR_SIGNIFICANT_CHANGE: u64 = 20;

crates/rbuilder/src/building/builders/parallel_builder/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ use itertools::Itertools;
1818
use results_aggregator::BestResults;
1919
use serde::Deserialize;
2020
use simulation_cache::SharedSimulationCache;
21-
use std::sync::mpsc as std_mpsc;
22-
use std::thread;
23-
use std::{sync::Arc, time::Instant};
21+
use std::{
22+
sync::{mpsc as std_mpsc, Arc},
23+
thread,
24+
time::Instant,
25+
};
2426
use task::*;
2527
use time::OffsetDateTime;
2628
use tokio_util::sync::CancellationToken;

crates/rbuilder/src/building/builders/parallel_builder/results_aggregator.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use super::{ConflictGroup, GroupId, ResolutionResult};
2-
use alloy_primitives::utils::format_ether;
3-
use alloy_primitives::U256;
2+
use alloy_primitives::{utils::format_ether, U256};
43
use dashmap::DashMap;
5-
use std::sync::mpsc as std_mpsc;
6-
use std::sync::{
7-
atomic::{AtomicU64, Ordering},
8-
Arc,
4+
use std::{
5+
sync::{
6+
atomic::{AtomicU64, Ordering},
7+
mpsc as std_mpsc, Arc,
8+
},
9+
time::{Duration, Instant},
910
};
10-
use std::time::{Duration, Instant};
1111
use tokio_util::sync::CancellationToken;
1212
use tracing::trace;
1313

crates/rbuilder/src/building/builders/parallel_builder/simulation_cache.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ use alloy_primitives::U256;
44
use parking_lot::RwLock as PLRwLock;
55
use reth_payload_builder::database::CachedReads;
66
use revm::db::BundleState;
7-
use std::sync::atomic::{AtomicUsize, Ordering};
8-
use std::sync::Arc;
7+
use std::sync::{
8+
atomic::{AtomicUsize, Ordering},
9+
Arc,
10+
};
911

1012
/// An instance of a simulation result that has been cached.
1113
#[derive(Debug, Clone)]

crates/rbuilder/src/building/built_block_trace.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ use super::{BundleErr, ExecutionError, ExecutionResult, OrderErr};
22
use crate::primitives::{Order, OrderId, OrderReplacementKey};
33
use ahash::{HashMap, HashSet};
44
use alloy_primitives::{Address, TxHash, U256};
5-
use std::collections::hash_map;
6-
use std::time::Duration;
5+
use std::{collections::hash_map, time::Duration};
76
use time::OffsetDateTime;
87

98
/// Structs for recording data about a built block, such as what bundles were included, and where txs came from.

crates/rbuilder/src/live_builder/block_output/bidding/wallet_balance_watcher.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ where
154154
}
155155
return Ok(Vec::new());
156156
}
157-
let mut res = Vec::new();
157+
let mut res = Vec::with_capacity(new_block.saturating_sub(self.block_number) as usize);
158158
for block_number in self.block_number + 1..=new_block {
159159
let block_info = self.get_block_info(block_number)?;
160160
res.push(block_info.as_landed_block_info(&self.builder_addr));

crates/rbuilder/src/live_builder/block_output/block_sealing_bidder_factory.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use crate::{
44
};
55
use alloy_primitives::U256;
66
use reth_provider::{HeaderProvider, StateProviderFactory};
7-
use std::fmt::Debug;
8-
use std::sync::Arc;
7+
use std::{fmt::Debug, sync::Arc};
98
use tracing::error;
109

1110
use super::{

0 commit comments

Comments
 (0)