diff options
Diffstat (limited to 'src/plot/gnuplot_backend/iteration_times.rs')
-rwxr-xr-x | src/plot/gnuplot_backend/iteration_times.rs | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/src/plot/gnuplot_backend/iteration_times.rs b/src/plot/gnuplot_backend/iteration_times.rs new file mode 100755 index 0000000..4db4de8 --- /dev/null +++ b/src/plot/gnuplot_backend/iteration_times.rs @@ -0,0 +1,173 @@ +use std::process::Child; + +use criterion_plot::prelude::*; + +use super::*; +use crate::report::{BenchmarkId, ComparisonData, MeasurementData, ReportContext}; + +use crate::measurement::ValueFormatter; + +fn iteration_times_figure( + formatter: &dyn ValueFormatter, + measurements: &MeasurementData<'_>, + size: Option<Size>, +) -> Figure { + let data = &measurements.avg_times; + let max_avg_time = data.max(); + let mut scaled_y: Vec<_> = data.iter().map(|(f, _)| f).collect(); + let unit = formatter.scale_values(max_avg_time, &mut scaled_y); + let scaled_y = Sample::new(&scaled_y); + + let mut figure = Figure::new(); + figure + .set(Font(DEFAULT_FONT)) + .set(size.unwrap_or(SIZE)) + .configure(Axis::BottomX, |a| { + a.configure(Grid::Major, |g| g.show()).set(Label("Sample")) + }) + .configure(Axis::LeftY, |a| { + a.configure(Grid::Major, |g| g.show()) + .set(Label(format!("Average Iteration Time ({})", unit))) + }) + .plot( + Points { + x: 1..(data.len() + 1), + y: scaled_y.as_ref(), + }, + |c| { + c.set(DARK_BLUE) + .set(PointSize(0.5)) + .set(PointType::FilledCircle) + }, + ); + figure +} + +pub(crate) fn iteration_times( + id: &BenchmarkId, + context: &ReportContext, + formatter: &dyn ValueFormatter, + measurements: &MeasurementData<'_>, + size: Option<Size>, +) -> Child { + let mut figure = iteration_times_figure(formatter, measurements, size); + figure.set(Title(gnuplot_escape(id.as_title()))); + figure.configure(Key, |k| { + k.set(Justification::Left) + .set(Order::SampleText) + .set(Position::Inside(Vertical::Top, Horizontal::Left)) + }); + + let path = context.report_path(id, "iteration_times.svg"); + debug_script(&path, &figure); + figure.set(Output(path)).draw().unwrap() +} + +pub(crate) fn iteration_times_small( + id: &BenchmarkId, + context: &ReportContext, + formatter: &dyn ValueFormatter, + measurements: &MeasurementData<'_>, + size: Option<Size>, +) -> Child { + let mut figure = iteration_times_figure(formatter, measurements, size); + figure.configure(Key, |k| k.hide()); + + let path = context.report_path(id, "iteration_times_small.svg"); + debug_script(&path, &figure); + figure.set(Output(path)).draw().unwrap() +} + +fn iteration_times_comparison_figure( + formatter: &dyn ValueFormatter, + measurements: &MeasurementData<'_>, + comparison: &ComparisonData, + size: Option<Size>, +) -> Figure { + let current_data = &measurements.avg_times; + let base_data = &comparison.base_avg_times; + + let mut all_data: Vec<f64> = current_data.iter().map(|(f, _)| f).collect(); + all_data.extend_from_slice(base_data); + + let typical_value = Sample::new(&all_data).max(); + let unit = formatter.scale_values(typical_value, &mut all_data); + + let (scaled_current_y, scaled_base_y) = all_data.split_at(current_data.len()); + let scaled_current_y = Sample::new(scaled_current_y); + let scaled_base_y = Sample::new(scaled_base_y); + + let mut figure = Figure::new(); + figure + .set(Font(DEFAULT_FONT)) + .set(size.unwrap_or(SIZE)) + .configure(Axis::BottomX, |a| { + a.configure(Grid::Major, |g| g.show()).set(Label("Sample")) + }) + .configure(Axis::LeftY, |a| { + a.configure(Grid::Major, |g| g.show()) + .set(Label(format!("Average Iteration Time ({})", unit))) + }) + .configure(Key, |k| { + k.set(Justification::Left) + .set(Order::SampleText) + .set(Position::Inside(Vertical::Top, Horizontal::Left)) + }) + .plot( + Points { + x: 1..(current_data.len() + 1), + y: scaled_base_y.as_ref(), + }, + |c| { + c.set(DARK_RED) + .set(Label("Base")) + .set(PointSize(0.5)) + .set(PointType::FilledCircle) + }, + ) + .plot( + Points { + x: 1..(current_data.len() + 1), + y: scaled_current_y.as_ref(), + }, + |c| { + c.set(DARK_BLUE) + .set(Label("Current")) + .set(PointSize(0.5)) + .set(PointType::FilledCircle) + }, + ); + figure +} + +pub(crate) fn iteration_times_comparison( + id: &BenchmarkId, + context: &ReportContext, + formatter: &dyn ValueFormatter, + measurements: &MeasurementData<'_>, + comparison: &ComparisonData, + size: Option<Size>, +) -> Child { + let mut figure = iteration_times_comparison_figure(formatter, measurements, comparison, size); + figure.set(Title(gnuplot_escape(id.as_title()))); + + let path = context.report_path(id, "both/iteration_times.svg"); + debug_script(&path, &figure); + figure.set(Output(path)).draw().unwrap() +} + +pub(crate) fn iteration_times_comparison_small( + id: &BenchmarkId, + context: &ReportContext, + formatter: &dyn ValueFormatter, + measurements: &MeasurementData<'_>, + comparison: &ComparisonData, + size: Option<Size>, +) -> Child { + let mut figure = iteration_times_comparison_figure(formatter, measurements, comparison, size); + figure.configure(Key, |k| k.hide()); + + let path = context.report_path(id, "relative_iteration_times_small.svg"); + debug_script(&path, &figure); + figure.set(Output(path)).draw().unwrap() +} |