use super::latency;
use sha2::{Digest, Sha256};
use std::{hint::black_box, thread, time::Duration};
pub fn fake_work(target_latency: Duration) {
thread::sleep(target_latency);
}
pub fn busy_work(effort: u32) {
let extent = black_box(effort);
let seed = black_box(0_u64);
let buf = seed.to_be_bytes();
let mut hasher = Sha256::new();
for _ in 0..extent {
hasher.update(buf);
}
let hash = hasher.finalize();
black_box(hash);
}
pub fn calibrate_busy_work(target_latency: Duration) -> u32 {
const CALIBRATION_EFFORT: u32 = 200_000;
calibrate_busy_work_x(CALIBRATION_EFFORT, target_latency)
}
pub fn calibrate_busy_work_x(calibration_effort: u32, target_latency: Duration) -> u32 {
let latency = latency(|| busy_work(calibration_effort));
(target_latency.as_nanos() * calibration_effort as u128 / latency.as_nanos()) as u32
}