/* This file is part of DarkFi (https://dark.fi)
*
* Copyright (C) 2020-2026 Dyne.org foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
use criterion::{criterion_group, criterion_main, Criterion};
use equix_pow::{Challenge, EquiXBuilder, EquiXPow, Solution, SolverMemory, NONCE_LEN};
use rand::{seq::SliceRandom, Rng};
use std::hint::black_box;
fn new_challenge() -> Challenge {
let mut rng = rand::thread_rng();
let random: Vec = (0..32 + NONCE_LEN).map(|_| rng.gen()).collect();
Challenge(random)
}
fn new_equix() -> EquiXPow {
EquiXPow {
effort: 1000,
challenge: new_challenge(),
equix: EquiXBuilder::default(),
mem: SolverMemory::default(),
}
}
fn benchmark_equix_pow(c: &mut Criterion) {
let mut solutions: Vec<(Challenge, Solution)> = Vec::new();
let mut equix_pow = new_equix();
c.bench_function(&format!("EquiXPow::run effort={}", equix_pow.effort), |b| {
b.iter(|| {
equix_pow.challenge = new_challenge();
let solution = black_box(equix_pow.run().unwrap());
solutions.push((equix_pow.challenge.clone(), solution));
});
});
let equix_pow = new_equix();
c.bench_function(&format!("EquiXPow::verify effort={}", equix_pow.effort), |b| {
b.iter(|| {
let (challenge, solution) =
black_box(solutions.choose(&mut rand::thread_rng()).unwrap());
if let Err(e) = equix_pow.verify(challenge, solution) {
eprintln!("Verification failed: {:?}", e);
}
});
});
}
criterion_group!(benches, benchmark_equix_pow);
criterion_main!(benches);