criterion/
csv_report.rs

1use csv::Writer;
2use error::Result;
3use report::{BenchmarkId, MeasurementData, Report, ReportContext};
4use std::io::Write;
5
6#[derive(Serialize)]
7struct CsvRow<'a> {
8    group: &'a str,
9    function: Option<&'a str>,
10    value: Option<&'a str>,
11    sample_time_nanos: f64,
12    iteration_count: u64,
13}
14
15struct CsvReportWriter<W: Write> {
16    writer: Writer<W>,
17}
18impl<W: Write> CsvReportWriter<W> {
19    fn write_data(&mut self, id: &BenchmarkId, data: &MeasurementData) -> Result<()> {
20        for (count, time) in data.iter_counts().iter().zip(data.sample_times().as_ref()) {
21            let row = CsvRow {
22                group: id.group_id.as_str(),
23                function: id.function_id.as_ref().map(String::as_str),
24                value: id.value_str.as_ref().map(String::as_str),
25                sample_time_nanos: *time,
26                iteration_count: (*count) as u64,
27            };
28            self.writer.serialize(row)?;
29        }
30        Ok(())
31    }
32}
33
34pub struct FileCsvReport;
35impl FileCsvReport {
36    fn write_file(
37        &self,
38        path: String,
39        id: &BenchmarkId,
40        measurements: &MeasurementData,
41    ) -> Result<()> {
42        let writer = Writer::from_path(path)?;
43        let mut writer = CsvReportWriter { writer };
44        writer.write_data(id, measurements)?;
45        Ok(())
46    }
47}
48
49impl Report for FileCsvReport {
50    fn measurement_complete(
51        &self,
52        id: &BenchmarkId,
53        context: &ReportContext,
54        measurements: &MeasurementData,
55    ) {
56        let path = format!(
57            "{}/{}/new/raw.csv",
58            context.output_directory,
59            id.as_directory_name()
60        );
61        log_if_err!(self.write_file(path, id, measurements));
62    }
63}