Skip to content

Commit df61e94

Browse files
committed
eth/erc20_params: do more efficient lookup
log-n binary search on sorted list instead of linear search on unsorted list. Sorting happens at compile time, so that has no runtime impact.
1 parent 85b3ac0 commit df61e94

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

src/rust/erc20_params/build.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ fn main() {
6969
.open(out_filename)
7070
.unwrap();
7171

72-
for ((decimals, unit_len), tokens) in &grouped_tokens {
72+
for ((decimals, unit_len), tokens) in &mut grouped_tokens {
73+
// Sort by contract address so we can look up by contract
74+
// address more efficiently.
75+
tokens.sort_by_key(|token| token.contract_address);
7376
writeln!(
7477
output_file,
7578
"const PARAMS_D{}_U{}: &[P] = &[",

src/rust/erc20_params/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ pub fn get(chain_id: u64, contract_address: [u8; 20]) -> Option<Params> {
5757
}
5858
for &(decimals, unit_len, params) in ALL.iter() {
5959
let result = params
60-
.iter()
61-
.find(|p| p.contract_address == contract_address)
62-
.map(|p| Params::from_p(p, decimals, unit_len));
60+
.binary_search_by_key(&contract_address, |p| p.contract_address)
61+
.ok()
62+
.map(|idx| Params::from_p(&params[idx], decimals, unit_len));
6363
if result.is_some() {
6464
return result;
6565
}

0 commit comments

Comments
 (0)