use super::BrickProfiler;
use crate::brick::profiler::tile_stats::{TileLevel, TileStats, TileTimer};
use std::time::Instant;
impl BrickProfiler {
pub fn enable_tile_profiling(&mut self) {
self.tile_profiling_enabled = true;
}
pub fn disable_tile_profiling(&mut self) {
self.tile_profiling_enabled = false;
}
#[must_use]
pub fn is_tile_profiling_enabled(&self) -> bool {
self.tile_profiling_enabled
}
#[must_use]
pub fn start_tile(&self, level: TileLevel, row: u32, col: u32) -> TileTimer {
TileTimer { level, _row: row, _col: col, start: Instant::now() }
}
pub fn stop_tile(&mut self, timer: TileTimer, elements: u64, flops: u64) {
if !self.tile_profiling_enabled {
return;
}
let elapsed_ns = timer.start.elapsed().as_nanos() as u64;
let idx = timer.level as usize;
self.tile_stats[idx].add_sample(elapsed_ns, elements, flops);
}
#[must_use]
pub fn tile_stats(&self, level: TileLevel) -> &TileStats {
&self.tile_stats[level as usize]
}
pub fn tile_stats_mut(&mut self, level: TileLevel) -> &mut TileStats {
&mut self.tile_stats[level as usize]
}
#[must_use]
pub fn all_tile_stats(&self) -> &[TileStats; 3] {
&self.tile_stats
}
pub fn reset_tile_stats(&mut self) {
self.tile_stats = [
TileStats::new(TileLevel::Macro),
TileStats::new(TileLevel::Midi),
TileStats::new(TileLevel::Micro),
];
}
}