arnaucube
arnaucube/NovaPublic Self-hosted repository
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
François Garillot 4142+huitseeker@users.noreply.github.com
Mon, 19 Jun 2023 18:52:39 -0400
commit

ff0370f50678a1d4fc2b9ca2da0fc2f8253ce356

parent

af886d6ce797a1030243c59bf9482200125776ee

4 files changed, 41 insertions(+), 8 deletions(-)

jump to
M .github/workflows/rust.yml → .github/workflows/rust.yml

@@ -25,6 +25,8 @@ - name: Wasm build

run: cargo build --target wasm32-unknown-unknown - name: Build examples run: cargo build --examples --verbose + - name: Build benches + run: cargo build --benches --verbose - name: Run tests run: cargo +stable test --release --verbose - name: Check Rustfmt Code Style
M Cargo.toml → Cargo.toml

@@ -40,6 +40,8 @@ [dev-dependencies]

criterion = { version = "0.4", features = ["html_reports"] } rand = "0.8.4" hex = "0.4.3" +pprof = { version = "0.11" } +cfg-if = "1.0.0" [[bench]] name = "recursive-snark"

@@ -59,3 +61,4 @@ # Compiles in portable mode, w/o ISA extensions => binary can be executed on all systems.

portable = ["pasta-msm/portable"] cuda = ["neptune/cuda", "neptune/pasta", "neptune/arity24"] opencl = ["neptune/opencl", "neptune/pasta", "neptune/arity24"] +flamegraph = ["pprof/flamegraph", "pprof/criterion"]
M benches/compressed-snark.rs → benches/compressed-snark.rs

@@ -22,10 +22,24 @@ type S2 = nova_snark::spartan::RelaxedR1CSSNARK<G2, EE2>;

type C1 = NonTrivialTestCircuit<<G1 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);
M benches/recursive-snark.rs → benches/recursive-snark.rs

@@ -18,10 +18,24 @@ type G2 = pasta_curves::vesta::Point;

type C1 = NonTrivialTestCircuit<<G1 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);