2016-08-28 10:30:40 -07:00
|
|
|
#![feature(test)]
|
|
|
|
extern crate test;
|
|
|
|
extern crate rand;
|
|
|
|
extern crate bn;
|
|
|
|
|
|
|
|
use bn::*;
|
|
|
|
|
2016-08-28 21:04:46 -07:00
|
|
|
#[bench]
|
|
|
|
fn fr_addition(b: &mut test::Bencher) {
|
|
|
|
const SAMPLES: usize = 1000;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] + v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn fr_subtraction(b: &mut test::Bencher) {
|
|
|
|
const SAMPLES: usize = 1000;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] - v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-08-28 10:30:40 -07:00
|
|
|
#[bench]
|
|
|
|
fn fr_multiplication(b: &mut test::Bencher) {
|
|
|
|
const SAMPLES: usize = 1000;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] * v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn fr_inverses(b: &mut test::Bencher) {
|
|
|
|
const SAMPLES: usize = 1000;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES].inverse()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-08-28 21:04:46 -07:00
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn g1_addition(b: &mut test::Bencher) {
|
|
|
|
const SAMPLES: usize = 100;
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] + v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn g1_subtraction(b: &mut test::Bencher) {
|
|
|
|
const SAMPLES: usize = 100;
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] - v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-08-28 10:30:40 -07:00
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn g1_scalar_multiplication(b: &mut test::Bencher) {
|
|
|
|
const SAMPLES: usize = 100;
|
2016-08-28 10:30:40 -07:00
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
2016-08-28 10:30:40 -07:00
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] * v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-08-28 21:04:46 -07:00
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn g2_addition(b: &mut test::Bencher) {
|
2016-08-28 21:04:46 -07:00
|
|
|
const SAMPLES: usize = 100;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] + v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn g2_subtraction(b: &mut test::Bencher) {
|
2016-08-28 21:04:46 -07:00
|
|
|
const SAMPLES: usize = 100;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] - v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn g2_scalar_multiplication(b: &mut test::Bencher) {
|
2016-08-28 21:04:46 -07:00
|
|
|
const SAMPLES: usize = 100;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
|
|
|
v1[ctr % SAMPLES] * v2[ctr % SAMPLES]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn fq12_scalar_multiplication(b: &mut test::Bencher) {
|
2016-08-28 21:04:46 -07:00
|
|
|
const SAMPLES: usize = 100;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
2016-09-11 01:19:11 -07:00
|
|
|
let v3: Vec<_> = (0..SAMPLES).map(|i| pairing(v1[i], v2[i])).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
v3[(ctr + SAMPLES/50) % SAMPLES] * v3[ctr % SAMPLES]
|
2016-08-28 21:04:46 -07:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn fq12_exponentiation(b: &mut test::Bencher) {
|
2016-08-28 21:04:46 -07:00
|
|
|
const SAMPLES: usize = 100;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
2016-09-11 01:19:11 -07:00
|
|
|
let v3: Vec<_> = (0..SAMPLES).map(|i| pairing(v1[i], v2[i])).collect();
|
|
|
|
let v4: Vec<_> = (0..SAMPLES).map(|_| Fr::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
v3[ctr % SAMPLES].pow(v4[ctr % SAMPLES])
|
2016-08-28 21:04:46 -07:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
2016-09-11 01:19:11 -07:00
|
|
|
fn perform_pairing(b: &mut test::Bencher) {
|
2016-08-28 21:04:46 -07:00
|
|
|
const SAMPLES: usize = 100;
|
|
|
|
|
|
|
|
let rng = &mut rand::thread_rng();
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
let v1: Vec<_> = (0..SAMPLES).map(|_| G1::random(rng)).collect();
|
|
|
|
let v2: Vec<_> = (0..SAMPLES).map(|_| G2::random(rng)).collect();
|
2016-08-28 21:04:46 -07:00
|
|
|
|
|
|
|
let mut ctr = 0;
|
|
|
|
|
|
|
|
b.iter(|| {
|
|
|
|
ctr += 1;
|
|
|
|
|
2016-09-11 01:19:11 -07:00
|
|
|
pairing(v1[ctr % SAMPLES], v2[ctr % SAMPLES])
|
2016-08-28 21:04:46 -07:00
|
|
|
});
|
|
|
|
}
|