#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub(crate) struct GenericProfile {
pub prefilter_ns: u64,
pub extract_ns: u64,
pub prefilter_calls: u64,
pub keyword_lines: u64,
pub regex_captures: u64,
pub emits: u64,
}
impl GenericProfile {
pub(crate) fn any_recorded(&self) -> bool {
*self != Self::default()
}
}
pub(crate) fn format_generic_profile(p: &GenericProfile) -> String {
let prefilter_ms = p.prefilter_ns as f64 / 1e6;
let extract_ms = p.extract_ns as f64 / 1e6;
format!(
"=== GENERIC bridge profile === prefilter={prefilter_ms:.1}ms extract={extract_ms:.1}ms \
calls={} keyword_lines={} regex_captures={} emits={}",
p.prefilter_calls, p.keyword_lines, p.regex_captures, p.emits
)
}
pub(crate) fn generic_profile_from_typed(
metrics: &[keyhog_profile::TypedMetricRecordV2],
) -> GenericProfile {
let value = |counter: keyhog_profile::CounterId| {
metrics
.iter()
.find(|record| record.metric_id == counter.metric_id())
.map_or(0, |record| record.value)
};
use keyhog_profile::CounterId;
GenericProfile {
prefilter_ns: value(CounterId::GenericPrefilterNs),
extract_ns: value(CounterId::GenericExtractNs),
prefilter_calls: value(CounterId::GenericPrefilterCalls),
keyword_lines: value(CounterId::GenericKeywordLines),
regex_captures: value(CounterId::GenericRegexCaptures),
emits: value(CounterId::GenericEmits),
}
}
#[inline]
#[must_use]
pub(super) fn prefilter_span() -> keyhog_profile::CounterSpan {
keyhog_profile::counter_span(keyhog_profile::CounterId::GenericPrefilterNs)
}
#[inline]
#[must_use]
pub(super) fn extract_span() -> keyhog_profile::CounterSpan {
keyhog_profile::counter_span(keyhog_profile::CounterId::GenericExtractNs)
}
pub(super) fn record_prefilter_call(keyword_lines: usize) {
keyhog_profile::add_counter(keyhog_profile::CounterId::GenericPrefilterCalls, 1);
keyhog_profile::add_counter(
keyhog_profile::CounterId::GenericKeywordLines,
keyword_lines as u64,
);
}
pub(super) fn record_regex_capture() {
keyhog_profile::add_counter(keyhog_profile::CounterId::GenericRegexCaptures, 1);
}
pub(super) fn record_emit() {
keyhog_profile::add_counter(keyhog_profile::CounterId::GenericEmits, 1);
}