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