diff --git a/Cargo.toml b/Cargo.toml index 76de893..2dee9d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,11 +11,20 @@ categories = ["wasm", "no-std"] repository = "https://github.com/paritytech/wasm-instrument" include = ["src/**/*", "LICENSE-*", "README.md"] +[[bench]] +name = "benches" +harness = false + +[profile.bench] +lto = "fat" +codegen-units = 1 + [dependencies] parity-wasm = { version = "0.42", default-features = false } [dev-dependencies] binaryen = "0.12" +criterion = "0.3" diff = "0.1" rand = "0.8" wabt = "0.10" diff --git a/benches/benches.rs b/benches/benches.rs new file mode 100644 index 0000000..be87e7d --- /dev/null +++ b/benches/benches.rs @@ -0,0 +1,51 @@ +use criterion::{ + criterion_group, criterion_main, measurement::Measurement, BenchmarkGroup, Criterion, + Throughput, +}; +use std::{ + fs::{read, read_dir}, + path::PathBuf, +}; +use wasm_instrument::{ + gas_metering, inject_stack_limiter, + parity_wasm::{deserialize_buffer, elements::Module}, +}; + +fn fixture_dir() -> PathBuf { + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("benches"); + path.push("fixtures"); + path +} + +fn any_fixture(group: &mut BenchmarkGroup, f: F) +where + F: Fn(Module), + M: Measurement, +{ + for entry in read_dir(fixture_dir()).unwrap() { + let entry = entry.unwrap(); + let bytes = read(&entry.path()).unwrap(); + group.throughput(Throughput::Bytes(bytes.len().try_into().unwrap())); + group.bench_function(entry.file_name().to_str().unwrap(), |bench| { + bench.iter(|| f(deserialize_buffer(&bytes).unwrap())) + }); + } +} + +pub fn gas_metering(c: &mut Criterion) { + let mut group = c.benchmark_group("Gas Metering"); + any_fixture(&mut group, |module| { + gas_metering::inject(module, &gas_metering::ConstantCostRules::default(), "env").unwrap(); + }); +} + +pub fn stack_height_limiter(c: &mut Criterion) { + let mut group = c.benchmark_group("Stack Height Limiter"); + any_fixture(&mut group, |module| { + inject_stack_limiter(module, 128).unwrap(); + }); +} + +criterion_group!(benches, gas_metering, stack_height_limiter); +criterion_main!(benches); diff --git a/benches/fixtures/contract_terminate.wasm b/benches/fixtures/contract_terminate.wasm new file mode 100644 index 0000000..00ca3c7 Binary files /dev/null and b/benches/fixtures/contract_terminate.wasm differ diff --git a/benches/fixtures/contract_transfer.wasm b/benches/fixtures/contract_transfer.wasm new file mode 100644 index 0000000..b0069f0 Binary files /dev/null and b/benches/fixtures/contract_transfer.wasm differ diff --git a/benches/fixtures/dns.wasm b/benches/fixtures/dns.wasm new file mode 100644 index 0000000..6825b88 Binary files /dev/null and b/benches/fixtures/dns.wasm differ diff --git a/benches/fixtures/erc1155.wasm b/benches/fixtures/erc1155.wasm new file mode 100644 index 0000000..0fd8ebb Binary files /dev/null and b/benches/fixtures/erc1155.wasm differ diff --git a/benches/fixtures/erc20.wasm b/benches/fixtures/erc20.wasm new file mode 100644 index 0000000..7e561c4 Binary files /dev/null and b/benches/fixtures/erc20.wasm differ diff --git a/benches/fixtures/erc721.wasm b/benches/fixtures/erc721.wasm new file mode 100644 index 0000000..96ad573 Binary files /dev/null and b/benches/fixtures/erc721.wasm differ diff --git a/benches/fixtures/many_blocks.wasm b/benches/fixtures/many_blocks.wasm new file mode 100644 index 0000000..0f15be0 Binary files /dev/null and b/benches/fixtures/many_blocks.wasm differ diff --git a/benches/fixtures/multisig.wasm b/benches/fixtures/multisig.wasm new file mode 100644 index 0000000..bd7a96a Binary files /dev/null and b/benches/fixtures/multisig.wasm differ diff --git a/benches/fixtures/proxy.wasm b/benches/fixtures/proxy.wasm new file mode 100644 index 0000000..01cd027 Binary files /dev/null and b/benches/fixtures/proxy.wasm differ diff --git a/benches/fixtures/rand_extension.wasm b/benches/fixtures/rand_extension.wasm new file mode 100644 index 0000000..c4a6710 Binary files /dev/null and b/benches/fixtures/rand_extension.wasm differ diff --git a/benches/fixtures/trait_erc20.wasm b/benches/fixtures/trait_erc20.wasm new file mode 100644 index 0000000..8b5b844 Binary files /dev/null and b/benches/fixtures/trait_erc20.wasm differ diff --git a/src/stack_limiter/mod.rs b/src/stack_limiter/mod.rs index 2e54bfb..02e2a3d 100644 --- a/src/stack_limiter/mod.rs +++ b/src/stack_limiter/mod.rs @@ -286,7 +286,7 @@ fn instrument_function(ctx: &mut Context, func: &mut Instructions) -> Result<(), ctx.stack_height_global_idx(), ctx.stack_limit() ); - new_instrs.extend(new_seq); + new_instrs.extend_from_slice(&new_seq); true } else { false diff --git a/src/stack_limiter/thunk.rs b/src/stack_limiter/thunk.rs index 18eb150..d28cd35 100644 --- a/src/stack_limiter/thunk.rs +++ b/src/stack_limiter/thunk.rs @@ -82,7 +82,7 @@ pub fn generate_thunks( for (arg_idx, _) in thunk.signature.params().iter().enumerate() { thunk_body.push(elements::Instruction::GetLocal(arg_idx as u32)); } - thunk_body.extend(instrumented_call.iter().cloned()); + thunk_body.extend_from_slice(&instrumented_call); thunk_body.push(elements::Instruction::End); // TODO: Don't generate a signature, but find an existing one.