|
1 | 1 | //! Performance test program inspired by `ddsperf` in CycloneDDS |
2 | 2 |
|
3 | | -use std::time::{Duration, Instant}; |
| 3 | +use std::time::Duration; |
| 4 | +#[cfg(target_os = "linux")] |
| 5 | +use std::time::Instant; |
4 | 6 |
|
5 | 7 | use log::error; |
6 | 8 | use rustdds::{ |
@@ -75,33 +77,7 @@ enum PubModeArgs { |
75 | 77 | fn main() { |
76 | 78 | let command_line_args = CommandLineArgs::parse(); |
77 | 79 |
|
78 | | - let this_process = procfs::process::Process::myself().unwrap(); |
79 | | - let process_ticks_per_second = procfs::ticks_per_second() as f32; |
80 | | - let kernel_page_size = procfs::page_size(); |
81 | | - |
82 | | - let mut process_stat = this_process.stat().unwrap(); |
83 | | - let mut last_stat_instant = Instant::now(); |
84 | | - let mut print_and_reset_cpu_usage = move || { |
85 | | - let prev_utime = process_stat.utime; |
86 | | - let prev_stime = process_stat.stime; |
87 | | - process_stat = this_process.stat().unwrap(); |
88 | | - |
89 | | - let stat_instant = Instant::now(); |
90 | | - let call_interval = stat_instant.duration_since(last_stat_instant).as_secs_f32(); |
91 | | - last_stat_instant = stat_instant; |
92 | | - |
93 | | - let stat_mem = this_process.statm().unwrap(); |
94 | | - let rss_size_bytes = stat_mem.resident * kernel_page_size; |
95 | | - |
96 | | - let user_percentage = |
97 | | - 100.0 * ((process_stat.utime - prev_utime) as f32 / process_ticks_per_second) / call_interval; |
98 | | - let sys_percentage = |
99 | | - 100.0 * ((process_stat.stime - prev_stime) as f32 / process_ticks_per_second) / call_interval; |
100 | | - println!( |
101 | | - "user {user_percentage:2.0}% sys {sys_percentage:2.0}% RSS {}B", |
102 | | - format_count(rss_size_bytes) |
103 | | - ); |
104 | | - }; |
| 80 | + let mut print_and_reset_cpu_usage = cpu_usage_printer_closure(); |
105 | 81 |
|
106 | 82 | #[cfg(debug_assertions)] |
107 | 83 | println!("-------\nNOTE: Running debug build for performace test. It will be slow.\n-------"); |
@@ -496,3 +472,42 @@ fn format_count(count: u64) -> String { |
496 | 472 | format!("{:2.1}G", count as f64 / 1_000_000_000.0) |
497 | 473 | } |
498 | 474 | } |
| 475 | + |
| 476 | +#[cfg(target_os = "linux")] // procfs is onl available on linux |
| 477 | +fn cpu_usage_printer_closure() -> impl FnMut() { |
| 478 | + let this_process = procfs::process::Process::myself().unwrap(); |
| 479 | + let process_ticks_per_second = procfs::ticks_per_second() as f32; |
| 480 | + let kernel_page_size = procfs::page_size(); |
| 481 | + |
| 482 | + let mut process_stat = this_process.stat().unwrap(); |
| 483 | + let mut last_stat_instant = Instant::now(); |
| 484 | + |
| 485 | + move || { |
| 486 | + let prev_utime = process_stat.utime; |
| 487 | + let prev_stime = process_stat.stime; |
| 488 | + process_stat = this_process.stat().unwrap(); |
| 489 | + |
| 490 | + let stat_instant = Instant::now(); |
| 491 | + let call_interval = stat_instant.duration_since(last_stat_instant).as_secs_f32(); |
| 492 | + last_stat_instant = stat_instant; |
| 493 | + |
| 494 | + let stat_mem = this_process.statm().unwrap(); |
| 495 | + let rss_size_bytes = stat_mem.resident * kernel_page_size; |
| 496 | + |
| 497 | + let user_percentage = |
| 498 | + 100.0 * ((process_stat.utime - prev_utime) as f32 / process_ticks_per_second) / call_interval; |
| 499 | + let sys_percentage = |
| 500 | + 100.0 * ((process_stat.stime - prev_stime) as f32 / process_ticks_per_second) / call_interval; |
| 501 | + println!( |
| 502 | + "user {user_percentage:2.0}% sys {sys_percentage:2.0}% RSS {}B", |
| 503 | + format_count(rss_size_bytes) |
| 504 | + ); |
| 505 | + } |
| 506 | +} |
| 507 | + |
| 508 | +#[cfg(not(target_os = "linux"))] |
| 509 | +fn cpu_usage_printer_closure() -> impl FnMut() { |
| 510 | + || { |
| 511 | + // no-op |
| 512 | + } |
| 513 | +} |
0 commit comments