57 lines
1.9 KiB
Rust
57 lines
1.9 KiB
Rust
use std::time::Instant;
|
|
|
|
use pow_sha256::ConfigBuilder;
|
|
|
|
use crate::utils::get_random;
|
|
|
|
#[derive(clap::Args, Debug, Clone)]
|
|
#[command(author, version, about, long_about = None)]
|
|
pub struct ForDiff {
|
|
#[arg(long)]
|
|
pub factors: String,
|
|
}
|
|
|
|
impl ForDiff {
|
|
pub fn run(&self) {
|
|
let factors: Vec<u32> = self
|
|
.factors
|
|
.split(',')
|
|
.map(|d| d.parse::<u32>().unwrap())
|
|
.collect();
|
|
let mut summary = String::new();
|
|
for difficulty in factors.iter() {
|
|
let trials = 100;
|
|
let mut times: Vec<u128> = Vec::with_capacity(trials);
|
|
|
|
for _ in 0..trials {
|
|
let salt = get_random(32);
|
|
let string = get_random(32);
|
|
let pow_config = ConfigBuilder::default().salt(salt.clone()).build().unwrap();
|
|
|
|
let start = Instant::now();
|
|
pow_config.prove_work(&string, *difficulty).unwrap();
|
|
let finish = Instant::now();
|
|
let time_elapsed = finish.duration_since(start);
|
|
|
|
let time = time_elapsed.as_micros();
|
|
log::info!("Difficulty factor {difficulty} generated in {time}");
|
|
times.push(time);
|
|
}
|
|
let mean = (times.iter().sum::<u128>() / trials as u128) as u32;
|
|
let simple_variance: u32 = (times
|
|
.iter()
|
|
.map(|d| {
|
|
let x = (*d as u32 - mean) as u32;
|
|
x * x
|
|
})
|
|
.sum::<u32>())
|
|
/ (trials as u32 - 1);
|
|
let simple_variance: usize = (simple_variance as f32).sqrt() as usize;
|
|
let min = times.iter().min().unwrap();
|
|
let max = times.iter().max().unwrap();
|
|
summary = format!("{summary}\ndifficulty: {difficulty} min: {min} max: {max} mean: {mean} variance {simple_variance}");
|
|
}
|
|
println!("{summary}");
|
|
}
|
|
}
|