git_perf/
basic_measure.rs

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