sway_utils/
performance.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, Deserialize, Serialize)]
4pub struct PerformanceMetric {
5 pub phase: String,
6 pub elapsed: f64,
7 pub memory_usage: Option<u64>,
8}
9
10#[derive(Clone, Debug, Default, Deserialize, Serialize)]
11pub struct PerformanceData {
12 pub bytecode_size: usize,
13 pub metrics: Vec<PerformanceMetric>,
14 pub reused_programs: u64,
15}
16
17#[derive(serde::Serialize, Clone)]
18pub struct FunctionEntryPoint {
19 pub fn_name: String,
21 pub imm: u64,
23 pub selector: Option<[u8; 4]>,
25}
26
27#[macro_export]
28macro_rules! time_expr {
30 ($pkg_name:expr, $description:expr, $key:expr, $expression:expr, $build_config:expr, $data:expr) => {{
31 use std::io::{BufRead, Read, Write};
32 if let Some(cfg) = $build_config {
33 if cfg.profile {
34 println!("/dyno start {} {}", $pkg_name, $description);
35 let output = { $expression };
36 println!("/dyno stop {} {}", $pkg_name, $description);
37 output
38 } else if cfg.time_phases || cfg.metrics_outfile.is_some() {
39 let expr_start = std::time::Instant::now();
40 let output = { $expression };
41 let elapsed = expr_start.elapsed();
42 if cfg.time_phases {
43 println!(" Time elapsed to {}: {:?}", $description, elapsed);
44 }
45 if cfg.metrics_outfile.is_some() {
46 #[cfg(not(target_os = "macos"))]
47 let memory_usage = {
48 use sysinfo::{System, SystemExt};
49 let mut sys = System::new();
50 sys.refresh_system();
51 Some(sys.used_memory())
52 };
53 #[cfg(target_os = "macos")]
54 let memory_usage = None;
55
56 $data.metrics.push(PerformanceMetric {
57 phase: $key.to_string(),
58 elapsed: elapsed.as_secs_f64(),
59 memory_usage,
60 });
61 }
62 output
63 } else {
64 $expression
65 }
66 } else {
67 $expression
68 }
69 }};
70}