mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
feat! Mimalloc as the default allocator (#434)
This change integrates mimalloc as the default memory allocator for Regorus, delivering significant performance improvements across all evaluation modes and language bindings. Technical Implementation: - Build mimalloc in vendored mode from C sources (following QSharp approach) - Implement GlobalAlloc trait for seamless Rust integration - Add optional 'mimalloc' feature flag for conditional compilation - Add comprehensive ACI benchmarks to measure evaluation performance Performance Impact: Rust Engine Evaluation: - Single-threaded: ~29% improvement (423 vs 328 Kelem/s) - Multi-threaded: Better scaling with reduced thread contention - Fresh engines: ~24% improvement (56 vs 45 Kelem/s) Rust Compiled Policy Evaluation: - Single-threaded: ~41% improvement (426 vs 303 Kelem/s) - Multi-threaded: Improved allocation efficiency under contention - Fresh compilation: ~26% improvement (53 vs 42 Kelem/s) C# FFI Bindings: - Engine evaluation: ~27% improvement (279 vs 219 Kelem/s) - Compiled policies: ~29% improvement (273 vs 211 Kelem/s) - Better threading characteristics through improved underlying allocation Key Benefits: - Reduced allocation-related contention in multi-threaded scenarios - More consistent performance across different thread counts - Improved memory allocation efficiency for both native Rust and FFI workloads - Better scaling characteristics for production deployments The mimalloc integration provides substantial performance gains while maintaining full compatibility with existing code through feature flags. Reference: QSharp allocator implementation (https://github.com/microsoft/qsharp/tree/main/source/allocator) Fixes #297 Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
committed by
GitHub
parent
6c5338228b
commit
2a0b4ae6b5
@@ -141,11 +141,46 @@ fn clone(c: &mut Criterion) {
|
||||
});
|
||||
}
|
||||
|
||||
fn aci_policy_eval(c: &mut Criterion) {
|
||||
let mut group = c.benchmark_group("ACI Policy Eval");
|
||||
let rules = ["data.policy.mount_overlay", "data.policy.mount_device"];
|
||||
for rule in rules {
|
||||
group.bench_with_input(BenchmarkId::new("rule", rule), &rule, |b, rule| {
|
||||
let mut engine = Engine::new();
|
||||
engine.set_rego_v0(true);
|
||||
|
||||
engine
|
||||
.add_policy_from_file("tests/aci/api.rego")
|
||||
.expect("failed to add api.rego");
|
||||
engine
|
||||
.add_policy_from_file("tests/aci/framework.rego")
|
||||
.expect("failed to add framework.rego");
|
||||
engine
|
||||
.add_policy_from_file("tests/aci/policy.rego")
|
||||
.expect("failed to add policy.rego");
|
||||
engine
|
||||
.add_data(
|
||||
Value::from_json_file("tests/aci/data.json").expect("failed to load data.json"),
|
||||
)
|
||||
.expect("failed to add data");
|
||||
let input =
|
||||
Value::from_json_file("tests/aci/input.json").expect("failed to load input.json");
|
||||
engine.set_input(input.clone());
|
||||
engine.eval_rule(rule.to_string()).unwrap();
|
||||
b.iter(|| {
|
||||
engine.eval_rule(rule.to_string()).unwrap();
|
||||
})
|
||||
});
|
||||
}
|
||||
group.finish();
|
||||
}
|
||||
|
||||
criterion_group!(
|
||||
benches,
|
||||
allow_with_simple_equality,
|
||||
allow_with_simple_membership,
|
||||
clone
|
||||
clone,
|
||||
aci_policy_eval
|
||||
);
|
||||
|
||||
criterion_main!(benches);
|
||||
|
||||
Reference in New Issue
Block a user