Optimize aligned memory used by the runtime (#17324)
This commit is contained in:
141
programs/bpf_loader/benches/serialization.rs
Normal file
141
programs/bpf_loader/benches/serialization.rs
Normal file
@@ -0,0 +1,141 @@
|
||||
#![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();
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user