use super::mark_stats::pct;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub(crate) struct HsMarkSplit {
pub scan_ns: u64,
pub dropped_ns: u64,
}
impl HsMarkSplit {
pub fn total_ns(&self) -> u64 {
self.scan_ns + self.dropped_ns
}
pub fn scan_pct(&self) -> f64 {
pct(self.scan_ns, self.total_ns())
}
pub fn dropped_pct(&self) -> f64 {
pct(self.dropped_ns, self.total_ns())
}
pub fn any_recorded(&self) -> bool {
self.total_ns() > 0
}
}
pub(crate) fn format_hs_mark_split(s: &HsMarkSplit) -> String {
format!(
"hs-mark: scan={:.1} ms ({:.1}%) dropped-host-loop={:.1} ms ({:.1}%)",
s.scan_ns as f64 / 1e6,
s.scan_pct(),
s.dropped_ns as f64 / 1e6,
s.dropped_pct(),
)
}
#[cfg(feature = "simd")]
#[inline]
#[must_use]
pub(crate) fn hs_mark_scan_span() -> keyhog_profile::CounterSpan {
keyhog_profile::counter_span(keyhog_profile::CounterId::Phase2PrefilterHsScanNs)
}
#[cfg(feature = "simd")]
#[inline]
#[must_use]
pub(crate) fn hs_mark_dropped_span() -> keyhog_profile::CounterSpan {
keyhog_profile::counter_span(keyhog_profile::CounterId::Phase2PrefilterDroppedHostNs)
}
pub(crate) fn hs_mark_split_from_typed(
metrics: &[keyhog_profile::TypedMetricRecordV2],
) -> HsMarkSplit {
let value = |counter: keyhog_profile::CounterId| {
metrics
.iter()
.find(|record| record.metric_id == counter.metric_id())
.map_or(0, |record| record.value)
};
HsMarkSplit {
scan_ns: value(keyhog_profile::CounterId::Phase2PrefilterHsScanNs),
dropped_ns: value(keyhog_profile::CounterId::Phase2PrefilterDroppedHostNs),
}
}