Skip to content

Commit

Permalink
Use ahash for BUILTIN_INSTRUCTION_COSTS (#2329)
Browse files Browse the repository at this point in the history
* Add bench tests for ahash vs hash

* Use ahash for BUILTIN_INSTRUCTION_COSTS

Fixes: #2196
  • Loading branch information
ksolana authored Jul 31, 2024
1 parent 6e067fc commit 2fce82b
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 2 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions cost-model/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ name = "solana_cost_model"

[dev-dependencies]
itertools = { workspace = true }
rand = "0.8.5"
solana-logger = { workspace = true }
solana-sdk = { workspace = true, features = ["dev-context-only-utils"] }
static_assertions = { workspace = true }
Expand Down
55 changes: 55 additions & 0 deletions cost-model/benches/block_cost_limit.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#![feature(test)]
extern crate test;
use {
rand::Rng,
solana_cost_model::block_cost_limits::BUILTIN_INSTRUCTION_COSTS,
solana_sdk::{
address_lookup_table, bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable,
compute_budget, ed25519_program, loader_v4, pubkey::Pubkey, secp256k1_program,
},
test::Bencher,
};

struct BenchSetup {
pubkeys: [Pubkey; 12],
}

const NUM_TRANSACTIONS_PER_ITER: usize = 1024;
const DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT: u32 = 200_000;

fn setup() -> BenchSetup {
let pubkeys: [Pubkey; 12] = [
solana_stake_program::id(),
solana_config_program::id(),
solana_vote_program::id(),
solana_system_program::id(),
compute_budget::id(),
address_lookup_table::program::id(),
bpf_loader_upgradeable::id(),
bpf_loader_deprecated::id(),
bpf_loader::id(),
loader_v4::id(),
secp256k1_program::id(),
ed25519_program::id(),
];

BenchSetup { pubkeys }
}

#[bench]
fn bench_hash_find(bencher: &mut Bencher) {
let BenchSetup { pubkeys } = setup();

bencher.iter(|| {
for _t in 0..NUM_TRANSACTIONS_PER_ITER {
let idx = rand::thread_rng().gen_range(0..pubkeys.len());
let ix_execution_cost =
if let Some(builtin_cost) = BUILTIN_INSTRUCTION_COSTS.get(&pubkeys[idx]) {
*builtin_cost
} else {
u64::from(DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT)
};
assert!(ix_execution_cost != DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT as u64);
}
});
}
4 changes: 2 additions & 2 deletions cost-model/src/block_cost_limits.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
//! defines block cost related limits
//!
use {
ahash::AHashMap,
lazy_static::lazy_static,
solana_sdk::{
address_lookup_table, bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable,
compute_budget, ed25519_program, loader_v4, pubkey::Pubkey, secp256k1_program,
},
std::collections::HashMap,
};

/// Static configurations:
Expand Down Expand Up @@ -37,7 +37,7 @@ pub const INSTRUCTION_DATA_BYTES_COST: u64 = 140 /*bytes per us*/ / COMPUTE_UNIT
// Number of compute units for each built-in programs
lazy_static! {
/// Number of compute units for each built-in programs
pub static ref BUILTIN_INSTRUCTION_COSTS: HashMap<Pubkey, u64> = [
pub static ref BUILTIN_INSTRUCTION_COSTS: AHashMap<Pubkey, u64> = [
(solana_stake_program::id(), solana_stake_program::stake_instruction::DEFAULT_COMPUTE_UNITS),
(solana_config_program::id(), solana_config_program::config_processor::DEFAULT_COMPUTE_UNITS),
(solana_vote_program::id(), solana_vote_program::vote_processor::DEFAULT_COMPUTE_UNITS),
Expand Down

0 comments on commit 2fce82b

Please sign in to comment.