[][src]Struct perf_event::Counts

pub struct Counts { /* fields omitted */ }

A collection of counts from a Group of counters.

This is the type returned by calling read on a Group. You can index it with a reference to a specific Counter:

let counts = group.read()?;
println!("cycles / instructions: {} / {} ({:.2} cpi)",
         counts[&cycles],
         counts[&insns],
         (counts[&cycles] as f64 / counts[&insns] as f64));

Or you can iterate over the results it contains:

for (id, value) in &counts {
    println!("Counter id {} has value {}", id, value);
}

The id values produced by this iteration are internal identifiers assigned by the kernel. You can use the Counter::id method to find a specific counter's id.

For some kinds of events, the kernel may use timesharing to give all counters access to scarce hardware registers. You can see how long a group was actually running versus the entire time it was enabled using the time_enabled and time_running methods:

let scale = counts.time_enabled() as f64 /
            counts.time_running() as f64;
for (id, value) in &counts {
    print!("Counter id {} has value {}",
           id, (*value as f64 * scale) as u64);
    if scale > 1.0 {
        print!(" (estimated)");
    }
    println!();
}

Implementations

impl Counts[src]

pub fn len(&self) -> usize[src]

Return the number of counters this Counts holds results for.

pub fn time_enabled(&self) -> u64[src]

Return the number of nanoseconds the Group was enabled that contributed to this Counts' contents.

pub fn time_running(&self) -> u64[src]

Return the number of nanoseconds the Group was actually collecting counts that contributed to this Counts' contents.

impl Counts[src]

pub fn get(&self, member: &Counter) -> Option<&u64>[src]

Return the value recorded for member in self, or None if member is not present.

If you know that member is in the group, you can simply index:

let cycles = counts[&cycle_counter];

pub fn iter(&self) -> CountsIter<'_>

Notable traits for CountsIter<'c>

impl<'c> Iterator for CountsIter<'c> type Item = (u64, &'c u64);
[src]

Return an iterator over the counts in self.

for (id, value) in &counts {
    println!("Counter id {} has value {}", id, value);
}

Each item is a pair (id, &value), where id is the number assigned to the counter by the kernel (see Counter::id), and value is that counter's value.

Trait Implementations

impl Debug for Counts[src]

impl<'_> Index<&'_ Counter> for Counts[src]

type Output = u64

The returned type after indexing.

impl<'c> IntoIterator for &'c Counts[src]

type Item = (u64, &'c u64)

The type of the elements being iterated over.

type IntoIter = CountsIter<'c>

Which kind of iterator are we turning this into?

Auto Trait Implementations

impl RefUnwindSafe for Counts

impl Send for Counts

impl Sync for Counts

impl Unpin for Counts

impl UnwindSafe for Counts

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.