git_perf/
basic_measure.rs

1use std::{process, time::Instant};
2
3use anyhow::{bail, Context, Result};
4
5use crate::measurement_storage::{self};
6
7pub fn measure(
8    measurement: &str,
9    repetitions: u16,
10    command: &[String],
11    key_values: &[(String, String)],
12) -> Result<()> {
13    let exe = command.first().unwrap();
14    let args = &command[1..];
15    for _ in 0..repetitions {
16        let mut process = process::Command::new(exe);
17        process.args(args);
18        let start = Instant::now();
19        let output = process.output().context("Command failed to spawn")?;
20        if !output.status.success() {
21            let stdout = String::from_utf8_lossy(&output.stdout);
22            let stderr = String::from_utf8_lossy(&output.stderr);
23            bail!(
24                "Command '{}' failed to run:\nstdout:\n{}\nstderr:\n{}",
25                exe,
26                stdout,
27                stderr,
28            );
29        }
30        let duration = start.elapsed();
31        let duration_usec = duration.as_nanos() as f64;
32        measurement_storage::add(measurement, duration_usec, key_values)?;
33    }
34    Ok(())
35}