Better initial capacity
This commit is contained in:
		
							parent
							
								
									db8c34ae61
								
							
						
					
					
						commit
						552818607a
					
				@ -10,7 +10,7 @@ use crate::{
 | 
				
			|||||||
    u32_hasher_types::{
 | 
					    u32_hasher_types::{
 | 
				
			||||||
        u32hashmap_with_capacity, u32hashset_new, u32priority_queue_with_capacity, U32HasherState,
 | 
					        u32hashmap_with_capacity, u32hashset_new, u32priority_queue_with_capacity, U32HasherState,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    GbtResult, ThreadTransactionsMap, STARTING_CAPACITY,
 | 
					    GbtResult, ThreadTransactionsMap,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MAX_BLOCK_WEIGHT_UNITS: u32 = 4_000_000 - 4_000;
 | 
					const MAX_BLOCK_WEIGHT_UNITS: u32 = 4_000_000 - 4_000;
 | 
				
			||||||
@ -59,8 +59,9 @@ impl Ord for TxPriority {
 | 
				
			|||||||
#[allow(clippy::too_many_lines)]
 | 
					#[allow(clippy::too_many_lines)]
 | 
				
			||||||
#[allow(clippy::cognitive_complexity)]
 | 
					#[allow(clippy::cognitive_complexity)]
 | 
				
			||||||
pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult {
 | 
					pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult {
 | 
				
			||||||
    let mut audit_pool: AuditPool = u32hashmap_with_capacity(STARTING_CAPACITY);
 | 
					    let mempool_len = mempool.len();
 | 
				
			||||||
    let mut mempool_stack: Vec<u32> = Vec::with_capacity(STARTING_CAPACITY);
 | 
					    let mut audit_pool: AuditPool = u32hashmap_with_capacity(mempool_len);
 | 
				
			||||||
 | 
					    let mut mempool_stack: Vec<u32> = Vec::with_capacity(mempool_len);
 | 
				
			||||||
    let mut clusters: Vec<Vec<u32>> = Vec::new();
 | 
					    let mut clusters: Vec<Vec<u32>> = Vec::new();
 | 
				
			||||||
    let mut block_weights: Vec<u32> = Vec::new();
 | 
					    let mut block_weights: Vec<u32> = Vec::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -96,8 +97,10 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult {
 | 
				
			|||||||
    let mut blocks: Vec<Vec<u32>> = Vec::new();
 | 
					    let mut blocks: Vec<Vec<u32>> = Vec::new();
 | 
				
			||||||
    let mut block_weight: u32 = BLOCK_RESERVED_WEIGHT;
 | 
					    let mut block_weight: u32 = BLOCK_RESERVED_WEIGHT;
 | 
				
			||||||
    let mut block_sigops: u32 = BLOCK_RESERVED_SIGOPS;
 | 
					    let mut block_sigops: u32 = BLOCK_RESERVED_SIGOPS;
 | 
				
			||||||
    let mut transactions: Vec<u32> = Vec::with_capacity(STARTING_CAPACITY);
 | 
					    // No need to be bigger than 4096 transactions for the per-block transaction Vec.
 | 
				
			||||||
    let mut modified: ModifiedQueue = u32priority_queue_with_capacity(STARTING_CAPACITY);
 | 
					    let initial_txes_per_block: usize = 4096.min(mempool_len);
 | 
				
			||||||
 | 
					    let mut transactions: Vec<u32> = Vec::with_capacity(initial_txes_per_block);
 | 
				
			||||||
 | 
					    let mut modified: ModifiedQueue = u32priority_queue_with_capacity(mempool_len);
 | 
				
			||||||
    let mut overflow: Vec<u32> = Vec::new();
 | 
					    let mut overflow: Vec<u32> = Vec::new();
 | 
				
			||||||
    let mut failures = 0;
 | 
					    let mut failures = 0;
 | 
				
			||||||
    while !mempool_stack.is_empty() || !modified.is_empty() {
 | 
					    while !mempool_stack.is_empty() || !modified.is_empty() {
 | 
				
			||||||
@ -196,7 +199,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult {
 | 
				
			|||||||
                block_weights.push(block_weight);
 | 
					                block_weights.push(block_weight);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            // reset for the next block
 | 
					            // reset for the next block
 | 
				
			||||||
            transactions = Vec::with_capacity(STARTING_CAPACITY);
 | 
					            transactions = Vec::with_capacity(initial_txes_per_block);
 | 
				
			||||||
            block_weight = BLOCK_RESERVED_WEIGHT;
 | 
					            block_weight = BLOCK_RESERVED_WEIGHT;
 | 
				
			||||||
            block_sigops = BLOCK_RESERVED_SIGOPS;
 | 
					            block_sigops = BLOCK_RESERVED_SIGOPS;
 | 
				
			||||||
            failures = 0;
 | 
					            failures = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -23,13 +23,10 @@ mod u32_hasher_types;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState};
 | 
					use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// This is the starting capacity for HashMap/Vec/etc. that deal with transactions.
 | 
					/// This is the initial capacity of the GbtGenerator struct's inner HashMap.
 | 
				
			||||||
/// `HashMap` doubles capacity when it hits it, so 2048 is a decent tradeoff between
 | 
					 | 
				
			||||||
/// not wasting too much memory when it's below this, and allowing for less re-allocations
 | 
					 | 
				
			||||||
/// by virtue of starting with such a large capacity.
 | 
					 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// Note: This doesn't *have* to be a power of 2. (uwu)
 | 
					/// Note: This doesn't *have* to be a power of 2. (uwu)
 | 
				
			||||||
const STARTING_CAPACITY: usize = 32768;
 | 
					const STARTING_CAPACITY: usize = 1_048_576;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ThreadTransactionsMap = HashMap<u32, ThreadTransaction, U32HasherState>;
 | 
					type ThreadTransactionsMap = HashMap<u32, ThreadTransaction, U32HasherState>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user