use profiler_macros::Metrics;
#[derive(Metrics)]
#[crate_path(crate)]
pub struct MetricsProvider {
#[new(perf_event::events::Hardware::CPU_CYCLES)]
#[config(show_spread = false)]
pub cycles: crate::PerfEventMetric,
#[new(perf_event::events::Software::TASK_CLOCK)]
pub task_clock: crate::PerfEventMetric,
#[new(perf_event::events::Hardware::INSTRUCTIONS)]
#[config(show_spread = false)]
pub instructions: crate::PerfEventMetric,
#[config(show_spread = false, show_baseline = false)]
pub wall_time: crate::InstantProvider,
#[raw_end_fn(calculate_ipc)]
#[config(show_spread = false, show_baseline = false)]
pub ipc: f64,
}
fn calculate_ipc(result: &<MetricsProvider as crate::Metrics>::Result) -> f64 {
let instructions = result.2;
let cycles = result.0;
if cycles == 0 {
0.0
} else {
instructions as f64 / cycles as f64
}
}