sway_utils/
performance.rs

1use 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    /// The original entry point function name.
20    pub fn_name: String,
21    /// The immediate instruction offset at which the entry function begins.
22    pub imm: u64,
23    /// The function selector (only `Some` for contract ABI methods).
24    pub selector: Option<[u8; 4]>,
25}
26
27#[macro_export]
28// Time the given expression and print/save the result.
29macro_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}