revme/cmd/bench/
gas_cost_estimator.rs1use criterion::Criterion;
2use revm::{
3 bytecode::Bytecode,
4 context::TxEnv,
5 database::{BenchmarkDB, BENCH_CALLER, BENCH_TARGET},
6 primitives::{hex, Bytes, TxKind},
7 Context, ExecuteEvm, MainBuilder, MainContext,
8};
9use std::io::Cursor;
10
11pub fn run(criterion: &mut Criterion) {
12 let mut rdr = csv::Reader::from_reader(Cursor::new(SAMPLE_CSV));
15 for result in rdr.records() {
16 let result = result.expect("Failed to read record");
17 let name = &result[0];
18 let bytecode_hex = &result[3];
19 let Ok(hex) = hex::decode(bytecode_hex) else {
20 continue;
21 };
22 let bytecode = Bytecode::new_raw(Bytes::from(hex));
23
24 let mut evm = Context::mainnet()
25 .with_db(BenchmarkDB::new_bytecode(bytecode.clone()))
26 .modify_cfg_chained(|c| {
27 c.disable_nonce_check = true;
28 c.tx_gas_limit_cap = Some(u64::MAX);
29 })
30 .build_mainnet();
31
32 let tx = TxEnv::builder()
33 .caller(BENCH_CALLER)
34 .kind(TxKind::Call(BENCH_TARGET))
35 .gas_limit(1_000_000_000)
36 .build()
37 .unwrap();
38
39 criterion.bench_function(name, |b| {
40 b.iter_batched(
41 || tx.clone(),
42 |input| evm.transact_one(input).unwrap(),
43 criterion::BatchSize::SmallInput,
44 );
45 });
46 }
47}
48
49const SAMPLE_CSV: &str = include_str!("gas_cost_estimator_sample.csv");