Skip to main content

revme/cmd/bench/
snailtracer.rs

1use criterion::Criterion;
2
3use revm::{
4    bytecode::Bytecode,
5    context::TxEnv,
6    database::{BenchmarkDB, BENCH_CALLER, BENCH_TARGET},
7    inspector::NoOpInspector,
8    primitives::{bytes, hex, Bytes, TxKind},
9    Context, ExecuteEvm, InspectEvm, MainBuilder, MainContext,
10};
11
12pub fn run(criterion: &mut Criterion) {
13    let bytecode = Bytecode::new_raw(Bytes::from(hex::decode(BYTES).unwrap()));
14    let _ = bytecode.legacy_jump_table();
15
16    let mut evm = Context::mainnet()
17        .with_db(BenchmarkDB::new_bytecode(bytecode))
18        .modify_cfg_chained(|c| {
19            c.disable_nonce_check = true;
20            c.tx_gas_limit_cap = Some(u64::MAX);
21        })
22        .build_mainnet()
23        .with_inspector(NoOpInspector {});
24
25    let tx = TxEnv::builder()
26        .caller(BENCH_CALLER)
27        .kind(TxKind::Call(BENCH_TARGET))
28        .data(bytes!("30627b7c"))
29        .gas_limit(1_000_000_000)
30        .build()
31        .unwrap();
32
33    criterion.bench_function("snailtracer", |b| {
34        b.iter_batched(
35            || tx.clone(),
36            |input| evm.transact_one(input).unwrap(),
37            criterion::BatchSize::SmallInput,
38        );
39    });
40
41    criterion.bench_function("snailtracer-inspect", |b| {
42        b.iter_batched(
43            || tx.clone(),
44            |input| evm.inspect_one_tx(input),
45            criterion::BatchSize::SmallInput,
46        );
47    });
48}
49
50const BYTES: &str = include_str!("snailtracer.hex");