* Optimize aligned memory used by the runtime (#17324)
(cherry picked from commit 477898f682)
# Conflicts:
#	cli/Cargo.toml
#	programs/bpf/Cargo.toml
#	programs/bpf_loader/Cargo.toml
#	programs/bpf_loader/src/syscalls.rs
* resolve conflicts
Co-authored-by: Jack May <jack@solana.com>
		
	
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
#![feature(test)]
 | 
						|
 | 
						|
extern crate test;
 | 
						|
 | 
						|
use solana_bpf_loader_program::serialization::{
 | 
						|
    serialize_parameters_aligned, serialize_parameters_unaligned,
 | 
						|
};
 | 
						|
use solana_sdk::{
 | 
						|
    account::{Account, AccountSharedData},
 | 
						|
    bpf_loader,
 | 
						|
};
 | 
						|
use solana_sdk::{keyed_account::KeyedAccount, pubkey::Pubkey};
 | 
						|
use std::cell::RefCell;
 | 
						|
use test::Bencher;
 | 
						|
 | 
						|
fn create_inputs() -> (
 | 
						|
    Pubkey,
 | 
						|
    Vec<Pubkey>,
 | 
						|
    Vec<RefCell<AccountSharedData>>,
 | 
						|
    Vec<u8>,
 | 
						|
) {
 | 
						|
    let program_id = solana_sdk::pubkey::new_rand();
 | 
						|
    let dup_key = solana_sdk::pubkey::new_rand();
 | 
						|
    let dup_key2 = solana_sdk::pubkey::new_rand();
 | 
						|
    let keys = vec![
 | 
						|
        dup_key,
 | 
						|
        dup_key,
 | 
						|
        solana_sdk::pubkey::new_rand(),
 | 
						|
        solana_sdk::pubkey::new_rand(),
 | 
						|
        dup_key2,
 | 
						|
        dup_key2,
 | 
						|
        solana_sdk::pubkey::new_rand(),
 | 
						|
        solana_sdk::pubkey::new_rand(),
 | 
						|
    ];
 | 
						|
    let accounts = vec![
 | 
						|
        RefCell::new(AccountSharedData::from(Account {
 | 
						|
            lamports: 1,
 | 
						|
            data: vec![1u8, 2, 3, 4, 5],
 | 
						|
            owner: bpf_loader::id(),
 | 
						|
            executable: false,
 | 
						|
            rent_epoch: 100,
 | 
						|
        })),
 | 
						|
        // dup
 | 
						|
        RefCell::new(AccountSharedData::from(Account {
 | 
						|
            lamports: 1,
 | 
						|
            data: vec![1u8; 100000],
 | 
						|
            owner: bpf_loader::id(),
 | 
						|
            executable: false,
 | 
						|
            rent_epoch: 100,
 | 
						|
        })),
 | 
						|
        RefCell::new(AccountSharedData::from(Account {
 | 
						|
            lamports: 2,
 | 
						|
            data: vec![11u8; 100000],
 | 
						|
            owner: bpf_loader::id(),
 | 
						|
            executable: true,
 | 
						|
            rent_epoch: 200,
 | 
						|
        })),
 | 
						|
        RefCell::new(AccountSharedData::from(Account {
 | 
						|
            lamports: 3,
 | 
						|
            data: vec![],
 | 
						|
            owner: bpf_loader::id(),
 | 
						|
            executable: false,
 | 
						|
            rent_epoch: 3100,
 | 
						|
        })),
 | 
						|
        RefCell::new(AccountSharedData::from(Account {
 | 
						|
            lamports: 4,
 | 
						|
            data: vec![1u8; 100000],
 | 
						|
            owner: bpf_loader::id(),
 | 
						|
            executable: false,
 | 
						|
            rent_epoch: 100,
 | 
						|
        })),
 | 
						|
        // dup
 | 
						|
        RefCell::new(AccountSharedData::from(Account {
 | 
						|
            lamports: 4,
 | 
						|
            data: vec![1u8; 1000000],
 | 
						|
            owner: bpf_loader::id(),
 | 
						|
            executable: false,
 | 
						|
            rent_epoch: 100,
 | 
						|
        })),
 | 
						|
        RefCell::new(AccountSharedData::from(Account {
 | 
						|
            lamports: 5,
 | 
						|
            data: vec![11u8; 10000],
 | 
						|
            owner: bpf_loader::id(),
 | 
						|
            executable: true,
 | 
						|
            rent_epoch: 200,
 | 
						|
        })),
 | 
						|
        RefCell::new(AccountSharedData::from(Account {
 | 
						|
            lamports: 6,
 | 
						|
            data: vec![],
 | 
						|
            owner: bpf_loader::id(),
 | 
						|
            executable: false,
 | 
						|
            rent_epoch: 3100,
 | 
						|
        })),
 | 
						|
    ];
 | 
						|
 | 
						|
    let instruction_data = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
 | 
						|
 | 
						|
    (program_id, keys, accounts, instruction_data)
 | 
						|
}
 | 
						|
 | 
						|
#[bench]
 | 
						|
fn bench_serialize_unaligned(bencher: &mut Bencher) {
 | 
						|
    let (program_id, keys, accounts, instruction_data) = create_inputs();
 | 
						|
    let keyed_accounts: Vec<_> = keys
 | 
						|
        .iter()
 | 
						|
        .zip(&accounts)
 | 
						|
        .enumerate()
 | 
						|
        .map(|(i, (key, account))| {
 | 
						|
            if i <= accounts.len() / 2 {
 | 
						|
                KeyedAccount::new_readonly(&key, false, &account)
 | 
						|
            } else {
 | 
						|
                KeyedAccount::new(&key, false, &account)
 | 
						|
            }
 | 
						|
        })
 | 
						|
        .collect();
 | 
						|
    bencher.iter(|| {
 | 
						|
        let _ = serialize_parameters_unaligned(&program_id, &keyed_accounts, &instruction_data)
 | 
						|
            .unwrap();
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
#[bench]
 | 
						|
fn bench_serialize_aligned(bencher: &mut Bencher) {
 | 
						|
    let (program_id, keys, accounts, instruction_data) = create_inputs();
 | 
						|
    let keyed_accounts: Vec<_> = keys
 | 
						|
        .iter()
 | 
						|
        .zip(&accounts)
 | 
						|
        .enumerate()
 | 
						|
        .map(|(i, (key, account))| {
 | 
						|
            if i <= accounts.len() / 2 {
 | 
						|
                KeyedAccount::new_readonly(&key, false, &account)
 | 
						|
            } else {
 | 
						|
                KeyedAccount::new(&key, false, &account)
 | 
						|
            }
 | 
						|
        })
 | 
						|
        .collect();
 | 
						|
    bencher.iter(|| {
 | 
						|
        let _ =
 | 
						|
            serialize_parameters_aligned(&program_id, &keyed_accounts, &instruction_data).unwrap();
 | 
						|
    });
 | 
						|
}
 |