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}