aquavm/air/benches/data_long_benchmark.rs
Ivan Boldyrev c332cca6b7
chore(testing-framework)!: restore WASM test executor (#609)
* chore(testing-framework)!: fix WASM test runner

Native mode was used before because some package used native runner
for its tests.

This PR allows to explicitly select test runner for tests.  Many testing-framework
types are now parametrized with a runner type with almost compatible defaults.

* chore(testing-framework): Add `ReleaseWasmAirRunner`
* chore(testing-framework)!: Rename `AirScriptExecutor::simple` to `AirScriptExecutor::from_annotated`.
2023-06-23 19:28:28 +07:00

59 lines
2.0 KiB
Rust

use air_test_utils::prelude::*;
use criterion::criterion_group;
use criterion::criterion_main;
use criterion::Criterion;
use serde_json::Value;
use std::cell::RefCell;
thread_local!(static VM: RefCell<TestRunner<ReleaseWasmAirRunner>> = RefCell::new(
create_custom_avm(unit_call_service(), "test_peer_id")
));
// effectively, we measure just loading time
const SCRIPT: &str = "(par (null) (null))";
// this is the data with large number of smaller values
const VALUES_DATA: &str = include_str!("data/anomaly_long.json");
fn data_long_calls(prev_data: &str, current_data: &str) -> Result<RawAVMOutcome, String> {
let run_parameters = TestRunParameters::new("test_peer_id", 0, 1, "");
VM.with(|vm| vm.borrow_mut().call(SCRIPT, prev_data, current_data, run_parameters))
}
fn build_par_data(data: &mut Value, hangs_left: bool) {
let trace = data.get_mut("trace").unwrap().as_array_mut().unwrap();
let trace_len = trace.len();
let par = if hangs_left {
json!({"par": [trace_len, 0]})
} else {
json!({"par": [0, trace_len]})
};
trace.insert(0, par);
}
fn criterion_benchmark(c: &mut Criterion) {
let mut data_right = serde_json::from_str::<Value>(VALUES_DATA).unwrap();
let mut data_left = data_right.clone();
build_par_data(&mut data_right, false);
build_par_data(&mut data_left, true);
let json_data_right = serde_json::to_string(&data_right).unwrap();
std::mem::drop(data_right);
let json_data_left = serde_json::to_string(&data_left).unwrap();
std::mem::drop(data_left);
// the traces contain different par branches
c.bench_function("data_long_calls wo merge", |b| {
b.iter(|| data_long_calls(&json_data_right, &json_data_left).unwrap())
});
// the traces contain same par branch and arge merged
c.bench_function("data_long_calls with merge", |b| {
b.iter(|| data_long_calls(&json_data_right, &json_data_right).unwrap())
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);