145 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
#![feature(test)]
 | 
						|
 | 
						|
extern crate test;
 | 
						|
 | 
						|
use {
 | 
						|
    solana_bpf_loader_program::serialization::{
 | 
						|
        serialize_parameters_aligned, serialize_parameters_unaligned,
 | 
						|
    },
 | 
						|
    solana_sdk::{
 | 
						|
        account::{Account, AccountSharedData},
 | 
						|
        bpf_loader,
 | 
						|
        keyed_account::KeyedAccount,
 | 
						|
        pubkey::Pubkey,
 | 
						|
    },
 | 
						|
    std::cell::RefCell,
 | 
						|
    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();
 | 
						|
    });
 | 
						|
}
 |