Skip to content

Commit

Permalink
Use PathBuf for output directory to improve non-UTF8-safety.
Browse files Browse the repository at this point in the history
  • Loading branch information
bheisler committed Apr 25, 2020
1 parent b065b99 commit a95db75
Show file tree
Hide file tree
Showing 10 changed files with 159 additions and 177 deletions.
48 changes: 21 additions & 27 deletions src/analysis/compare.rs
Expand Up @@ -29,20 +29,16 @@ pub(crate) fn common<M: Measurement>(
Vec<f64>,
Estimates,
)> {
let sample_dir = format!(
"{}/{}/{}/sample.json",
criterion.output_directory,
id.as_directory_name(),
criterion.baseline_directory
);
let (iters, times): (Vec<f64>, Vec<f64>) = fs::load(&sample_dir)?;

let estimates_file = &format!(
"{}/{}/{}/estimates.json",
criterion.output_directory,
id.as_directory_name(),
criterion.baseline_directory
);
let mut sample_file = criterion.output_directory.clone();
sample_file.push(id.as_directory_name());
sample_file.push(&criterion.baseline_directory);
sample_file.push("sample.json");
let (iters, times): (Vec<f64>, Vec<f64>) = fs::load(&sample_file)?;

let mut estimates_file = criterion.output_directory.clone();
estimates_file.push(id.as_directory_name());
estimates_file.push(&criterion.baseline_directory);
estimates_file.push("estimates.json");
let base_estimates: Estimates = fs::load(&estimates_file)?;

let base_avg_times: Vec<f64> = iters
Expand All @@ -52,11 +48,10 @@ pub(crate) fn common<M: Measurement>(
.collect();
let base_avg_time_sample = Sample::new(&base_avg_times);

fs::mkdirp(&format!(
"{}/{}/change",
criterion.output_directory,
id.as_directory_name()
))?;
let mut change_dir = criterion.output_directory.clone();
change_dir.push(id.as_directory_name());
change_dir.push("change");
fs::mkdirp(&change_dir)?;
let (t_statistic, t_distribution) = t_test(avg_times, base_avg_time_sample, config);

let (estimates, relative_distributions) =
Expand Down Expand Up @@ -137,14 +132,13 @@ fn estimates<M: Measurement>(
let estimates = build_estimates(&distributions, &point_estimates, cl);

{
log_if_err!(fs::save(
&estimates,
&format!(
"{}/{}/change/estimates.json",
criterion.output_directory,
id.as_directory_name()
)
));
log_if_err!({
let mut estimates_path = criterion.output_directory.clone();
estimates_path.push(id.as_directory_name());
estimates_path.push("change");
estimates_path.push("estimates.json");
fs::save(&estimates, &estimates_path)
});
}
(estimates, distributions)
}
99 changes: 46 additions & 53 deletions src/analysis/mod.rs
Expand Up @@ -84,12 +84,11 @@ pub(crate) fn common<M: Measurement, T: ?Sized>(

let (iters, times);
if let Some(baseline) = &criterion.load_baseline {
let loaded = fs::load::<(Box<[f64]>, Box<[f64]>), _>(&format!(
"{}/{}/{}/sample.json",
criterion.output_directory,
id.as_directory_name(),
baseline
));
let mut sample_path = criterion.output_directory.clone();
sample_path.push(id.as_directory_name());
sample_path.push(baseline);
sample_path.push("sample.json");
let loaded = fs::load::<(Box<[f64]>, Box<[f64]>), _>(&sample_path);

match loaded {
Err(err) => panic!(
Expand Down Expand Up @@ -124,11 +123,12 @@ pub(crate) fn common<M: Measurement, T: ?Sized>(
let avg_times = Sample::new(&avg_times);

if criterion.load_baseline.is_none() {
log_if_err!(fs::mkdirp(&format!(
"{}/{}/new",
criterion.output_directory,
id.as_directory_name()
)));
log_if_err!({
let mut new_dir = criterion.output_directory.clone();
new_dir.push(id.as_directory_name());
new_dir.push("new");
fs::mkdirp(&new_dir)
});
}

let data = Data::new(&iters, &times);
Expand All @@ -140,22 +140,20 @@ pub(crate) fn common<M: Measurement, T: ?Sized>(
distributions.insert(Statistic::Slope, distribution);

if criterion.load_baseline.is_none() {
log_if_err!(fs::save(
&(data.x().as_ref(), data.y().as_ref()),
&format!(
"{}/{}/new/sample.json",
criterion.output_directory,
id.as_directory_name()
),
));
log_if_err!(fs::save(
&estimates,
&format!(
"{}/{}/new/estimates.json",
criterion.output_directory,
id.as_directory_name()
)
));
log_if_err!({
let mut sample_file = criterion.output_directory.clone();
sample_file.push(id.as_directory_name());
sample_file.push("new");
sample_file.push("sample.json");
fs::save(&(data.x().as_ref(), data.y().as_ref()), &sample_file)
});
log_if_err!({
let mut estimates_file = criterion.output_directory.clone();
estimates_file.push(id.as_directory_name());
estimates_file.push("new");
estimates_file.push("estimates.json");
fs::save(&estimates, &estimates_file)
});
}

let compare_data = if base_dir_exists(
Expand Down Expand Up @@ -216,14 +214,13 @@ pub(crate) fn common<M: Measurement, T: ?Sized>(
);

if criterion.load_baseline.is_none() {
log_if_err!(fs::save(
&id,
&format!(
"{}/{}/new/benchmark.json",
criterion.output_directory,
id.as_directory_name()
)
));
log_if_err!({
let mut benchmark_file = criterion.output_directory.clone();
benchmark_file.push(id.as_directory_name());
benchmark_file.push("new");
benchmark_file.push("benchmark.json");
fs::save(&id, &benchmark_file)
});
}

if let Baseline::Save = criterion.baseline {
Expand All @@ -235,14 +232,11 @@ pub(crate) fn common<M: Measurement, T: ?Sized>(
}
}

fn base_dir_exists(id: &BenchmarkId, baseline: &str, output_directory: &str) -> bool {
Path::new(&format!(
"{}/{}/{}",
output_directory,
id.as_directory_name(),
baseline
))
.exists()
fn base_dir_exists(id: &BenchmarkId, baseline: &str, output_directory: &Path) -> bool {
let mut base_dir = output_directory.to_owned();
base_dir.push(id.as_directory_name());
base_dir.push(baseline);
base_dir.exists()
}

// Performs a simple linear regression on the sample
Expand Down Expand Up @@ -279,18 +273,17 @@ fn regression(
// Classifies the outliers in the sample
fn outliers<'a>(
id: &BenchmarkId,
output_directory: &str,
output_directory: &Path,
avg_times: &'a Sample<f64>,
) -> LabeledSample<'a, f64> {
let sample = tukey::classify(avg_times);
log_if_err!(fs::save(
&sample.fences(),
&format!(
"{}/{}/new/tukey.json",
output_directory,
id.as_directory_name()
)
));
log_if_err!({
let mut tukey_file = output_directory.to_owned();
tukey_file.push(id.as_directory_name());
tukey_file.push("new");
tukey_file.push("tukey.json");
fs::save(&sample.fences(), &tukey_file)
});
sample
}

Expand Down Expand Up @@ -331,7 +324,7 @@ fn estimates(avg_times: &Sample<f64>, config: &BenchmarkConfig) -> (Distribution
(distributions, estimates)
}

fn copy_new_dir_to_base(id: &str, baseline: &str, output_directory: &str) {
fn copy_new_dir_to_base(id: &str, baseline: &str, output_directory: &Path) {
let root_dir = Path::new(output_directory).join(id);
let base_dir = root_dir.join(baseline);
let new_dir = root_dir.join("new");
Expand Down
14 changes: 7 additions & 7 deletions src/csv_report.rs
Expand Up @@ -4,6 +4,7 @@ use crate::report::{BenchmarkId, MeasurementData, Report, ReportContext};
use crate::Throughput;
use csv::Writer;
use std::io::Write;
use std::path::Path;

#[derive(Serialize)]
struct CsvRow<'a> {
Expand Down Expand Up @@ -60,7 +61,7 @@ pub struct FileCsvReport;
impl FileCsvReport {
fn write_file(
&self,
path: String,
path: &Path,
id: &BenchmarkId,
measurements: &MeasurementData<'_>,
formatter: &dyn ValueFormatter,
Expand All @@ -80,11 +81,10 @@ impl Report for FileCsvReport {
measurements: &MeasurementData<'_>,
formatter: &dyn ValueFormatter,
) {
let path = format!(
"{}/{}/new/raw.csv",
context.output_directory,
id.as_directory_name()
);
log_if_err!(self.write_file(path, id, measurements, formatter));
let mut path = context.output_directory.clone();
path.push(id.as_directory_name());
path.push("new");
path.push("raw.csv");
log_if_err!(self.write_file(&path, id, measurements, formatter));
}
}

0 comments on commit a95db75

Please sign in to comment.