Perf: Store deserialized sysvars in the sysvars cache (#22455)
* Perf: Store deserialized sysvars in sysvars cache * add bench
This commit is contained in:
@ -1,8 +1,6 @@
|
||||
//! The solana-program-test provides a BanksClient-based test framework BPF programs
|
||||
#![allow(clippy::integer_arithmetic)]
|
||||
|
||||
#[allow(deprecated)]
|
||||
use solana_sdk::sysvar::fees::Fees;
|
||||
// Export tokio for test clients
|
||||
pub use tokio;
|
||||
use {
|
||||
@ -24,10 +22,9 @@ use {
|
||||
solana_sdk::{
|
||||
account::{Account, AccountSharedData, ReadableAccount, WritableAccount},
|
||||
account_info::AccountInfo,
|
||||
clock::{Clock, Slot},
|
||||
clock::Slot,
|
||||
compute_budget::ComputeBudget,
|
||||
entrypoint::{ProgramResult, SUCCESS},
|
||||
epoch_schedule::EpochSchedule,
|
||||
fee_calculator::{FeeCalculator, FeeRateGovernor},
|
||||
genesis_config::{ClusterType, GenesisConfig},
|
||||
hash::Hash,
|
||||
@ -38,11 +35,7 @@ use {
|
||||
pubkey::Pubkey,
|
||||
rent::Rent,
|
||||
signature::{Keypair, Signer},
|
||||
sysvar::{
|
||||
clock, epoch_schedule,
|
||||
fees::{self},
|
||||
rent, Sysvar, SysvarId,
|
||||
},
|
||||
sysvar::{Sysvar, SysvarId},
|
||||
},
|
||||
solana_vote_program::vote_state::{VoteState, VoteStateVersions},
|
||||
std::{
|
||||
@ -209,8 +202,8 @@ macro_rules! processor {
|
||||
};
|
||||
}
|
||||
|
||||
fn get_sysvar<T: Default + Sysvar + Sized + serde::de::DeserializeOwned>(
|
||||
id: &Pubkey,
|
||||
fn get_sysvar<T: Default + Sysvar + Sized + serde::de::DeserializeOwned + Clone>(
|
||||
sysvar: Result<Arc<T>, InstructionError>,
|
||||
var_addr: *mut u8,
|
||||
) -> u64 {
|
||||
let invoke_context = get_invoke_context();
|
||||
@ -225,9 +218,9 @@ fn get_sysvar<T: Default + Sysvar + Sized + serde::de::DeserializeOwned>(
|
||||
panic!("Exceeded compute budget");
|
||||
}
|
||||
|
||||
match invoke_context.get_sysvar::<T>(id) {
|
||||
match sysvar {
|
||||
Ok(sysvar_data) => unsafe {
|
||||
*(var_addr as *mut _ as *mut T) = sysvar_data;
|
||||
*(var_addr as *mut _ as *mut T) = T::clone(&sysvar_data);
|
||||
SUCCESS
|
||||
},
|
||||
Err(_) => UNSUPPORTED_SYSVAR,
|
||||
@ -341,20 +334,26 @@ impl solana_sdk::program_stubs::SyscallStubs for SyscallStubs {
|
||||
}
|
||||
|
||||
fn sol_get_clock_sysvar(&self, var_addr: *mut u8) -> u64 {
|
||||
get_sysvar::<Clock>(&clock::id(), var_addr)
|
||||
get_sysvar(
|
||||
get_invoke_context().get_sysvar_cache().get_clock(),
|
||||
var_addr,
|
||||
)
|
||||
}
|
||||
|
||||
fn sol_get_epoch_schedule_sysvar(&self, var_addr: *mut u8) -> u64 {
|
||||
get_sysvar::<EpochSchedule>(&epoch_schedule::id(), var_addr)
|
||||
get_sysvar(
|
||||
get_invoke_context().get_sysvar_cache().get_epoch_schedule(),
|
||||
var_addr,
|
||||
)
|
||||
}
|
||||
|
||||
#[allow(deprecated)]
|
||||
fn sol_get_fees_sysvar(&self, var_addr: *mut u8) -> u64 {
|
||||
get_sysvar::<Fees>(&fees::id(), var_addr)
|
||||
get_sysvar(get_invoke_context().get_sysvar_cache().get_fees(), var_addr)
|
||||
}
|
||||
|
||||
fn sol_get_rent_sysvar(&self, var_addr: *mut u8) -> u64 {
|
||||
get_sysvar::<Rent>(&rent::id(), var_addr)
|
||||
get_sysvar(get_invoke_context().get_sysvar_cache().get_rent(), var_addr)
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user