From a938b2bd85e7be6dd4cb61fa0a34fcf7f0cd788f Mon Sep 17 00:00:00 2001 From: Bryan English Date: Wed, 23 Apr 2025 23:00:04 -0400 Subject: [PATCH] preserve insertion order for JSON output --- Cargo.lock | 43 ++- Cargo.toml | 3 +- src/main.rs | 3 +- src/metric_value.rs | 4 +- src/statsd.rs | 7 +- src/summarize.rs | 20 +- tests/examples.rs | 7 +- tests/fixtures/summary/out.json | 460 ++++++++++++++++---------------- 8 files changed, 297 insertions(+), 250 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 15103e1..e1f4736 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aho-corasick" @@ -343,6 +343,12 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "event-listener" version = "2.5.1" @@ -433,6 +439,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "hermit-abi" version = "0.1.18" @@ -442,6 +460,27 @@ dependencies = [ "libc 0.2.137", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + [[package]] name = "instant" version = "0.1.9" @@ -916,6 +955,7 @@ version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ + "indexmap 1.9.3", "itoa", "ryu", "serde", @@ -994,6 +1034,7 @@ dependencies = [ "assert_cmd", "async-std", "caps", + "indexmap 2.9.0", "lazy_static", "nix", "perfcnt", diff --git a/Cargo.toml b/Cargo.toml index bbfc05d..695cd91 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ lto = true [dependencies] async-std = { version = "1.9.0", features = ["unstable", "attributes"] } -serde_json = "1.0.64" +serde_json = { version = "1.0.64", features = ["preserve_order"] } shlex = "1.0.0" nix = "0.20.0" assert_cmd = "1.0.3" @@ -21,6 +21,7 @@ lazy_static = "1.4.0" serde = { version = "1.0.124", features = ["derive"] } anyhow = "<=1.0.48" which = "4.0.2" +indexmap = { version = "2.9.0", features = ["serde"] } [target.'cfg(target_os = "linux")'.dependencies] perfcnt = "0.8.0" diff --git a/src/main.rs b/src/main.rs index bfd2e4b..6ddaa91 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use async_std::{ use serde_json::json; use std::{collections::HashMap, env, os::unix::process::ExitStatusExt, process::exit}; use which::which; +use indexmap::IndexMap; mod config; use config::*; @@ -118,7 +119,7 @@ fn run_service(config: &Config) -> Result> { async fn run_iteration( config: &Config, statsd_buf: Arc>, -) -> Result> { +) -> Result> { let mut sub_config: Config = config.clone(); let json_config = serde_yaml::to_string(&config)?; sub_config.env.insert("SIRUN_ITERATION".into(), json_config); diff --git a/src/metric_value.rs b/src/metric_value.rs index 6e7e9a6..1b459e4 100644 --- a/src/metric_value.rs +++ b/src/metric_value.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use std::collections::HashMap; +use indexmap::IndexMap; #[derive(Serialize, Deserialize, Clone)] #[serde(untagged)] @@ -72,4 +72,4 @@ num_type!(i32); num_type!(i64); num_type!(f64); -pub(crate) type MetricMap = HashMap; +pub(crate) type MetricMap = IndexMap; diff --git a/src/statsd.rs b/src/statsd.rs index e9d54eb..a1e30df 100644 --- a/src/statsd.rs +++ b/src/statsd.rs @@ -4,7 +4,8 @@ use async_std::{ net::UdpSocket, sync::{Arc, Barrier, RwLock}, }; -use std::{collections::HashMap, env}; +use std::env; +use indexmap::IndexMap; pub(crate) async fn statsd_listener( barrier: Arc, @@ -32,8 +33,8 @@ pub(crate) async fn statsd_listener( pub(crate) async fn get_statsd_metrics( udp_data: Arc>, -) -> Result> { - let mut metrics = HashMap::new(); +) -> Result> { + let mut metrics = IndexMap::new(); let udp_string = udp_data.read().await.clone(); let lines = udp_string.trim().lines(); udp_data.write().await.clear(); diff --git a/src/summarize.rs b/src/summarize.rs index 79deb29..c3e824e 100644 --- a/src/summarize.rs +++ b/src/summarize.rs @@ -5,7 +5,7 @@ use anyhow::*; use async_std::io; -use std::collections::HashMap; +use indexmap::IndexMap; use crate::metric_value::*; @@ -26,7 +26,7 @@ fn stddev(m: f64, items: &[f64]) -> f64 { } fn summary(iterations: &[MetricValue]) -> MetricValue { - let mut stats: HashMap> = HashMap::new(); + let mut stats: IndexMap> = IndexMap::new(); for iteration in iterations { let iteration = iteration.as_map(); for (k, v) in iteration { @@ -40,9 +40,9 @@ fn summary(iterations: &[MetricValue]) -> MetricValue { stat.push(v.clone().as_f64()); } } - let mut result = HashMap::new(); + let mut result = IndexMap::new(); for (name, items) in stats { - let mut statistics = HashMap::new(); + let mut statistics = IndexMap::new(); let m = mean(&items); let s = stddev(m, &items); statistics.insert("mean".to_owned(), m.into()); @@ -66,7 +66,7 @@ fn summary(iterations: &[MetricValue]) -> MetricValue { pub(crate) async fn summarize() -> Result<()> { let stdin = io::stdin(); let mut line = String::new(); - let mut result_data: MetricMap = HashMap::new(); + let mut result_data: MetricMap = IndexMap::new(); while stdin.read_line(&mut line).await? != 0 { if let Ok(mut json_data) = serde_json::from_str::(&line) { let name = match json_data.get("name") { @@ -76,7 +76,7 @@ pub(crate) async fn summarize() -> Result<()> { continue; } }; - json_data.remove("name"); + json_data.shift_remove("name"); let variant = match json_data.get("variant") { Some(variant) => variant.clone().as_string(), None => { @@ -84,22 +84,22 @@ pub(crate) async fn summarize() -> Result<()> { continue; } }; - json_data.remove("variant"); + json_data.shift_remove("variant"); let name_data: &mut MetricMap = match result_data.get_mut(&name) { Some(data) => data.as_map_mut(), None => { - result_data.insert(name.to_owned(), HashMap::new().into()); + result_data.insert(name.to_owned(), IndexMap::new().into()); result_data.get_mut(&name).unwrap().as_map_mut() } }; - if let Some((_, iterations)) = json_data.remove_entry("iterations") { + if let Some((_, iterations)) = json_data.shift_remove_entry("iterations") { json_data.insert("summary".to_owned(), summary(&iterations.as_vec())); } else { line = String::new(); continue; } - json_data.remove("iterations"); + json_data.shift_remove("iterations"); name_data.insert(variant, json_data.into()); }; line = String::new(); diff --git a/tests/examples.rs b/tests/examples.rs index 824917c..1b0cf41 100644 --- a/tests/examples.rs +++ b/tests/examples.rs @@ -257,10 +257,13 @@ fn summarize() { in_path.push("tests/fixtures/summary/in.ndjson"); let mut out_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); out_path.push("tests/fixtures/summary/out.json"); + let expected_output: &str = &std::fs::read_to_string(out_path).unwrap(); + run!("--summarize") .write_stdin(std::fs::read(in_path).unwrap()) - .output() - .expect(&std::fs::read_to_string(out_path).unwrap()); + .assert() + .success() + .stdout(predicate::eq(expected_output)); } #[test] diff --git a/tests/fixtures/summary/out.json b/tests/fixtures/summary/out.json index 50b8c54..9c92822 100644 --- a/tests/fixtures/summary/out.json +++ b/tests/fixtures/summary/out.json @@ -1,337 +1,337 @@ { - "encoders": { - "0.4": { - "instructions": 10552131148.0, - "summary": { - "user.time": { - "stddev": 61995.597369893934, - "min": 1768237.0, - "mean": 1846670.5, - "stddev_pct": 3.357155343624861, - "max": 1959917.0 - }, - "wall.time": { - "min": 2918238.0, - "mean": 3075091.0, - "stddev_pct": 3.7192990428454276, - "stddev": 114371.83012962589, - "max": 3334329.0 - }, - "cpu.pct.wall.time": { - "min": 104.65994807351044, - "stddev_pct": 0.9255925821593316, - "stddev": 0.9958396712354695, - "max": 108.26359004144996, - "mean": 107.58941789618248 - }, - "max.res.size": { - "mean": 240614.8, - "stddev": 384.2334706919739, - "stddev_pct": 0.15968821148656437, - "max": 241152.0, - "min": 239836.0 - }, - "system.time": { - "stddev": 76328.65924120507, - "stddev_pct": 5.224393399914324, - "max": 1569729.0, - "min": 1326080.0, - "mean": 1461005.2 - } - }, - "nodeVersion": "16.1.0" - }, - "0.5": { - "nodeVersion": "16.1.0", - "summary": { - "system.time": { - "min": 260382.0, - "mean": 289374.6, - "stddev_pct": 6.437620801638961, - "max": 324449.0, - "stddev": 18628.839444259538 - }, - "cpu.pct.wall.time": { - "min": 107.94800382165728, - "max": 111.74819484146, - "mean": 110.3336449710584, - "stddev": 1.2931740451007865, - "stddev_pct": 1.172057757577028 - }, - "wall.time": { - "mean": 1001947.7, - "stddev": 36469.88316145255, - "min": 951394.0, - "max": 1072359.0, - "stddev_pct": 3.6398988850867715 - }, - "user.time": { - "min": 772477.0, - "mean": 815741.0, - "stddev": 40066.41090240053, - "max": 893915.0, - "stddev_pct": 4.911658345283678 - }, - "max.res.size": { - "mean": 164756.0, - "stddev": 589.4431270275361, - "stddev_pct": 0.3577673207819661, - "min": 163452.0, - "max": 165164.0 - } - }, - "instructions": 5918452039.0 - } - }, "async_hooks": { "no-hooks": { - "nodeVersion": "16.1.0", "instructions": 6201617023.0, + "nodeVersion": "16.1.0", "summary": { + "cpu.pct.wall.time": { + "mean": 91.54809934299166, + "stddev": 0.7473267400684122, + "stddev_pct": 0.8163214151158921, + "min": 90.30510303457042, + "max": 92.36784433017657 + }, "event_loop.delay.max": { + "mean": 166199295.0, + "stddev": 8250667.46722237, "stddev_pct": 4.964321579837249, "min": 158466047.0, - "stddev": 8250667.46722237, - "mean": 166199295.0, "max": 179961855.0 }, - "wall.time": { - "mean": 1307358.4, - "stddev": 19710.869596240547, - "min": 1271350.0, - "max": 1331733.0, - "stddev_pct": 1.5076867671665666 + "gc.pause.max": { + "mean": 20768357.4, + "stddev": 3181207.493344224, + "stddev_pct": 15.317569088753375, + "min": 17334271.0, + "max": 26394623.0 }, "max.res.size": { "mean": 130046.4, "stddev": 509.32802789557934, - "max": 131060.0, "stddev_pct": 0.39165100140840453, - "min": 129696.0 - }, - "user.time": { - "stddev_pct": 5.053782080565606, - "mean": 1028958.4, - "stddev": 52001.31523567457, - "max": 1076778.0, - "min": 932655.0 + "min": 129696.0, + "max": 131060.0 }, "system.time": { + "mean": 167907.6, "stddev": 33643.91563180481, "stddev_pct": 20.03716069540915, "min": 139083.0, - "max": 229074.0, - "mean": 167907.6 + "max": 229074.0 }, - "gc.pause.max": { - "mean": 20768357.4, - "stddev_pct": 15.317569088753375, - "min": 17334271.0, - "stddev": 3181207.493344224, - "max": 26394623.0 + "user.time": { + "mean": 1028958.4, + "stddev": 52001.31523567457, + "stddev_pct": 5.053782080565606, + "min": 932655.0, + "max": 1076778.0 }, - "cpu.pct.wall.time": { - "min": 90.30510303457042, - "mean": 91.54809934299166, - "max": 92.36784433017657, - "stddev_pct": 0.8163214151158921, - "stddev": 0.7473267400684122 + "wall.time": { + "mean": 1307358.4, + "stddev": 19710.869596240547, + "stddev_pct": 1.5076867671665666, + "min": 1271350.0, + "max": 1331733.0 } } }, "init-only": { + "instructions": 25994319748.0, + "nodeVersion": "16.1.0", "summary": { - "user.time": { - "max": 4008810.0, - "stddev": 86701.25363015232, - "min": 3760298.0, - "stddev_pct": 2.2431190699244956, - "mean": 3865209.6 + "cpu.pct.wall.time": { + "mean": 131.5851053934149, + "stddev": 1.1210424069767215, + "stddev_pct": 0.8519523570886037, + "min": 130.045650822311, + "max": 132.76855459617843 + }, + "event_loop.delay.max": { + "mean": 563714456.6, + "stddev": 11998752.124324823, + "stddev_pct": 2.1285159505566638, + "min": 546308095.0, + "max": 578289663.0 + }, + "gc.pause.max": { + "mean": 50325093.4, + "stddev": 6934823.689573012, + "stddev_pct": 13.780051304530739, + "min": 45350911.0, + "max": 63373311.0 }, "max.res.size": { - "stddev": 671.9571414904376, - "min": 200908.0, "mean": 202036.0, + "stddev": 671.9571414904376, "stddev_pct": 0.3325927762826613, + "min": 200908.0, "max": 202784.0 }, "system.time": { "mean": 395556.2, "stddev": 40546.531360401226, - "max": 456023.0, "stddev_pct": 10.250510890842117, - "min": 339533.0 + "min": 339533.0, + "max": 456023.0 }, - "gc.pause.max": { - "stddev": 6934823.689573012, - "mean": 50325093.4, - "max": 63373311.0, - "min": 45350911.0, - "stddev_pct": 13.780051304530739 - }, - "event_loop.delay.max": { - "stddev_pct": 2.1285159505566638, - "mean": 563714456.6, - "min": 546308095.0, - "max": 578289663.0, - "stddev": 11998752.124324823 + "user.time": { + "mean": 3865209.6, + "stddev": 86701.25363015232, + "stddev_pct": 2.2431190699244956, + "min": 3760298.0, + "max": 4008810.0 }, "wall.time": { - "stddev_pct": 1.3619745011539084, + "mean": 3238217.0, "stddev": 44103.68983203106, + "stddev_pct": 1.3619745011539084, "min": 3180708.0, - "mean": 3238217.0, "max": 3291588.0 - }, - "cpu.pct.wall.time": { - "mean": 131.5851053934149, - "stddev": 1.1210424069767215, - "min": 130.045650822311, - "max": 132.76855459617843, - "stddev_pct": 0.8519523570886037 } - }, - "instructions": 25994319748.0, - "nodeVersion": "16.1.0" + } }, "all-hooks": { "instructions": 34884985032.0, + "nodeVersion": "16.1.0", "summary": { - "user.time": { - "min": 5779598.0, - "stddev": 97094.01175067389, - "stddev_pct": 1.626667147671717, - "mean": 5968892.4, - "max": 6057783.0 - }, - "gc.pause.max": { - "min": 171966463.0, - "stddev_pct": 2.4644670116325154, - "max": 185860095.0, - "stddev": 4419595.464229803, - "mean": 179332709.4 - }, - "wall.time": { - "mean": 5873150.4, - "min": 5720137.0, - "stddev_pct": 1.3336365256698712, - "stddev": 78326.47894192615, - "max": 5941752.0 + "cpu.pct.wall.time": { + "mean": 108.94859928142239, + "stddev": 0.3243275372848446, + "stddev_pct": 0.2976885792235679, + "min": 108.54965536664594, + "max": 109.2877946140919 }, "event_loop.delay.max": { - "max": 1151336447.0, - "min": 1093664767.0, - "stddev": 20724700.776474833, "mean": 1125751192.6, - "stddev_pct": 1.8409663620795027 + "stddev": 20724700.776474833, + "stddev_pct": 1.8409663620795027, + "min": 1093664767.0, + "max": 1151336447.0 + }, + "gc.pause.max": { + "mean": 179332709.4, + "stddev": 4419595.464229803, + "stddev_pct": 2.4644670116325154, + "min": 171966463.0, + "max": 185860095.0 }, "max.res.size": { - "stddev_pct": 0.08371386295653951, - "max": 356060.0, "mean": 355486.4, "stddev": 297.5913977251359, - "min": 355228.0 + "stddev_pct": 0.08371386295653951, + "min": 355228.0, + "max": 356060.0 }, "system.time": { + "mean": 429980.6, "stddev": 14455.856122692976, "stddev_pct": 3.3619786852460267, "min": 411762.0, - "mean": 429980.6, "max": 455467.0 }, - "cpu.pct.wall.time": { - "stddev": 0.3243275372848446, - "mean": 108.94859928142239, - "stddev_pct": 0.2976885792235679, - "min": 108.54965536664594, - "max": 109.2877946140919 + "user.time": { + "mean": 5968892.4, + "stddev": 97094.01175067389, + "stddev_pct": 1.626667147671717, + "min": 5779598.0, + "max": 6057783.0 + }, + "wall.time": { + "mean": 5873150.4, + "stddev": 78326.47894192615, + "stddev_pct": 1.3336365256698712, + "min": 5720137.0, + "max": 5941752.0 } - }, - "nodeVersion": "16.1.0" + } } }, - "exporting-pipeline": { + "encoders": { "0.4": { + "instructions": 10552131148.0, "nodeVersion": "16.1.0", "summary": { - "wall.time": { - "mean": 3486914.2, - "max": 3581878.0, - "stddev": 58517.39286195173, - "min": 3424182.0, - "stddev_pct": 1.6781999643682581 + "cpu.pct.wall.time": { + "mean": 107.58941789618248, + "stddev": 0.9958396712354695, + "stddev_pct": 0.9255925821593316, + "min": 104.65994807351044, + "max": 108.26359004144996 + }, + "max.res.size": { + "mean": 240614.8, + "stddev": 384.2334706919739, + "stddev_pct": 0.15968821148656437, + "min": 239836.0, + "max": 241152.0 + }, + "system.time": { + "mean": 1461005.2, + "stddev": 76328.65924120507, + "stddev_pct": 5.224393399914324, + "min": 1326080.0, + "max": 1569729.0 }, "user.time": { - "max": 3666967.0, - "stddev": 62518.297152433704, - "stddev_pct": 1.7530362577262777, - "min": 3484595.0, - "mean": 3566286.6 + "mean": 1846670.5, + "stddev": 61995.597369893934, + "stddev_pct": 3.357155343624861, + "min": 1768237.0, + "max": 1959917.0 + }, + "wall.time": { + "mean": 3075091.0, + "stddev": 114371.83012962589, + "stddev_pct": 3.7192990428454276, + "min": 2918238.0, + "max": 3334329.0 + } + } + }, + "0.5": { + "instructions": 5918452039.0, + "nodeVersion": "16.1.0", + "summary": { + "cpu.pct.wall.time": { + "mean": 110.3336449710584, + "stddev": 1.2931740451007865, + "stddev_pct": 1.172057757577028, + "min": 107.94800382165728, + "max": 111.74819484146 + }, + "max.res.size": { + "mean": 164756.0, + "stddev": 589.4431270275361, + "stddev_pct": 0.3577673207819661, + "min": 163452.0, + "max": 165164.0 }, "system.time": { - "max": 141130.0, - "mean": 108416.3, - "stddev_pct": 15.400499762474585, - "stddev": 16696.652023983734, - "min": 80694.0 + "mean": 289374.6, + "stddev": 18628.839444259538, + "stddev_pct": 6.437620801638961, + "min": 260382.0, + "max": 324449.0 + }, + "user.time": { + "mean": 815741.0, + "stddev": 40066.41090240053, + "stddev_pct": 4.911658345283678, + "min": 772477.0, + "max": 893915.0 + }, + "wall.time": { + "mean": 1001947.7, + "stddev": 36469.88316145255, + "stddev_pct": 3.6398988850867715, + "min": 951394.0, + "max": 1072359.0 + } + } + } + }, + "exporting-pipeline": { + "0.4": { + "instructions": 30546053292.0, + "nodeVersion": "16.1.0", + "summary": { + "cpu.pct.wall.time": { + "mean": 105.38767415013054, + "stddev": 0.45122180827025316, + "stddev_pct": 0.4281542522965853, + "min": 104.25840337609628, + "max": 105.8898191088212 }, "max.res.size": { - "stddev_pct": 0.728758169108364, "mean": 120370.8, "stddev": 877.2120382210906, + "stddev_pct": 0.728758169108364, "min": 118744.0, "max": 121896.0 }, - "cpu.pct.wall.time": { - "stddev": 0.45122180827025316, - "min": 104.25840337609628, - "mean": 105.38767415013054, - "max": 105.8898191088212, - "stddev_pct": 0.4281542522965853 + "system.time": { + "mean": 108416.3, + "stddev": 16696.652023983734, + "stddev_pct": 15.400499762474585, + "min": 80694.0, + "max": 141130.0 + }, + "user.time": { + "mean": 3566286.6, + "stddev": 62518.297152433704, + "stddev_pct": 1.7530362577262777, + "min": 3484595.0, + "max": 3666967.0 + }, + "wall.time": { + "mean": 3486914.2, + "stddev": 58517.39286195173, + "stddev_pct": 1.6781999643682581, + "min": 3424182.0, + "max": 3581878.0 } - }, - "instructions": 30546053292.0 + } }, "0.5": { + "instructions": 14590901463.0, "nodeVersion": "16.1.0", "summary": { "cpu.pct.wall.time": { - "max": 110.67787670451769, - "stddev": 0.5509542580844528, "mean": 109.55085830276452, + "stddev": 0.5509542580844528, "stddev_pct": 0.5029209872201881, - "min": 108.76103549441758 + "min": 108.76103549441758, + "max": 110.67787670451769 }, "max.res.size": { "mean": 106058.8, - "max": 116784.0, - "min": 99688.0, "stddev": 5381.5736137304675, - "stddev_pct": 5.074141526898727 + "stddev_pct": 5.074141526898727, + "min": 99688.0, + "max": 116784.0 }, "system.time": { "mean": 114583.6, - "max": 154054.0, - "min": 93537.0, "stddev": 16605.321925214215, - "stddev_pct": 14.491883589985141 + "stddev_pct": 14.491883589985141, + "min": 93537.0, + "max": 154054.0 }, "user.time": { - "stddev": 109013.54402316255, "mean": 2199584.9, + "stddev": 109013.54402316255, "stddev_pct": 4.956096217207281, - "max": 2486423.0, - "min": 2061620.0 + "min": 2061620.0, + "max": 2486423.0 }, "wall.time": { - "min": 1964192.0, - "max": 2389452.0, + "mean": 2112736.6, "stddev": 107222.11399352281, "stddev_pct": 5.075034625401141, - "mean": 2112736.6 + "min": 1964192.0, + "max": 2389452.0 } - }, - "instructions": 14590901463.0 + } } } }