Browse Source

Add the ability to profile the benchmarks w/ a flamegraph feature (#183)

* feat: Integrate flamegraph profiling in benchmarks

- Introduce "flamegraph" feature flag for optional profiling integration
- Add benchmark profiling support in `compressed_snark` and `recursive_snark` groups
- Update Cargo.toml with `pprof` and `cfg-if` dependencies

* ci: Build benches to make sure they don't bit-rot

- Integrate bench build step into GitHub Actions workflow
main
François Garillot 1 year ago
committed by GitHub
parent
commit
ff0370f506
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 8 deletions
  1. +2
    -0
      .github/workflows/rust.yml
  2. +3
    -0
      Cargo.toml
  3. +18
    -4
      benches/compressed-snark.rs
  4. +18
    -4
      benches/recursive-snark.rs

+ 2
- 0
.github/workflows/rust.yml

@ -25,6 +25,8 @@ jobs:
run: cargo build --target wasm32-unknown-unknown run: cargo build --target wasm32-unknown-unknown
- name: Build examples - name: Build examples
run: cargo build --examples --verbose run: cargo build --examples --verbose
- name: Build benches
run: cargo build --benches --verbose
- name: Run tests - name: Run tests
run: cargo +stable test --release --verbose run: cargo +stable test --release --verbose
- name: Check Rustfmt Code Style - name: Check Rustfmt Code Style

+ 3
- 0
Cargo.toml

@ -40,6 +40,8 @@ pasta-msm = { version = "0.1.4" }
criterion = { version = "0.4", features = ["html_reports"] } criterion = { version = "0.4", features = ["html_reports"] }
rand = "0.8.4" rand = "0.8.4"
hex = "0.4.3" hex = "0.4.3"
pprof = { version = "0.11" }
cfg-if = "1.0.0"
[[bench]] [[bench]]
name = "recursive-snark" name = "recursive-snark"
@ -59,3 +61,4 @@ default = []
portable = ["pasta-msm/portable"] portable = ["pasta-msm/portable"]
cuda = ["neptune/cuda", "neptune/pasta", "neptune/arity24"] cuda = ["neptune/cuda", "neptune/pasta", "neptune/arity24"]
opencl = ["neptune/opencl", "neptune/pasta", "neptune/arity24"] opencl = ["neptune/opencl", "neptune/pasta", "neptune/arity24"]
flamegraph = ["pprof/flamegraph", "pprof/criterion"]

+ 18
- 4
benches/compressed-snark.rs

@ -22,10 +22,24 @@ type S2 = nova_snark::spartan::RelaxedR1CSSNARK;
type C1 = NonTrivialTestCircuit<<G1 as Group>::Scalar>; type C1 = NonTrivialTestCircuit<<G1 as Group>::Scalar>;
type C2 = TrivialTestCircuit<<G2 as Group>::Scalar>; type C2 = TrivialTestCircuit<<G2 as Group>::Scalar>;
criterion_group! {
name = compressed_snark;
config = Criterion::default().warm_up_time(Duration::from_millis(3000));
targets = bench_compressed_snark
// To run these benchmarks, first download `criterion` with `cargo install cargo install cargo-criterion`.
// Then `cargo criterion --bench compressed-snark`. The results are located in `target/criterion/data/<name-of-benchmark>`.
// For flamegraphs, run `cargo criterion --bench compressed-snark --features flamegraph -- --profile-time <secs>`.
// The results are located in `target/criterion/profile/<name-of-benchmark>`.
cfg_if::cfg_if! {
if #[cfg(feature = "flamegraph")] {
criterion_group! {
name = compressed_snark;
config = Criterion::default().warm_up_time(Duration::from_millis(3000)).with_profiler(pprof::criterion::PProfProfiler::new(100, pprof::criterion::Output::Flamegraph(None)));
targets = bench_compressed_snark
}
} else {
criterion_group! {
name = compressed_snark;
config = Criterion::default().warm_up_time(Duration::from_millis(3000));
targets = bench_compressed_snark
}
}
} }
criterion_main!(compressed_snark); criterion_main!(compressed_snark);

+ 18
- 4
benches/recursive-snark.rs

@ -18,10 +18,24 @@ type G2 = pasta_curves::vesta::Point;
type C1 = NonTrivialTestCircuit<<G1 as Group>::Scalar>; type C1 = NonTrivialTestCircuit<<G1 as Group>::Scalar>;
type C2 = TrivialTestCircuit<<G2 as Group>::Scalar>; type C2 = TrivialTestCircuit<<G2 as Group>::Scalar>;
criterion_group! {
name = recursive_snark;
config = Criterion::default().warm_up_time(Duration::from_millis(3000));
targets = bench_recursive_snark
// To run these benchmarks, first download `criterion` with `cargo install cargo install cargo-criterion`.
// Then `cargo criterion --bench recursive-snark`. The results are located in `target/criterion/data/<name-of-benchmark>`.
// For flamegraphs, run `cargo criterion --bench recursive-snark --features flamegraph -- --profile-time <secs>`.
// The results are located in `target/criterion/profile/<name-of-benchmark>`.
cfg_if::cfg_if! {
if #[cfg(feature = "flamegraph")] {
criterion_group! {
name = recursive_snark;
config = Criterion::default().warm_up_time(Duration::from_millis(3000)).with_profiler(pprof::criterion::PProfProfiler::new(100, pprof::criterion::Output::Flamegraph(None)));
targets = bench_recursive_snark
}
} else {
criterion_group! {
name = recursive_snark;
config = Criterion::default().warm_up_time(Duration::from_millis(3000));
targets = bench_recursive_snark
}
}
} }
criterion_main!(recursive_snark); criterion_main!(recursive_snark);

Loading…
Cancel
Save