summaryrefslogtreecommitdiffstats
path: root/vendor/perf-event/examples/group.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/perf-event/examples/group.rs')
-rw-r--r--vendor/perf-event/examples/group.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/vendor/perf-event/examples/group.rs b/vendor/perf-event/examples/group.rs
new file mode 100644
index 000000000..0312485c9
--- /dev/null
+++ b/vendor/perf-event/examples/group.rs
@@ -0,0 +1,45 @@
+use perf_event::{Builder, Group};
+use perf_event::events::{Cache, CacheOp, CacheResult, Hardware, WhichCache};
+
+fn main() -> std::io::Result<()> {
+ const ACCESS: Cache = Cache {
+ which: WhichCache::L1D,
+ operation: CacheOp::READ,
+ result: CacheResult::ACCESS,
+ };
+ const MISS: Cache = Cache { result: CacheResult::MISS, ..ACCESS };
+
+ let mut group = Group::new()?;
+ let access_counter = Builder::new().group(&mut group).kind(ACCESS).build()?;
+ let miss_counter = Builder::new().group(&mut group).kind(MISS).build()?;
+ let branches = Builder::new().group(&mut group).kind(Hardware::BRANCH_INSTRUCTIONS).build()?;
+ let missed_branches = Builder::new().group(&mut group).kind(Hardware::BRANCH_MISSES).build()?;
+
+ // Note that if you add more counters than you actually have hardware for,
+ // the kernel will time-slice them, which means you may get no coverage for
+ // short measurements. See the documentation.
+
+ let vec = (0..=51).collect::<Vec<_>>();
+
+ group.enable()?;
+ println!("{:?}", vec);
+ group.disable()?;
+
+ let counts = group.read()?;
+ println!("L1D cache misses/references: {} / {} ({:.0}%)",
+ counts[&miss_counter],
+ counts[&access_counter],
+ (counts[&miss_counter] as f64 / counts[&access_counter] as f64) * 100.0);
+
+ println!("branch prediction misses/total: {} / {} ({:.0}%)",
+ counts[&missed_branches],
+ counts[&branches],
+ (counts[&missed_branches] as f64 / counts[&branches] as f64) * 100.0);
+
+ // You can iterate over a `Counts` value:
+ for (id, value) in &counts {
+ println!("Counter id {} has value {}", id, value);
+ }
+
+ Ok(())
+}