diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 285d455..c78ad4a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,6 +30,13 @@ jobs: command: fmt args: --all -- --check --color always + # Build benchmarks to prevent bitrot + - name: Build benchmarks + uses: actions-rs/cargo@v1 + with: + command: build + args: --all --benches + test: name: Test on ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -110,10 +117,3 @@ jobs: with: command: doc args: --all --document-private-items - - # Build benchmarks to prevent bitrot - - name: Build benchmarks - uses: actions-rs/cargo@v1 - with: - command: build - args: --verbose --all --benches diff --git a/Cargo.lock b/Cargo.lock index b0dd6de..8e8c905 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -153,7 +153,7 @@ dependencies = [ name = "bls12_381" version = "0.1.0" dependencies = [ - "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -215,14 +215,6 @@ dependencies = [ "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "constant_time_eq" version = "0.1.4" @@ -230,23 +222,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "criterion" -version = "0.2.11" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion-plot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xoshiro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", @@ -256,10 +246,9 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -423,11 +412,6 @@ dependencies = [ "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "futures" version = "0.1.29" @@ -509,6 +493,7 @@ name = "jubjub" version = "0.3.0" dependencies = [ "bls12_381 0.1.0", + "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -615,6 +600,7 @@ name = "pairing" version = "0.15.0" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "ff 0.5.0", "group 0.2.0", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -696,19 +682,6 @@ dependencies = [ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "rand_core" version = "0.5.1" @@ -727,15 +700,11 @@ dependencies = [ [[package]] name = "rand_os" -version = "0.1.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -748,11 +717,10 @@ dependencies = [ [[package]] name = "rand_xoshiro" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -777,14 +745,6 @@ dependencies = [ "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "regex-automata" version = "0.1.8" @@ -1009,6 +969,7 @@ dependencies = [ "blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "blake2s_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "crypto_api_chachapoly 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "ff 0.5.0", "fpe 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1066,10 +1027,9 @@ dependencies = [ "checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be" "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120" -"checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" -"checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" +"checksum criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "938703e165481c8d612ea3479ac8342e5615185db37765162e762ec3523e2fc6" +"checksum criterion-plot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eccdc6ce8bbe352ca89025bee672aa6d24f4eb8c53e3a8b5d1bc58011da072a2" "checksum crossbeam 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2d818a4990769aac0c7ff1360e233ef3a41adcb009ebb2036bf6915eb0f6b23c" "checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" "checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" @@ -1086,7 +1046,6 @@ dependencies = [ "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum fpe 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "21988a326139165b75e3196bc6962ca638e5fb0c95102fbf152a3743174b01e4" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" @@ -1116,16 +1075,13 @@ dependencies = [ "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" "checksum rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d47eab0e83d9693d40f825f86948aa16eff6750ead4bdffc4ab95b8b3a7f052c" "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +"checksum rand_os 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a788ae3edb696cfcba1c19bfd388cc4b8c21f8a408432b199c072825084da58a" "checksum rand_xorshift 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" -"checksum rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929" +"checksum rand_xoshiro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e18c91676f670f6f0312764c759405f13afb98d5d73819840cf72a518487bff" "checksum rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83a27732a533a1be0a0035a111fe76db89ad312f6f0347004c220c57f209a123" "checksum rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98dcf634205083b17d0861252431eb2acbfb698ab7478a2d20de07954f47ec7b" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" "checksum ripemd160 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad5112e0dbbb87577bfbc56c42450235e3012ce336e29c5befd7807bd626da4a" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" diff --git a/bls12_381/Cargo.toml b/bls12_381/Cargo.toml index 0bfb0d4..6e77fb5 100644 --- a/bls12_381/Cargo.toml +++ b/bls12_381/Cargo.toml @@ -13,7 +13,7 @@ edition = "2018" rustdoc-args = [ "--html-in-header", "katex-header.html" ] [dev-dependencies] -criterion = "0.2.11" +criterion = "0.3" [[bench]] name = "groups" diff --git a/jubjub/Cargo.toml b/jubjub/Cargo.toml index 47f3b74..31221ef 100644 --- a/jubjub/Cargo.toml +++ b/jubjub/Cargo.toml @@ -22,6 +22,9 @@ default-features = false version = "^2.2.1" default-features = false +[dev-dependencies] +criterion = "0.3" + [dev-dependencies.rand_core] version = "0.5" default-features = false @@ -32,3 +35,15 @@ default-features = false [features] default = [] + +[[bench]] +name = "fq_bench" +harness = false + +[[bench]] +name = "fr_bench" +harness = false + +[[bench]] +name = "point_bench" +harness = false diff --git a/jubjub/benches/fq_bench.rs b/jubjub/benches/fq_bench.rs index 39fc148..65eceaf 100644 --- a/jubjub/benches/fq_bench.rs +++ b/jubjub/benches/fq_bench.rs @@ -1,51 +1,58 @@ -#![feature(test)] - -extern crate test; - +use criterion::{criterion_group, criterion_main, Criterion}; use jubjub::*; -use test::Bencher; -#[bench] -fn bench_mul_assign(bencher: &mut Bencher) { +fn bench_add_assign(c: &mut Criterion) { let mut n = Fq::one(); - let b = -Fq::one(); - bencher.iter(move || { - n *= &b; + let neg_one = -Fq::one(); + c.bench_function("Fq add_assign", |b| { + b.iter(move || { + n += &neg_one; + }) }); } -#[bench] -fn bench_sub_assign(bencher: &mut Bencher) { +fn bench_sub_assign(c: &mut Criterion) { let mut n = Fq::one(); - let b = -Fq::one(); - bencher.iter(move || { - n -= &b; + let neg_one = -Fq::one(); + c.bench_function("Fq sub_assign", |b| { + b.iter(move || { + n -= &neg_one; + }) }); } -#[bench] -fn bench_add_assign(bencher: &mut Bencher) { +fn bench_mul_assign(c: &mut Criterion) { let mut n = Fq::one(); - let b = -Fq::one(); - bencher.iter(move || { - n += &b; + let neg_one = -Fq::one(); + c.bench_function("Fq mul_assign", |b| { + b.iter(move || { + n *= &neg_one; + }) }); } -#[bench] -fn bench_square_assign(bencher: &mut Bencher) { +fn bench_square(c: &mut Criterion) { let n = Fq::one(); - bencher.iter(move || n.square()); + c.bench_function("Fq square", |b| b.iter(move || n.square())); } -#[bench] -fn bench_invert(bencher: &mut Bencher) { +fn bench_invert(c: &mut Criterion) { let n = Fq::one(); - bencher.iter(move || n.invert()); + c.bench_function("Fq invert", |b| b.iter(move || n.invert())); } -#[bench] -fn bench_sqrt(bencher: &mut Bencher) { +fn bench_sqrt(c: &mut Criterion) { let n = Fq::one().double().double(); - bencher.iter(move || n.sqrt()); + c.bench_function("Fq sqrt", |b| b.iter(move || n.sqrt())); } + +criterion_group!( + benches, + bench_add_assign, + bench_sub_assign, + bench_mul_assign, + bench_square, + bench_invert, + bench_sqrt, +); +criterion_main!(benches); diff --git a/jubjub/benches/fr_bench.rs b/jubjub/benches/fr_bench.rs index b84c1b5..8dc9ce2 100644 --- a/jubjub/benches/fr_bench.rs +++ b/jubjub/benches/fr_bench.rs @@ -1,51 +1,58 @@ -#![feature(test)] - -extern crate test; - +use criterion::{criterion_group, criterion_main, Criterion}; use jubjub::*; -use test::Bencher; -#[bench] -fn bench_mul_assign(bencher: &mut Bencher) { +fn bench_add_assign(c: &mut Criterion) { let mut n = Fr::one(); - let b = -Fr::one(); - bencher.iter(move || { - n *= &b; + let neg_one = -Fr::one(); + c.bench_function("Fr add_assign", |b| { + b.iter(move || { + n += &neg_one; + }) }); } -#[bench] -fn bench_sub_assign(bencher: &mut Bencher) { +fn bench_sub_assign(c: &mut Criterion) { let mut n = Fr::one(); - let b = -Fr::one(); - bencher.iter(move || { - n -= &b; + let neg_one = -Fr::one(); + c.bench_function("Fr sub_assign", |b| { + b.iter(move || { + n -= &neg_one; + }) }); } -#[bench] -fn bench_add_assign(bencher: &mut Bencher) { +fn bench_mul_assign(c: &mut Criterion) { let mut n = Fr::one(); - let b = -Fr::one(); - bencher.iter(move || { - n += &b; + let neg_one = -Fr::one(); + c.bench_function("Fr mul_assign", |b| { + b.iter(move || { + n *= &neg_one; + }) }); } -#[bench] -fn bench_square_assign(bencher: &mut Bencher) { +fn bench_square(c: &mut Criterion) { let n = Fr::one(); - bencher.iter(move || n.square()); + c.bench_function("Fr square", |b| b.iter(move || n.square())); } -#[bench] -fn bench_invert(bencher: &mut Bencher) { +fn bench_invert(c: &mut Criterion) { let n = Fr::one(); - bencher.iter(move || n.invert()); + c.bench_function("Fr invert", |b| b.iter(move || n.invert())); } -#[bench] -fn bench_sqrt(bencher: &mut Bencher) { +fn bench_sqrt(c: &mut Criterion) { let n = Fr::one().double().double(); - bencher.iter(move || n.sqrt()); + c.bench_function("Fr sqrt", |b| b.iter(move || n.sqrt())); } + +criterion_group!( + benches, + bench_add_assign, + bench_sub_assign, + bench_mul_assign, + bench_square, + bench_invert, + bench_sqrt, +); +criterion_main!(benches); diff --git a/jubjub/benches/point_bench.rs b/jubjub/benches/point_bench.rs index d5b33a9..1659ea5 100644 --- a/jubjub/benches/point_bench.rs +++ b/jubjub/benches/point_bench.rs @@ -1,58 +1,73 @@ -#![feature(test)] - -extern crate test; - +use criterion::{criterion_group, criterion_main, Criterion}; use jubjub::*; -use test::Bencher; // Non-Niels -#[bench] -fn bench_point_doubling(bencher: &mut Bencher) { +fn bench_point_doubling(c: &mut Criterion) { let a = ExtendedPoint::identity(); - bencher.iter(move || a.double()); + c.bench_function("Jubjub point doubling", |bencher| { + bencher.iter(move || a.double()) + }); } -#[bench] -fn bench_point_addition(bencher: &mut Bencher) { +fn bench_point_addition(c: &mut Criterion) { let a = ExtendedPoint::identity(); let b = -ExtendedPoint::identity(); - bencher.iter(move || a + b); + c.bench_function("Jubjub point addition", |bencher| { + bencher.iter(move || a + b) + }); } -#[bench] -fn bench_point_subtraction(bencher: &mut Bencher) { +fn bench_point_subtraction(c: &mut Criterion) { let a = ExtendedPoint::identity(); let b = -ExtendedPoint::identity(); - bencher.iter(move || a + b); + c.bench_function("Jubjub point subtraction", |bencher| { + bencher.iter(move || a + b) + }); } // Niels -#[bench] -fn bench_cached_point_addition(bencher: &mut Bencher) { +fn bench_cached_point_addition(c: &mut Criterion) { let a = ExtendedPoint::identity(); let b = ExtendedPoint::identity().to_niels(); - bencher.iter(move || &a + &b); + c.bench_function("Jubjub cached point addition", |bencher| { + bencher.iter(move || a + b) + }); } -#[bench] -fn bench_cached_affine_point_subtraction(bencher: &mut Bencher) { - let a = ExtendedPoint::identity(); - let b = AffinePoint::identity().to_niels(); - bencher.iter(move || &a + &b); -} - -#[bench] -fn bench_cached_point_subtraction(bencher: &mut Bencher) { +fn bench_cached_point_subtraction(c: &mut Criterion) { let a = ExtendedPoint::identity(); let b = ExtendedPoint::identity().to_niels(); - bencher.iter(move || &a + &b); + c.bench_function("Jubjub cached point subtraction", |bencher| { + bencher.iter(move || a + b) + }); } -#[bench] -fn bench_cached_affine_point_addition(bencher: &mut Bencher) { +fn bench_cached_affine_point_addition(c: &mut Criterion) { let a = ExtendedPoint::identity(); let b = AffinePoint::identity().to_niels(); - bencher.iter(move || &a + &b); + c.bench_function("Jubjub cached affine point addition", |bencher| { + bencher.iter(move || a + b) + }); } + +fn bench_cached_affine_point_subtraction(c: &mut Criterion) { + let a = ExtendedPoint::identity(); + let b = AffinePoint::identity().to_niels(); + c.bench_function("Jubjub cached affine point subtraction", |bencher| { + bencher.iter(move || a + b) + }); +} + +criterion_group!( + benches, + bench_point_doubling, + bench_point_addition, + bench_point_subtraction, + bench_cached_point_addition, + bench_cached_point_subtraction, + bench_cached_affine_point_addition, + bench_cached_affine_point_subtraction, +); +criterion_main!(benches); diff --git a/pairing/Cargo.toml b/pairing/Cargo.toml index 32fc1be..8c9e291 100644 --- a/pairing/Cargo.toml +++ b/pairing/Cargo.toml @@ -24,6 +24,7 @@ rand_core = "0.5" subtle = "2.2.1" [dev-dependencies] +criterion = "0.3" rand_xorshift = "0.2" [features] @@ -31,5 +32,9 @@ unstable-features = ["expose-arith"] expose-arith = [] default = [] +[[bench]] +name = "pairing_benches" +harness = false + [badges] maintenance = { status = "actively-developed" } diff --git a/pairing/benches/bls12_381/ec.rs b/pairing/benches/bls12_381/ec.rs index 04bed0d..3411362 100644 --- a/pairing/benches/bls12_381/ec.rs +++ b/pairing/benches/bls12_381/ec.rs @@ -1,4 +1,5 @@ -mod g1 { +pub(crate) mod g1 { + use criterion::{criterion_group, Criterion}; use rand_core::SeedableRng; use rand_xorshift::XorShiftRng; @@ -6,8 +7,7 @@ mod g1 { use group::CurveProjective; use pairing::bls12_381::*; - #[bench] - fn bench_g1_mul_assign(b: &mut ::test::Bencher) { + fn bench_g1_mul_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -20,16 +20,17 @@ mod g1 { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.mul_assign(v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("G1::mul_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.mul_assign(v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } - #[bench] - fn bench_g1_add_assign(b: &mut ::test::Bencher) { + fn bench_g1_add_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -42,16 +43,17 @@ mod g1 { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("G1::add_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } - #[bench] - fn bench_g1_add_assign_mixed(b: &mut ::test::Bencher) { + fn bench_g1_add_assign_mixed(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -64,16 +66,26 @@ mod g1 { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_assign_mixed(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("G1::add_assign_mixed", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_assign_mixed(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } + + criterion_group!( + benches, + bench_g1_add_assign, + bench_g1_add_assign_mixed, + bench_g1_mul_assign, + ); } -mod g2 { +pub(crate) mod g2 { + use criterion::{criterion_group, Criterion}; use rand_core::SeedableRng; use rand_xorshift::XorShiftRng; @@ -81,8 +93,7 @@ mod g2 { use group::CurveProjective; use pairing::bls12_381::*; - #[bench] - fn bench_g2_mul_assign(b: &mut ::test::Bencher) { + fn bench_g2_mul_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -95,16 +106,17 @@ mod g2 { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.mul_assign(v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("G2::mul_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.mul_assign(v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } - #[bench] - fn bench_g2_add_assign(b: &mut ::test::Bencher) { + fn bench_g2_add_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -117,16 +129,17 @@ mod g2 { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("G2::add_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } - #[bench] - fn bench_g2_add_assign_mixed(b: &mut ::test::Bencher) { + fn bench_g2_add_assign_mixed(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -139,11 +152,20 @@ mod g2 { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_assign_mixed(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("G2::add_assign_mixed", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_assign_mixed(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } + + criterion_group!( + benches, + bench_g2_add_assign, + bench_g2_add_assign_mixed, + bench_g2_mul_assign, + ); } diff --git a/pairing/benches/bls12_381/fq.rs b/pairing/benches/bls12_381/fq.rs index 5ef5768..244c161 100644 --- a/pairing/benches/bls12_381/fq.rs +++ b/pairing/benches/bls12_381/fq.rs @@ -1,3 +1,4 @@ +use criterion::{criterion_group, Criterion}; use rand_core::SeedableRng; use rand_xorshift::XorShiftRng; use std::ops::{AddAssign, MulAssign, Neg, SubAssign}; @@ -5,8 +6,7 @@ use std::ops::{AddAssign, MulAssign, Neg, SubAssign}; use ff::{Field, PrimeField, PrimeFieldRepr, SqrtField}; use pairing::bls12_381::*; -#[bench] -fn bench_fq_repr_add_nocarry(b: &mut ::test::Bencher) { +fn bench_fq_repr_add_nocarry(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -28,16 +28,17 @@ fn bench_fq_repr_add_nocarry(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_nocarry(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FqRepr::add_nocarry", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_nocarry(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_repr_sub_noborrow(b: &mut ::test::Bencher) { +fn bench_fq_repr_sub_noborrow(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -58,16 +59,17 @@ fn bench_fq_repr_sub_noborrow(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.sub_noborrow(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FqRepr::sub_noborrow", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.sub_noborrow(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_repr_num_bits(b: &mut ::test::Bencher) { +fn bench_fq_repr_num_bits(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -80,15 +82,16 @@ fn bench_fq_repr_num_bits(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].num_bits(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FqRepr::num_bits", |b| { + b.iter(|| { + let tmp = v[count].num_bits(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_repr_mul2(b: &mut ::test::Bencher) { +fn bench_fq_repr_mul2(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -101,16 +104,17 @@ fn bench_fq_repr_mul2(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count]; - tmp.mul2(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FqRepr::mul2", |b| { + b.iter(|| { + let mut tmp = v[count]; + tmp.mul2(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_repr_div2(b: &mut ::test::Bencher) { +fn bench_fq_repr_div2(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -123,16 +127,17 @@ fn bench_fq_repr_div2(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count]; - tmp.div2(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FqRepr::div2", |b| { + b.iter(|| { + let mut tmp = v[count]; + tmp.div2(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_add_assign(b: &mut ::test::Bencher) { +fn bench_fq_add_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -145,16 +150,17 @@ fn bench_fq_add_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq::add_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_sub_assign(b: &mut ::test::Bencher) { +fn bench_fq_sub_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -167,16 +173,17 @@ fn bench_fq_sub_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.sub_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq::sub_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.sub_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_mul_assign(b: &mut ::test::Bencher) { +fn bench_fq_mul_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -189,16 +196,17 @@ fn bench_fq_mul_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.mul_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq::mul_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.mul_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_square(b: &mut ::test::Bencher) { +fn bench_fq_square(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -209,15 +217,16 @@ fn bench_fq_square(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].square(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq::square", |b| { + b.iter(|| { + let tmp = v[count].square(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_invert(b: &mut ::test::Bencher) { +fn bench_fq_invert(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -228,14 +237,15 @@ fn bench_fq_invert(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - count = (count + 1) % SAMPLES; - v[count].invert() + c.bench_function("Fq::invert", |b| { + b.iter(|| { + count = (count + 1) % SAMPLES; + v[count].invert() + }) }); } -#[bench] -fn bench_fq_neg(b: &mut ::test::Bencher) { +fn bench_fq_neg(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -246,15 +256,16 @@ fn bench_fq_neg(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].neg(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq::neg", |b| { + b.iter(|| { + let tmp = v[count].neg(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq_sqrt(b: &mut ::test::Bencher) { +fn bench_fq_sqrt(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -267,14 +278,15 @@ fn bench_fq_sqrt(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - count = (count + 1) % SAMPLES; - v[count].sqrt() + c.bench_function("Fq::sqrt", |b| { + b.iter(|| { + count = (count + 1) % SAMPLES; + v[count].sqrt() + }) }); } -#[bench] -fn bench_fq_into_repr(b: &mut ::test::Bencher) { +fn bench_fq_into_repr(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -285,14 +297,15 @@ fn bench_fq_into_repr(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - count = (count + 1) % SAMPLES; - v[count].into_repr() + c.bench_function("Fq::into_repr", |b| { + b.iter(|| { + count = (count + 1) % SAMPLES; + v[count].into_repr() + }) }); } -#[bench] -fn bench_fq_from_repr(b: &mut ::test::Bencher) { +fn bench_fq_from_repr(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -305,8 +318,28 @@ fn bench_fq_from_repr(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - count = (count + 1) % SAMPLES; - Fq::from_repr(v[count]) + c.bench_function("Fq::from_repr", |b| { + b.iter(|| { + count = (count + 1) % SAMPLES; + Fq::from_repr(v[count]) + }) }); } + +criterion_group!( + benches, + bench_fq_repr_add_nocarry, + bench_fq_repr_sub_noborrow, + bench_fq_repr_num_bits, + bench_fq_repr_mul2, + bench_fq_repr_div2, + bench_fq_add_assign, + bench_fq_sub_assign, + bench_fq_mul_assign, + bench_fq_square, + bench_fq_invert, + bench_fq_neg, + bench_fq_sqrt, + bench_fq_into_repr, + bench_fq_from_repr, +); diff --git a/pairing/benches/bls12_381/fq12.rs b/pairing/benches/bls12_381/fq12.rs index eedd9f8..2d6ed49 100644 --- a/pairing/benches/bls12_381/fq12.rs +++ b/pairing/benches/bls12_381/fq12.rs @@ -1,3 +1,4 @@ +use criterion::{criterion_group, Criterion}; use rand_core::SeedableRng; use rand_xorshift::XorShiftRng; use std::ops::{AddAssign, MulAssign, SubAssign}; @@ -5,8 +6,7 @@ use std::ops::{AddAssign, MulAssign, SubAssign}; use ff::Field; use pairing::bls12_381::*; -#[bench] -fn bench_fq12_add_assign(b: &mut ::test::Bencher) { +fn bench_fq12_add_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -19,16 +19,17 @@ fn bench_fq12_add_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq12::add_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq12_sub_assign(b: &mut ::test::Bencher) { +fn bench_fq12_sub_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -41,16 +42,17 @@ fn bench_fq12_sub_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.sub_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq12::sub_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.sub_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq12_mul_assign(b: &mut ::test::Bencher) { +fn bench_fq12_mul_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -63,16 +65,17 @@ fn bench_fq12_mul_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.mul_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq12::mul_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.mul_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq12_squaring(b: &mut ::test::Bencher) { +fn bench_fq12_squaring(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -83,15 +86,16 @@ fn bench_fq12_squaring(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq12::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].square(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq12::square", |b| { + b.iter(|| { + let tmp = v[count].square(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq12_invert(b: &mut ::test::Bencher) { +fn bench_fq12_invert(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -102,9 +106,20 @@ fn bench_fq12_invert(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq12::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].invert(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq12::invert", |b| { + b.iter(|| { + let tmp = v[count].invert(); + count = (count + 1) % SAMPLES; + tmp + }) }); } + +criterion_group!( + benches, + bench_fq12_add_assign, + bench_fq12_sub_assign, + bench_fq12_mul_assign, + bench_fq12_squaring, + bench_fq12_invert, +); diff --git a/pairing/benches/bls12_381/fq2.rs b/pairing/benches/bls12_381/fq2.rs index d3a2b4d..1eebb92 100644 --- a/pairing/benches/bls12_381/fq2.rs +++ b/pairing/benches/bls12_381/fq2.rs @@ -1,3 +1,4 @@ +use criterion::{criterion_group, Criterion}; use rand_core::SeedableRng; use rand_xorshift::XorShiftRng; use std::ops::{AddAssign, MulAssign, SubAssign}; @@ -5,8 +6,7 @@ use std::ops::{AddAssign, MulAssign, SubAssign}; use ff::{Field, SqrtField}; use pairing::bls12_381::*; -#[bench] -fn bench_fq2_add_assign(b: &mut ::test::Bencher) { +fn bench_fq2_add_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -19,16 +19,17 @@ fn bench_fq2_add_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq2::add_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq2_sub_assign(b: &mut ::test::Bencher) { +fn bench_fq2_sub_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -41,16 +42,17 @@ fn bench_fq2_sub_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.sub_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq2::sub_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.sub_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq2_mul_assign(b: &mut ::test::Bencher) { +fn bench_fq2_mul_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -63,16 +65,17 @@ fn bench_fq2_mul_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.mul_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq2::mul_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.mul_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq2_squaring(b: &mut ::test::Bencher) { +fn bench_fq2_squaring(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -83,15 +86,16 @@ fn bench_fq2_squaring(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq2::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].square(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq2::square", |b| { + b.iter(|| { + let tmp = v[count].square(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq2_invert(b: &mut ::test::Bencher) { +fn bench_fq2_invert(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -102,15 +106,16 @@ fn bench_fq2_invert(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq2::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].invert(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq2::invert", |b| { + b.iter(|| { + let tmp = v[count].invert(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fq2_sqrt(b: &mut ::test::Bencher) { +fn bench_fq2_sqrt(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -121,9 +126,21 @@ fn bench_fq2_sqrt(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fq2::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].sqrt(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fq2::sqrt", |b| { + b.iter(|| { + let tmp = v[count].sqrt(); + count = (count + 1) % SAMPLES; + tmp + }) }); } + +criterion_group!( + benches, + bench_fq2_add_assign, + bench_fq2_sub_assign, + bench_fq2_mul_assign, + bench_fq2_squaring, + bench_fq2_invert, + bench_fq2_sqrt, +); diff --git a/pairing/benches/bls12_381/fr.rs b/pairing/benches/bls12_381/fr.rs index 4e3d4c2..d2dbc4c 100644 --- a/pairing/benches/bls12_381/fr.rs +++ b/pairing/benches/bls12_381/fr.rs @@ -1,3 +1,4 @@ +use criterion::{criterion_group, Criterion}; use rand_core::SeedableRng; use rand_xorshift::XorShiftRng; use std::ops::{AddAssign, MulAssign, Neg, SubAssign}; @@ -5,8 +6,7 @@ use std::ops::{AddAssign, MulAssign, Neg, SubAssign}; use ff::{Field, PrimeField, PrimeFieldRepr, SqrtField}; use pairing::bls12_381::*; -#[bench] -fn bench_fr_repr_add_nocarry(b: &mut ::test::Bencher) { +fn bench_fr_repr_add_nocarry(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -28,16 +28,17 @@ fn bench_fr_repr_add_nocarry(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_nocarry(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FrRepr::add_nocarry", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_nocarry(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_repr_sub_noborrow(b: &mut ::test::Bencher) { +fn bench_fr_repr_sub_noborrow(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -58,16 +59,17 @@ fn bench_fr_repr_sub_noborrow(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.sub_noborrow(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FrRepr::sub_noborrow", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.sub_noborrow(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_repr_num_bits(b: &mut ::test::Bencher) { +fn bench_fr_repr_num_bits(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -80,15 +82,16 @@ fn bench_fr_repr_num_bits(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].num_bits(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FrRepr::num_bits", |b| { + b.iter(|| { + let tmp = v[count].num_bits(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_repr_mul2(b: &mut ::test::Bencher) { +fn bench_fr_repr_mul2(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -101,16 +104,17 @@ fn bench_fr_repr_mul2(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count]; - tmp.mul2(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FrRepr::mul2", |b| { + b.iter(|| { + let mut tmp = v[count]; + tmp.mul2(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_repr_div2(b: &mut ::test::Bencher) { +fn bench_fr_repr_div2(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -123,16 +127,17 @@ fn bench_fr_repr_div2(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count]; - tmp.div2(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("FrRepr::div2", |b| { + b.iter(|| { + let mut tmp = v[count]; + tmp.div2(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_add_assign(b: &mut ::test::Bencher) { +fn bench_fr_add_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -145,16 +150,17 @@ fn bench_fr_add_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.add_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fr::add_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.add_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_sub_assign(b: &mut ::test::Bencher) { +fn bench_fr_sub_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -167,16 +173,17 @@ fn bench_fr_sub_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.sub_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fr::sub_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.sub_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_mul_assign(b: &mut ::test::Bencher) { +fn bench_fr_mul_assign(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -189,16 +196,17 @@ fn bench_fr_mul_assign(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let mut tmp = v[count].0; - tmp.mul_assign(&v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fr::mul_assign", |b| { + b.iter(|| { + let mut tmp = v[count].0; + tmp.mul_assign(&v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_square(b: &mut ::test::Bencher) { +fn bench_fr_square(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -209,15 +217,16 @@ fn bench_fr_square(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fr::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].square(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fr::square", |b| { + b.iter(|| { + let tmp = v[count].square(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_invert(b: &mut ::test::Bencher) { +fn bench_fr_invert(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -228,14 +237,15 @@ fn bench_fr_invert(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fr::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - count = (count + 1) % SAMPLES; - v[count].invert() + c.bench_function("Fr::invert", |b| { + b.iter(|| { + count = (count + 1) % SAMPLES; + v[count].invert() + }) }); } -#[bench] -fn bench_fr_neg(b: &mut ::test::Bencher) { +fn bench_fr_neg(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -246,15 +256,16 @@ fn bench_fr_neg(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fr::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = v[count].neg(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Fr::neg", |b| { + b.iter(|| { + let tmp = v[count].neg(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_fr_sqrt(b: &mut ::test::Bencher) { +fn bench_fr_sqrt(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -267,14 +278,15 @@ fn bench_fr_sqrt(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - count = (count + 1) % SAMPLES; - v[count].sqrt() + c.bench_function("Fr::sqrt", |b| { + b.iter(|| { + count = (count + 1) % SAMPLES; + v[count].sqrt() + }) }); } -#[bench] -fn bench_fr_into_repr(b: &mut ::test::Bencher) { +fn bench_fr_into_repr(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -285,14 +297,15 @@ fn bench_fr_into_repr(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| Fr::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - count = (count + 1) % SAMPLES; - v[count].into_repr() + c.bench_function("Fr::into_repr", |b| { + b.iter(|| { + count = (count + 1) % SAMPLES; + v[count].into_repr() + }) }); } -#[bench] -fn bench_fr_from_repr(b: &mut ::test::Bencher) { +fn bench_fr_from_repr(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -305,8 +318,28 @@ fn bench_fr_from_repr(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - count = (count + 1) % SAMPLES; - Fr::from_repr(v[count]) + c.bench_function("Fr::from_repr", |b| { + b.iter(|| { + count = (count + 1) % SAMPLES; + Fr::from_repr(v[count]) + }) }); } + +criterion_group!( + benches, + bench_fr_repr_add_nocarry, + bench_fr_repr_sub_noborrow, + bench_fr_repr_num_bits, + bench_fr_repr_mul2, + bench_fr_repr_div2, + bench_fr_add_assign, + bench_fr_sub_assign, + bench_fr_mul_assign, + bench_fr_square, + bench_fr_invert, + bench_fr_neg, + bench_fr_sqrt, + bench_fr_into_repr, + bench_fr_from_repr, +); diff --git a/pairing/benches/bls12_381/mod.rs b/pairing/benches/bls12_381/mod.rs index 2c23c2a..aa2e2f0 100644 --- a/pairing/benches/bls12_381/mod.rs +++ b/pairing/benches/bls12_381/mod.rs @@ -1,9 +1,10 @@ -mod ec; -mod fq; -mod fq12; -mod fq2; -mod fr; +pub(crate) mod ec; +pub(crate) mod fq; +pub(crate) mod fq12; +pub(crate) mod fq2; +pub(crate) mod fr; +use criterion::{criterion_group, Criterion}; use rand_core::SeedableRng; use rand_xorshift::XorShiftRng; @@ -11,8 +12,7 @@ use group::CurveProjective; use pairing::bls12_381::*; use pairing::{Engine, PairingCurveAffine}; -#[bench] -fn bench_pairing_g1_preparation(b: &mut ::test::Bencher) { +fn bench_pairing_g1_preparation(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -23,15 +23,16 @@ fn bench_pairing_g1_preparation(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| G1::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = G1Affine::from(v[count]).prepare(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("G1 preparation", |b| { + b.iter(|| { + let tmp = G1Affine::from(v[count]).prepare(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_pairing_g2_preparation(b: &mut ::test::Bencher) { +fn bench_pairing_g2_preparation(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -42,15 +43,16 @@ fn bench_pairing_g2_preparation(b: &mut ::test::Bencher) { let v: Vec = (0..SAMPLES).map(|_| G2::random(&mut rng)).collect(); let mut count = 0; - b.iter(|| { - let tmp = G2Affine::from(v[count]).prepare(); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("G2 preparation", |b| { + b.iter(|| { + let tmp = G2Affine::from(v[count]).prepare(); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_pairing_miller_loop(b: &mut ::test::Bencher) { +fn bench_pairing_miller_loop(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -68,15 +70,16 @@ fn bench_pairing_miller_loop(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let tmp = Bls12::miller_loop(&[(&v[count].0, &v[count].1)]); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Miller loop", |b| { + b.iter(|| { + let tmp = Bls12::miller_loop(&[(&v[count].0, &v[count].1)]); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_pairing_final_exponentiation(b: &mut ::test::Bencher) { +fn bench_pairing_final_exponentiation(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -95,15 +98,16 @@ fn bench_pairing_final_exponentiation(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let tmp = Bls12::final_exponentiation(&v[count]); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Final exponentiation", |b| { + b.iter(|| { + let tmp = Bls12::final_exponentiation(&v[count]); + count = (count + 1) % SAMPLES; + tmp + }) }); } -#[bench] -fn bench_pairing_full(b: &mut ::test::Bencher) { +fn bench_pairing_full(c: &mut Criterion) { const SAMPLES: usize = 1000; let mut rng = XorShiftRng::from_seed([ @@ -116,9 +120,20 @@ fn bench_pairing_full(b: &mut ::test::Bencher) { .collect(); let mut count = 0; - b.iter(|| { - let tmp = Bls12::pairing(v[count].0, v[count].1); - count = (count + 1) % SAMPLES; - tmp + c.bench_function("Full pairing", |b| { + b.iter(|| { + let tmp = Bls12::pairing(v[count].0, v[count].1); + count = (count + 1) % SAMPLES; + tmp + }) }); } + +criterion_group!( + benches, + bench_pairing_g1_preparation, + bench_pairing_g2_preparation, + bench_pairing_miller_loop, + bench_pairing_final_exponentiation, + bench_pairing_full, +); diff --git a/pairing/benches/pairing_benches.rs b/pairing/benches/pairing_benches.rs index b083b42..7abc824 100644 --- a/pairing/benches/pairing_benches.rs +++ b/pairing/benches/pairing_benches.rs @@ -1,10 +1,12 @@ -#![feature(test)] - -extern crate ff; -extern crate group; -extern crate pairing; -extern crate rand_core; -extern crate rand_xorshift; -extern crate test; - +use criterion::criterion_main; mod bls12_381; + +criterion_main!( + bls12_381::benches, + bls12_381::ec::g1::benches, + bls12_381::ec::g2::benches, + bls12_381::fq::benches, + bls12_381::fq12::benches, + bls12_381::fq2::benches, + bls12_381::fr::benches, +); diff --git a/zcash_primitives/Cargo.toml b/zcash_primitives/Cargo.toml index 8ebbbb2..fdfc573 100644 --- a/zcash_primitives/Cargo.toml +++ b/zcash_primitives/Cargo.toml @@ -31,11 +31,16 @@ sha2 = "0.8" subtle = "2.2.1" [dev-dependencies] +criterion = "0.3" hex-literal = "0.2" rand_xorshift = "0.2" [features] transparent-inputs = ["ripemd160", "secp256k1"] +[[bench]] +name = "pedersen_hash" +harness = false + [badges] maintenance = { status = "actively-developed" } diff --git a/zcash_primitives/benches/pedersen_hash.rs b/zcash_primitives/benches/pedersen_hash.rs index 3ea652a..6510936 100644 --- a/zcash_primitives/benches/pedersen_hash.rs +++ b/zcash_primitives/benches/pedersen_hash.rs @@ -1,17 +1,10 @@ -#![feature(test)] - -extern crate pairing; -extern crate rand_core; -extern crate test; -extern crate zcash_primitives; - +use criterion::{criterion_group, criterion_main, Criterion}; use pairing::bls12_381::Bls12; use rand_core::{OsRng, RngCore}; use zcash_primitives::jubjub::JubjubBls12; use zcash_primitives::pedersen_hash::{pedersen_hash, Personalization}; -#[bench] -fn bench_pedersen_hash(b: &mut test::Bencher) { +fn bench_pedersen_hash(c: &mut Criterion) { let params = JubjubBls12::new(); let rng = &mut OsRng; let bits = (0..510) @@ -19,5 +12,10 @@ fn bench_pedersen_hash(b: &mut test::Bencher) { .collect::>(); let personalization = Personalization::MerkleTree(31); - b.iter(|| pedersen_hash::(personalization, bits.clone(), ¶ms)); + c.bench_function("Pedersen hash", |b| { + b.iter(|| pedersen_hash::(personalization, bits.clone(), ¶ms)) + }); } + +criterion_group!(benches, bench_pedersen_hash); +criterion_main!(benches);