use num::ToPrimitive;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::Duration;
#[derive(Debug)]
pub struct Timing {
pub choose_best_split_not_root: TimingDuration,
pub choose_best_split_root: TimingDuration,
pub compute_binned_features: TimingDuration,
pub compute_binning_instructions: TimingDuration,
pub compute_gradients_and_hessians: TimingDuration,
pub rearrange_examples_index: TimingDuration,
pub sum_gradients_and_hessians_root: TimingDuration,
pub update_predictions: TimingDuration,
}
pub struct TimingDuration(AtomicU64);
impl Timing {
pub fn new() -> Timing {
Timing {
compute_binning_instructions: TimingDuration::new(),
compute_binned_features: TimingDuration::new(),
compute_gradients_and_hessians: TimingDuration::new(),
sum_gradients_and_hessians_root: TimingDuration::new(),
rearrange_examples_index: TimingDuration::new(),
choose_best_split_not_root: TimingDuration::new(),
choose_best_split_root: TimingDuration::new(),
update_predictions: TimingDuration::new(),
}
}
}
impl TimingDuration {
pub fn new() -> TimingDuration {
TimingDuration(AtomicU64::new(0))
}
pub fn get(&self) -> Duration {
Duration::from_nanos(self.0.load(Ordering::Relaxed))
}
pub fn inc(&self, value: Duration) -> u64 {
self.0
.fetch_add(value.as_nanos().to_u64().unwrap(), Ordering::Relaxed)
}
}
impl std::fmt::Debug for TimingDuration {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.get())
}
}