+ let mut benchmark_result = BENCHMARK_RESULT_2020_TOP;
+
+ // do repo tests first, because this may prompt for a password
+ if let Some(repo) = repo {
+ test_upload_speed(&mut benchmark_result, repo, crypt_config.clone(), verbose).await?;
+ }
+
+ test_crypt_speed(&mut benchmark_result, verbose)?;
+
+ render_result(&output_format, &benchmark_result)?;
+
+ Ok(())
+}
+
+// print comparison table
+fn render_result(
+ output_format: &str,
+ benchmark_result: &BenchmarkResult,
+) -> Result<(), Error> {
+
+ let mut data = serde_json::to_value(benchmark_result)?;
+ let schema = BenchmarkResult::API_SCHEMA;
+
+ let render_speed = |value: &Value, _record: &Value| -> Result<String, Error> {
+ match value["speed"].as_f64() {
+ None => Ok(String::from("not tested")),
+ Some(speed) => {
+ let top = value["top"].as_f64().unwrap();
+ Ok(format!("{:.2} MB/s ({:.0}%)", speed/1_000_000.0, (speed*100.0)/top))
+ }
+ }
+ };
+
+ let options = default_table_format_options()
+ .column(ColumnConfig::new("tls")
+ .header("TLS (maximal backup upload speed)")
+ .right_align(false).renderer(render_speed))
+ .column(ColumnConfig::new("sha256")
+ .header("SHA256 checksum comptation speed")
+ .right_align(false).renderer(render_speed))
+ .column(ColumnConfig::new("compress")
+ .header("ZStd level 1 compression speed")
+ .right_align(false).renderer(render_speed))
+ .column(ColumnConfig::new("decompress")
+ .header("ZStd level 1 decompression speed")
+ .right_align(false).renderer(render_speed))
+ .column(ColumnConfig::new("aes256_gcm")
+ .header("AES256 GCM encryption speed")
+ .right_align(false).renderer(render_speed));
+
+
+ format_and_print_result_full(&mut data, schema, output_format, &options);
+
+ Ok(())
+}
+
+async fn test_upload_speed(
+ benchmark_result: &mut BenchmarkResult,
+ repo: BackupRepository,
+ crypt_config: Option<Arc<CryptConfig>>,
+ verbose: bool,
+) -> Result<(), Error> {