git_perf/
basic_measure.rs1use 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}