From 0d7a16c0ac5d7246af41a43e02e6ef9da7c410e9 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 13:35:38 -0500 Subject: [PATCH 01/17] perf: avoid lexical-list scans over ordinary repeated records --- benchmarks/rust-xml-regression/run_core.py | 18 ++-- crates/polyxml-core/src/serializer.rs | 14 +++- .../tests/test_runtime_fast_paths.rs | 83 +++++++++++++++++++ 3 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 crates/polyxml-core/tests/test_runtime_fast_paths.rs diff --git a/benchmarks/rust-xml-regression/run_core.py b/benchmarks/rust-xml-regression/run_core.py index 7010ba3..8c2d751 100644 --- a/benchmarks/rust-xml-regression/run_core.py +++ b/benchmarks/rust-xml-regression/run_core.py @@ -19,6 +19,10 @@ def main(): parser.add_argument("--baseline", type=Path, required=True) parser.add_argument("--output", type=Path, required=True) parser.add_argument("--rounds", type=int, default=2) + parser.add_argument("--samples", type=int, default=100) + parser.add_argument("--warmup", type=float, default=3) + parser.add_argument("--measurement", type=float, default=5) + parser.add_argument("--filter", default="") args = parser.parse_args() if args.rounds < 1: parser.error("--rounds must be positive") @@ -83,10 +87,11 @@ def main(): json.dumps( { "revisions": revisions, - "sample_size": 100, - "warmup_seconds": 3, - "measurement_seconds": 5, + "sample_size": args.samples, + "warmup_seconds": args.warmup, + "measurement_seconds": args.measurement, "rounds": args.rounds, + "filter": args.filter, "order": "alternate baseline/current per round", "os": platform.platform(), "cpu": Path("/proc/cpuinfo") @@ -112,11 +117,12 @@ def main(): "--bench", "--noplot", "--sample-size", - "100", + str(args.samples), "--warm-up-time", - "3", + str(args.warmup), "--measurement-time", - "5", + str(args.measurement), + *([args.filter] if args.filter else []), ], cwd=crate, env=env, diff --git a/crates/polyxml-core/src/serializer.rs b/crates/polyxml-core/src/serializer.rs index 3c30e48..22b38c6 100644 --- a/crates/polyxml-core/src/serializer.rs +++ b/crates/polyxml-core/src/serializer.rs @@ -240,6 +240,14 @@ impl XmlSerializer { } } + fn has_lexical_list(ty: &ValueType) -> bool { + match ty { + ValueType::Scalar(ScalarType::List(_)) => true, + ValueType::List(inner) => Self::has_lexical_list(inner), + _ => false, + } + } + fn validate_lexical_list_items(ty: &ValueType, value: &PolyValue) -> Result<()> { if let ValueType::Scalar(ScalarType::List(_)) = ty { if let PolyValue::List(items) = value { @@ -258,8 +266,10 @@ impl XmlSerializer { )); } } else if let (ValueType::List(inner), PolyValue::List(items)) = (ty, value) { - for item in items { - Self::validate_lexical_list_items(inner, item)?; + if Self::has_lexical_list(inner) { + for item in items { + Self::validate_lexical_list_items(inner, item)?; + } } } Ok(()) diff --git a/crates/polyxml-core/tests/test_runtime_fast_paths.rs b/crates/polyxml-core/tests/test_runtime_fast_paths.rs new file mode 100644 index 0000000..81e18e6 --- /dev/null +++ b/crates/polyxml-core/tests/test_runtime_fast_paths.rs @@ -0,0 +1,83 @@ +use std::collections::HashMap; +use std::sync::Arc; + +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize, PolyValue}; + +fn object(name: &str, value: PolyValue) -> PolyValue { + PolyValue::Object(HashMap::from([(name.into(), value)])) +} + +fn words(value: &str) -> PolyValue { + PolyValue::List(vec![PolyValue::String(value.into())]) +} + +#[test] +fn repeated_lexical_lists_keep_whitespace_validation() { + let schema = ModelSchema::builder("Root") + .field(FieldSchema::new( + "words", + b"Words", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Scalar(ScalarType::List(Box::new( + ScalarType::String, + ))))), + )) + .build(); + let valid = object( + "words", + PolyValue::List(vec![words("alpha"), words("beta")]), + ); + let output = serialize("Root", &valid, &schema, None).unwrap(); + assert_eq!(valid, deserialize(&output, Arc::clone(&schema)).unwrap()); + for invalid in [ + "two words", + "", + "line\nbreak", + "tab\tbreak", + "carriage\rreturn", + ] { + let value = object( + "words", + PolyValue::List(vec![words("alpha"), words(invalid)]), + ); + assert!(serialize("Root", &value, &schema, None) + .unwrap_err() + .to_string() + .contains("whitespace-separated list item")); + } +} + +#[test] +fn repeated_nested_records_validate_their_own_lexical_lists() { + let child = ModelSchema::builder("Child") + .field(FieldSchema::new( + "words", + b"Words", + FieldKind::Element, + ValueType::Scalar(ScalarType::List(Box::new(ScalarType::String))), + )) + .build(); + let schema = ModelSchema::builder("Root") + .field(FieldSchema::new( + "children", + b"Child", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Nested(child))), + )) + .build(); + let valid = object( + "children", + PolyValue::List(vec![object("words", words("alpha"))]), + ); + let output = serialize("Root", &valid, &schema, None).unwrap(); + assert_eq!(valid, deserialize(&output, Arc::clone(&schema)).unwrap()); + let invalid = object( + "children", + PolyValue::List(vec![object("words", words("two words"))]), + ); + assert!(serialize("Root", &invalid, &schema, None) + .unwrap_err() + .to_string() + .contains("whitespace-separated list item")); +} From 246fcf5df2b643812beee7b30be4a03dbf197664 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 13:40:16 -0500 Subject: [PATCH 02/17] perf: select constrained fields before serializer prevalidation --- benchmarks/rust-xml-regression/run_core.py | 2 ++ crates/polyxml-core/src/serializer.rs | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/benchmarks/rust-xml-regression/run_core.py b/benchmarks/rust-xml-regression/run_core.py index 8c2d751..94ac4c0 100644 --- a/benchmarks/rust-xml-regression/run_core.py +++ b/benchmarks/rust-xml-regression/run_core.py @@ -109,6 +109,8 @@ def main(): ["baseline", "current"] if round_index % 2 == 0 else ["current", "baseline"] ): crate, executable = executables[label] + # A filter must not retain results from earlier unfiltered runs. + shutil.rmtree(crate / "target/criterion", ignore_errors=True) with (output / f"{label}-{round_index}.txt").open("w") as log: run( [ diff --git a/crates/polyxml-core/src/serializer.rs b/crates/polyxml-core/src/serializer.rs index 22b38c6..2940ef6 100644 --- a/crates/polyxml-core/src/serializer.rs +++ b/crates/polyxml-core/src/serializer.rs @@ -240,6 +240,7 @@ impl XmlSerializer { } } + #[inline] fn has_lexical_list(ty: &ValueType) -> bool { match ty { ValueType::Scalar(ScalarType::List(_)) => true, @@ -343,9 +344,11 @@ impl XmlSerializer { }; for (index, field) in schema.fields.iter().enumerate() { - if let Some(value) = get_field(index, &field.name) { - crate::schema::validate_fixed(field, value)?; - Self::validate_lexical_list_items(&field.val_type, value)?; + if field.fixed_value.is_some() || Self::has_lexical_list(&field.val_type) { + if let Some(value) = get_field(index, &field.name) { + crate::schema::validate_fixed(field, value)?; + Self::validate_lexical_list_items(&field.val_type, value)?; + } } } From a6ecc085af3bac14e39f9d193b8d500d9c974dd5 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 13:47:19 -0500 Subject: [PATCH 03/17] perf: retain scalar field indices instead of cloning schema metadata --- benchmarks/rust-xml-regression/run_core.py | 5 ++- crates/polyxml-core/src/parser.rs | 24 ++++++---- .../tests/test_runtime_fast_paths.rs | 44 +++++++++++++++++++ 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/benchmarks/rust-xml-regression/run_core.py b/benchmarks/rust-xml-regression/run_core.py index 94ac4c0..4095c77 100644 --- a/benchmarks/rust-xml-regression/run_core.py +++ b/benchmarks/rust-xml-regression/run_core.py @@ -23,6 +23,7 @@ def main(): parser.add_argument("--warmup", type=float, default=3) parser.add_argument("--measurement", type=float, default=5) parser.add_argument("--filter", default="") + parser.add_argument("--harness", type=Path) args = parser.parse_args() if args.rounds < 1: parser.error("--rounds must be positive") @@ -32,7 +33,9 @@ def main(): build = root / "benchmarks/rust-xml-regression/target" env = os.environ | {"CARGO_BUILD_JOBS": "1", "POLYXML_MEMCAP_BACKEND": "systemd"} # Use one harness for both revisions, with round-trip checks outside timing. - source = (root / "crates/polyxml-core/benches/core_benchmarks.rs").read_text() + source = ( + args.harness or root / "crates/polyxml-core/benches/core_benchmarks.rs" + ).read_text() source = source.replace( " (schema, xml)\n", ' let value = deserialize(&xml, Arc::clone(&schema)).unwrap();\n let output = serialize("Sensor", &value, &schema, None).unwrap();\n assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap());\n (schema, xml)\n', diff --git a/crates/polyxml-core/src/parser.rs b/crates/polyxml-core/src/parser.rs index 891f033..5f3e51b 100644 --- a/crates/polyxml-core/src/parser.rs +++ b/crates/polyxml-core/src/parser.rs @@ -417,7 +417,7 @@ impl XmlDeserializer { Self::parse_attributes(root_start, &mut root_frame)?; stack.push(root_frame); - let mut active_scalar_field: Option<(usize, ScalarType, bool)> = None; + let mut active_scalar_field: Option<(usize, bool)> = None; let mut active_mixed_scalar: Option<(String, ScalarType)> = None; let mut unknown_depth: usize = 0; let mut any_stack: Vec = Vec::new(); @@ -476,24 +476,24 @@ impl XmlDeserializer { { let field = ¤t_schema.fields[field_idx]; match &field.val_type { - ValueType::Scalar(st) => { + ValueType::Scalar(_) => { if is_nil { stack.last_mut().unwrap().values[field_idx] = Some(PolyValue::Null); } else { - active_scalar_field = Some((field_idx, st.clone(), false)); + active_scalar_field = Some((field_idx, false)); text_buf.clear(); } } ValueType::List(inner) => match inner.as_ref() { - ValueType::Scalar(st) => { + ValueType::Scalar(_) => { if is_nil { stack .last_mut() .unwrap() .push_list_item(field_idx, PolyValue::Null); } else { - active_scalar_field = Some((field_idx, st.clone(), true)); + active_scalar_field = Some((field_idx, true)); text_buf.clear(); } } @@ -907,10 +907,18 @@ impl XmlDeserializer { if let Some((kind, scalar_type)) = active_mixed_scalar.take() { let parsed = ValueConverter::parse_scalar(&scalar_type, &text_buf, &kind)?; stack.last_mut().unwrap().push_mixed_item(&kind, parsed); - } else if let Some((field_idx, ref scalar_type, is_list)) = - active_scalar_field.take() - { + } else if let Some((field_idx, is_list)) = active_scalar_field.take() { let field = &stack.last().unwrap().schema.fields[field_idx]; + // The frame retains the schema while a scalar is active. + // Keep its index rather than cloning enum/pattern metadata. + let scalar_type = match &field.val_type { + ValueType::Scalar(scalar) => scalar, + ValueType::List(inner) => match inner.as_ref() { + ValueType::Scalar(scalar) => scalar, + _ => unreachable!("active scalar list has a scalar item type"), + }, + _ => unreachable!("active scalar field has a scalar type"), + }; let parsed_val = parse_field_scalar(scalar_type, &text_buf, field)?; let frame = stack.last_mut().unwrap(); if is_list { diff --git a/crates/polyxml-core/tests/test_runtime_fast_paths.rs b/crates/polyxml-core/tests/test_runtime_fast_paths.rs index 81e18e6..d3edc31 100644 --- a/crates/polyxml-core/tests/test_runtime_fast_paths.rs +++ b/crates/polyxml-core/tests/test_runtime_fast_paths.rs @@ -81,3 +81,47 @@ fn repeated_nested_records_validate_their_own_lexical_lists() { .to_string() .contains("whitespace-separated list item")); } + +#[test] +fn indexed_scalar_state_preserves_enum_pattern_and_split_text() { + let mut schema = ModelSchema::builder("Root") + .field(FieldSchema::new( + "states", + b"State", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Scalar(ScalarType::Enum(vec![ + "R&D".into(), + "Ready".into(), + ])))), + )) + .field(FieldSchema::new( + "code", + b"Code", + FieldKind::Element, + ValueType::Scalar(ScalarType::Pattern( + Box::new(ScalarType::String), + vec!["[A-Z]&[A-Z]".into()], + )), + )) + .build(); + let xml = b"R&ReadyA&"; + let value = deserialize(xml, Arc::clone(&schema)).unwrap(); + assert_eq!( + value.get("states"), + Some(&PolyValue::List(vec![ + PolyValue::String("R&D".into()), + PolyValue::String("Ready".into()) + ])) + ); + assert_eq!(value.get("code").and_then(PolyValue::as_str), Some("A&B")); + assert!(deserialize(b"invalid", Arc::clone(&schema)).is_err()); + assert!(deserialize(b"invalid", Arc::clone(&schema)).is_err()); + drop(value); + // Public schema metadata remains mutable before sharing the Arc. No stale plan. + Arc::get_mut(&mut schema).unwrap().fields[0].val_type = + ValueType::List(Box::new(ValueType::Scalar(ScalarType::Enum(vec![ + "Done".into() + ])))); + assert!(deserialize(b"Ready", Arc::clone(&schema)).is_err()); + assert!(deserialize(b"Done", schema).is_ok()); +} From dd3bbc796af62703432f8baa2bd16eb9ca342e58 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 13:54:10 -0500 Subject: [PATCH 04/17] perf: reuse anchored scalar regexes in a bounded concurrent cache --- crates/polyxml-core/src/converters.rs | 10 +- crates/polyxml-core/src/lib.rs | 1 + crates/polyxml-core/src/pattern.rs | 124 ++++++++++++++++++ .../tests/test_runtime_fast_paths.rs | 48 +++++++ 4 files changed, 175 insertions(+), 8 deletions(-) create mode 100644 crates/polyxml-core/src/pattern.rs diff --git a/crates/polyxml-core/src/converters.rs b/crates/polyxml-core/src/converters.rs index 9ed8523..c1779c1 100644 --- a/crates/polyxml-core/src/converters.rs +++ b/crates/polyxml-core/src/converters.rs @@ -42,9 +42,7 @@ impl ValueConverter { && facets.min_length.is_none_or(|n| length >= n) && facets.max_length.is_none_or(|n| length <= n); for pattern in &facets.patterns { - valid &= regex::Regex::new(&format!("\\A(?:{pattern})\\z")) - .map(|r| r.is_match(text)) - .unwrap_or(false); + valid &= crate::pattern::matches(pattern, text); } for (bound, inclusive, minimum) in [ (&facets.min_inclusive, true, true), @@ -120,11 +118,7 @@ impl ValueConverter { ScalarType::Pattern(base, patterns) => { let value = std::str::from_utf8(trim_bytes(bytes))?; for pattern in patterns { - let anchored = format!(r"\A(?:{pattern})\z"); - if !regex::Regex::new(&anchored) - .map(|compiled| compiled.is_match(value)) - .unwrap_or(false) - { + if !crate::pattern::matches(pattern, value) { return Err(PolyXmlError::ScalarParseError { field: field_name.to_string(), expected: "pattern", diff --git a/crates/polyxml-core/src/lib.rs b/crates/polyxml-core/src/lib.rs index dac0fd9..3204ce8 100644 --- a/crates/polyxml-core/src/lib.rs +++ b/crates/polyxml-core/src/lib.rs @@ -5,6 +5,7 @@ pub mod integer; pub mod ir; pub mod json; pub mod parser; +mod pattern; pub mod schema; pub mod schema_parser; pub mod serializer; diff --git a/crates/polyxml-core/src/pattern.rs b/crates/polyxml-core/src/pattern.rs new file mode 100644 index 0000000..14b4e19 --- /dev/null +++ b/crates/polyxml-core/src/pattern.rs @@ -0,0 +1,124 @@ +//! Bounded process-wide reuse of anchored XML scalar patterns. +use std::collections::{HashMap, VecDeque}; +use std::sync::{Arc, OnceLock, RwLock}; + +const MAX_ENTRIES: usize = 16; +const MAX_KEY_BYTES: usize = 4096; + +#[derive(Clone)] +enum CompiledPattern { + Valid(Arc), + Invalid, +} + +impl CompiledPattern { + fn compile(pattern: &str) -> Self { + match regex::Regex::new(&format!(r"\A(?:{pattern})\z")) { + Ok(regex) => Self::Valid(Arc::new(regex)), + Err(_) => Self::Invalid, + } + } + + fn matches(&self, value: &str) -> bool { + match self { + Self::Valid(regex) => regex.is_match(value), + Self::Invalid => false, + } + } +} + +#[derive(Default)] +struct PatternCache { + entries: HashMap, + order: VecDeque, +} + +impl PatternCache { + fn insert(&mut self, pattern: &str, compiled: CompiledPattern) { + if self.entries.len() == MAX_ENTRIES { + if let Some(oldest) = self.order.pop_front() { + self.entries.remove(&oldest); + } + } + self.order.push_back(pattern.into()); + self.entries.insert(pattern.into(), compiled); + } +} + +static CACHE: OnceLock> = OnceLock::new(); + +pub(crate) fn matches(pattern: &str, value: &str) -> bool { + // Bound entry and key retention without changing regex acceptance limits. + if pattern.len() > MAX_KEY_BYTES { + return CompiledPattern::compile(pattern).matches(value); + } + let cache = CACHE.get_or_init(|| RwLock::new(PatternCache::default())); + let cached = { + let guard = cache.read().unwrap_or_else(|poison| poison.into_inner()); + guard.entries.get(pattern).cloned() + }; + if let Some(compiled) = cached { + return compiled.matches(value); + } + + // Compilation and matching happen outside the lock. Concurrent misses can + // compile twice, but installation rechecks the key and retains one entry. + let compiled = CompiledPattern::compile(pattern); + let installed = { + let mut guard = cache.write().unwrap_or_else(|poison| poison.into_inner()); + if let Some(existing) = guard.entries.get(pattern) { + existing.clone() + } else { + guard.insert(pattern, compiled.clone()); + compiled + } + }; + installed.matches(value) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn bounded_cache_evicts_and_retains_invalid_results() { + let mut cache = PatternCache::default(); + cache.insert("[", CompiledPattern::compile("[")); + assert!(!cache.entries["["].matches("anything")); + for i in 0..MAX_ENTRIES { + let pattern = format!("VALUE{i}"); + cache.insert(&pattern, CompiledPattern::compile(&pattern)); + } + assert_eq!(cache.entries.len(), MAX_ENTRIES); + assert_eq!(cache.order.len(), MAX_ENTRIES); + assert!(!cache.entries.contains_key("[")); + assert!(cache.entries["VALUE0"].matches("VALUE0")); + assert!(!cache.entries["VALUE0"].matches("VALUE00")); + } + + #[test] + fn cache_matches_uncached_regex_under_churn_and_concurrency() { + let threads: Vec<_> = (0..4) + .map(|thread| { + std::thread::spawn(move || { + for i in 0..64 { + let pattern = format!("T{thread}-[0-9]{{{}}}", i % 8 + 1); + let text = format!("T{thread}-{}", "1".repeat(i % 8 + 1)); + assert!(matches(&pattern, &text)); + assert!(!matches(&pattern, &(text + "x"))); + } + }) + }) + .collect(); + for thread in threads { + thread.join().unwrap(); + } + assert!(!matches("[", "anything")); + assert!(matches("é+", "éé")); + assert!(!matches("é+", "é\n")); + assert!(matches( + &"a".repeat(MAX_KEY_BYTES + 1), + &"a".repeat(MAX_KEY_BYTES + 1) + )); + } +} diff --git a/crates/polyxml-core/tests/test_runtime_fast_paths.rs b/crates/polyxml-core/tests/test_runtime_fast_paths.rs index d3edc31..b82bfd2 100644 --- a/crates/polyxml-core/tests/test_runtime_fast_paths.rs +++ b/crates/polyxml-core/tests/test_runtime_fast_paths.rs @@ -125,3 +125,51 @@ fn indexed_scalar_state_preserves_enum_pattern_and_split_text() { assert!(deserialize(b"Ready", Arc::clone(&schema)).is_err()); assert!(deserialize(b"Done", schema).is_ok()); } + +#[test] +fn cached_patterns_keep_raw_restriction_and_trimmed_pattern_semantics() { + use polyxml::converters::ValueConverter; + use polyxml::ir::RestrictionFacets; + let pattern = ScalarType::Pattern(Box::new(ScalarType::String), vec!["[A-Z]+".into()]); + let restriction = ScalarType::Restricted( + Box::new(ScalarType::String), + Box::new(RestrictionFacets { + patterns: vec!["[A-Z]+".into()], + ..Default::default() + }), + ); + for _ in 0..3 { + assert_eq!( + ValueConverter::parse_scalar(&pattern, b" AB ", "code").unwrap(), + PolyValue::String(" AB ".into()) + ); + assert!(ValueConverter::parse_scalar(&restriction, b" AB ", "code").is_err()); + assert!(ValueConverter::parse_scalar(&restriction, b"AB", "code").is_ok()); + assert!(ValueConverter::parse_scalar(&pattern, b"AB\nX", "code").is_err()); + let invalid = ScalarType::Pattern(Box::new(ScalarType::String), vec!["[".into()]); + assert!(ValueConverter::parse_scalar(&invalid, b"AB", "code").is_err()); + } + let mut schema = ModelSchema::builder("Root") + .field(FieldSchema::new( + "code", + b"Code", + FieldKind::Element, + ValueType::Scalar(pattern), + )) + .build(); + assert!(deserialize(b"AB", Arc::clone(&schema)).is_ok()); + Arc::get_mut(&mut schema).unwrap().fields[0].val_type = ValueType::Scalar(ScalarType::Pattern( + Box::new(ScalarType::String), + vec!["[0-9]+".into()], + )); + assert!(deserialize(b"AB", Arc::clone(&schema)).is_err()); + let value = deserialize(b"12", Arc::clone(&schema)).unwrap(); + serialize("Root", &value, &schema, None).unwrap(); + assert!(serialize( + "Root", + &object("code", PolyValue::String("AB".into())), + &schema, + None + ) + .is_err()); +} From dafb7ddb91251f85a8b9b5c114b01c387b613385 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:02:04 -0500 Subject: [PATCH 05/17] perf: stream lexical-list formatting into one output string --- crates/polyxml-core/src/serializer.rs | 23 ++++++---- .../tests/test_runtime_fast_paths.rs | 44 +++++++++++++++++++ 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/crates/polyxml-core/src/serializer.rs b/crates/polyxml-core/src/serializer.rs index 2940ef6..a4b93ce 100644 --- a/crates/polyxml-core/src/serializer.rs +++ b/crates/polyxml-core/src/serializer.rs @@ -213,6 +213,7 @@ impl XmlSerializer { Ok(buffer.into_inner()) } + #[inline] fn format_scalar_to<'a>( val: &'a PolyValue, buf: &'a mut [u8; lexical_core::BUFFER_SIZE], @@ -227,19 +228,25 @@ impl XmlSerializer { let bytes = lexical_core::write(*f, buf); std::str::from_utf8(bytes).ok().map(Cow::Borrowed) } - PolyValue::List(items) => { - let mut parts = Vec::with_capacity(items.len()); - for item in items { - let mut buffer = [0u8; lexical_core::BUFFER_SIZE]; - parts.push(Self::format_scalar_to(item, &mut buffer)?.into_owned()); - } - Some(Cow::Owned(parts.join(" "))) - } + PolyValue::List(items) => Self::format_lexical_list(items).map(Cow::Owned), PolyValue::Bool(b) => Some(Cow::Borrowed(if *b { "true" } else { "false" })), _ => None, } } + fn format_lexical_list(items: &[PolyValue]) -> Option { + let mut text = String::new(); + for (index, item) in items.iter().enumerate() { + let mut buffer = [0u8; lexical_core::BUFFER_SIZE]; + let part = Self::format_scalar_to(item, &mut buffer)?; + if index > 0 { + text.push(' '); + } + text.push_str(&part); + } + Some(text) + } + #[inline] fn has_lexical_list(ty: &ValueType) -> bool { match ty { diff --git a/crates/polyxml-core/tests/test_runtime_fast_paths.rs b/crates/polyxml-core/tests/test_runtime_fast_paths.rs index b82bfd2..de16c32 100644 --- a/crates/polyxml-core/tests/test_runtime_fast_paths.rs +++ b/crates/polyxml-core/tests/test_runtime_fast_paths.rs @@ -173,3 +173,47 @@ fn cached_patterns_keep_raw_restriction_and_trimmed_pattern_semantics() { ) .is_err()); } + +#[test] +fn lexical_list_formatting_preserves_escaping_empty_lists_and_long_numbers() { + let schema = ModelSchema::builder("Root") + .field(FieldSchema::new( + "words", + b"Words", + FieldKind::Element, + ValueType::Scalar(ScalarType::List(Box::new(ScalarType::String))), + )) + .field(FieldSchema::new( + "numbers", + b"Numbers", + FieldKind::Element, + ValueType::Scalar(ScalarType::List(Box::new(ScalarType::Int))), + )) + .build(); + for words in [ + vec![], + vec![ + PolyValue::String("<&".into()), + PolyValue::String("\"'".into()), + ], + ] { + let value = PolyValue::Object(HashMap::from([ + ("words".into(), PolyValue::List(words)), + ( + "numbers".into(), + PolyValue::List(vec![ + PolyValue::Int(i64::MIN), + PolyValue::Int(0), + PolyValue::Int(i64::MAX), + ]), + ), + ])); + for indent in [None, Some(2)] { + let output = serialize("Root", &value, &schema, indent).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + assert!(String::from_utf8(output) + .unwrap() + .contains("-9223372036854775808 0 9223372036854775807")); + } + } +} From 7f50cbd42f4036ef243f3de1c6dc1396c3346660 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:04:07 -0500 Subject: [PATCH 06/17] perf: append XML events directly to the output byte vector --- crates/polyxml-core/src/serializer.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/polyxml-core/src/serializer.rs b/crates/polyxml-core/src/serializer.rs index a4b93ce..f68ba99 100644 --- a/crates/polyxml-core/src/serializer.rs +++ b/crates/polyxml-core/src/serializer.rs @@ -1,6 +1,5 @@ use std::borrow::Cow; use std::collections::HashMap; -use std::io::Cursor; use quick_xml::events::{BytesEnd, BytesStart, BytesText, Event}; use quick_xml::Writer; @@ -189,7 +188,7 @@ impl XmlSerializer { enable_namespaces: Option, ns_map: Option<&HashMap>, ) -> Result> { - let mut buffer = Cursor::new(Vec::with_capacity(512)); + let mut buffer = Vec::with_capacity(512); let mut writer = match indent { Some(spaces) => Writer::new_with_indent(&mut buffer, b' ', spaces), None => Writer::new(&mut buffer), @@ -210,7 +209,7 @@ impl XmlSerializer { schema.namespace.as_deref(), )?; - Ok(buffer.into_inner()) + Ok(buffer) } #[inline] From d682520d52d3c1983af1167018772a0e98f9fc1d Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:09:33 -0500 Subject: [PATCH 07/17] perf: unify scalar parsing around indices into frame-owned schemas --- crates/polyxml-core/src/parser.rs | 130 ++++++++++-------- .../tests/test_runtime_fast_paths.rs | 24 ++++ 2 files changed, 100 insertions(+), 54 deletions(-) diff --git a/crates/polyxml-core/src/parser.rs b/crates/polyxml-core/src/parser.rs index 5f3e51b..afc027e 100644 --- a/crates/polyxml-core/src/parser.rs +++ b/crates/polyxml-core/src/parser.rs @@ -12,6 +12,11 @@ use crate::value::PolyValue; type NamespaceScope = Arc>; +enum ActiveScalar { + Field { index: usize, repeated: bool }, + Mixed { branch: usize }, +} + pub(crate) struct StackFrame { schema: Arc, values: SmallVec<[Option; 8]>, @@ -39,7 +44,7 @@ impl StackFrame { } } - fn push_mixed_item(&mut self, kind: &str, value: PolyValue) { + fn push_mixed_item(&mut self, kind: impl Into, value: PolyValue) { if let Some(mixed) = &self.schema.mixed_content { let mut item = HashMap::new(); item.insert("kind".into(), PolyValue::String(kind.into())); @@ -417,8 +422,7 @@ impl XmlDeserializer { Self::parse_attributes(root_start, &mut root_frame)?; stack.push(root_frame); - let mut active_scalar_field: Option<(usize, bool)> = None; - let mut active_mixed_scalar: Option<(String, ScalarType)> = None; + let mut active_scalar: Option = None; let mut unknown_depth: usize = 0; let mut any_stack: Vec = Vec::new(); let mut text_buf: Vec = Vec::new(); @@ -432,14 +436,11 @@ impl XmlDeserializer { unknown_depth += 1; continue; } - if active_scalar_field.is_none() - && active_mixed_scalar.is_none() - && any_stack.is_empty() - { + if active_scalar.is_none() && any_stack.is_empty() { let scope = namespace_stack.last().unwrap(); record_content_token(stack.last_mut().unwrap(), e, scope); } - if active_scalar_field.is_some() || active_mixed_scalar.is_some() { + if active_scalar.is_some() { unknown_depth = 1; continue; } @@ -481,7 +482,10 @@ impl XmlDeserializer { stack.last_mut().unwrap().values[field_idx] = Some(PolyValue::Null); } else { - active_scalar_field = Some((field_idx, false)); + active_scalar = Some(ActiveScalar::Field { + index: field_idx, + repeated: false, + }); text_buf.clear(); } } @@ -493,7 +497,10 @@ impl XmlDeserializer { .unwrap() .push_list_item(field_idx, PolyValue::Null); } else { - active_scalar_field = Some((field_idx, true)); + active_scalar = Some(ActiveScalar::Field { + index: field_idx, + repeated: true, + }); text_buf.clear(); } } @@ -535,7 +542,12 @@ impl XmlDeserializer { } } } else if let Some(mixed) = ¤t_schema.mixed_content { - if let Some(branch) = mixed.branch(local_name.as_ref().as_bytes()) { + if let Some(branch_index) = mixed + .branches + .iter() + .position(|branch| branch.xml_name == local_name.as_ref().as_bytes()) + { + let branch = &mixed.branches[branch_index]; if is_nil { stack .last_mut() @@ -544,9 +556,10 @@ impl XmlDeserializer { unknown_depth = 1; } else { match &branch.val_type { - ValueType::Scalar(scalar) => { - active_mixed_scalar = - Some((branch.variant_name.clone(), scalar.clone())); + ValueType::Scalar(_) => { + active_scalar = Some(ActiveScalar::Mixed { + branch: branch_index, + }); text_buf.clear(); } ValueType::Nested(sub_schema) => { @@ -609,10 +622,7 @@ impl XmlDeserializer { } } Ok(Event::Empty(ref e)) => { - if unknown_depth > 0 - || active_scalar_field.is_some() - || active_mixed_scalar.is_some() - { + if unknown_depth > 0 || active_scalar.is_some() { continue; } if any_stack.is_empty() { @@ -789,7 +799,7 @@ impl XmlDeserializer { let raw = e.as_ref(); let raw_bytes = raw.as_bytes(); if memchr::memchr(b'&', raw_bytes).is_none() { - if active_scalar_field.is_some() || active_mixed_scalar.is_some() { + if active_scalar.is_some() { text_buf.extend_from_slice(raw_bytes); } else if let Some(frame) = stack.last_mut() { if let Some(ref mut tb) = frame.frame_text_buf { @@ -800,7 +810,7 @@ impl XmlDeserializer { } } else { let unescaped = quick_xml::escape::unescape(raw)?; - if active_scalar_field.is_some() || active_mixed_scalar.is_some() { + if active_scalar.is_some() { text_buf.extend_from_slice(unescaped.as_bytes()); } else if let Some(frame) = stack.last_mut() { if let Some(ref mut tb) = frame.frame_text_buf { @@ -821,7 +831,7 @@ impl XmlDeserializer { } continue; } - if active_scalar_field.is_some() || active_mixed_scalar.is_some() { + if active_scalar.is_some() { text_buf.extend_from_slice(e.as_ref().as_bytes()); } else if let Some(frame) = stack.last_mut() { if let Some(ref mut tb) = frame.frame_text_buf { @@ -853,16 +863,8 @@ impl XmlDeserializer { continue; } let frame_tb = stack.last_mut().and_then(|f| f.frame_text_buf.as_mut()); - if active_scalar_field.is_some() - || active_mixed_scalar.is_some() - || frame_tb.is_some() - { - append_general_ref( - e, - active_scalar_field.is_some() || active_mixed_scalar.is_some(), - &mut text_buf, - frame_tb, - )?; + if active_scalar.is_some() || frame_tb.is_some() { + append_general_ref(e, active_scalar.is_some(), &mut text_buf, frame_tb)?; } else { let mut resolved = Vec::new(); append_general_ref(e, true, &mut resolved, None)?; @@ -904,37 +906,57 @@ impl XmlDeserializer { } continue; } - if let Some((kind, scalar_type)) = active_mixed_scalar.take() { - let parsed = ValueConverter::parse_scalar(&scalar_type, &text_buf, &kind)?; - stack.last_mut().unwrap().push_mixed_item(&kind, parsed); - } else if let Some((field_idx, is_list)) = active_scalar_field.take() { - let field = &stack.last().unwrap().schema.fields[field_idx]; - // The frame retains the schema while a scalar is active. - // Keep its index rather than cloning enum/pattern metadata. - let scalar_type = match &field.val_type { - ValueType::Scalar(scalar) => scalar, - ValueType::List(inner) => match inner.as_ref() { - ValueType::Scalar(scalar) => scalar, - _ => unreachable!("active scalar list has a scalar item type"), - }, - _ => unreachable!("active scalar field has a scalar type"), - }; - let parsed_val = parse_field_scalar(scalar_type, &text_buf, field)?; + if let Some(active) = active_scalar.take() { let frame = stack.last_mut().unwrap(); - if is_list { - frame.push_list_item(field_idx, parsed_val); - } else { - frame.values[field_idx] = Some(parsed_val); + match active { + ActiveScalar::Field { index, repeated } => { + let field = &frame.schema.fields[index]; + // Schema metadata remains owned by the active frame. + let scalar_type = match &field.val_type { + ValueType::Scalar(scalar) => scalar, + ValueType::List(inner) => match inner.as_ref() { + ValueType::Scalar(scalar) => scalar, + _ => unreachable!( + "active scalar list has a scalar item type" + ), + }, + _ => unreachable!("active scalar field has a scalar type"), + }; + let parsed = parse_field_scalar(scalar_type, &text_buf, field)?; + if repeated { + frame.push_list_item(index, parsed); + } else { + frame.values[index] = Some(parsed); + } + } + ActiveScalar::Mixed { branch } => { + let branch = &frame + .schema + .mixed_content + .as_ref() + .expect("active mixed scalar has a content model") + .branches[branch]; + let ValueType::Scalar(scalar) = &branch.val_type else { + unreachable!("active mixed scalar has a scalar type"); + }; + let parsed = ValueConverter::parse_scalar( + scalar, + &text_buf, + &branch.variant_name, + )?; + let kind = branch.variant_name.clone(); + frame.push_mixed_item(kind, parsed); + } } } else if stack.len() > 1 { - let finished_frame = stack.pop().unwrap(); + let mut finished_frame = stack.pop().unwrap(); let local_name = e.local_name(); - let mixed_kind = finished_frame.mixed_parent_kind.clone(); + let mixed_kind = finished_frame.mixed_parent_kind.take(); let instance = finished_frame.finish()?; let parent = stack.last_mut().unwrap(); if let Some(kind) = mixed_kind { - parent.push_mixed_item(&kind, instance); + parent.push_mixed_item(kind, instance); continue; } diff --git a/crates/polyxml-core/tests/test_runtime_fast_paths.rs b/crates/polyxml-core/tests/test_runtime_fast_paths.rs index de16c32..a856cec 100644 --- a/crates/polyxml-core/tests/test_runtime_fast_paths.rs +++ b/crates/polyxml-core/tests/test_runtime_fast_paths.rs @@ -217,3 +217,27 @@ fn lexical_list_formatting_preserves_escaping_empty_lists_and_long_numbers() { } } } + +#[test] +fn unified_scalar_state_keeps_mixed_branch_order_nil_and_nested_frames() { + use polyxml::schema_parser::XsdParser; + let ir = XsdParser::new().parse_str(r#" + + + + + + + "#).unwrap(); + let schema = ModelSchema::from_ir(&ir, Some("Root")).unwrap(); + for document in [ + "startR&mid-7Readyend", + "nestedafter0", + "Ready", + ] { + let value = deserialize(document.as_bytes(),Arc::clone(&schema)).unwrap(); + let output = serialize("Root",&value,&schema,None).unwrap(); + assert_eq!(value,deserialize(&output,Arc::clone(&schema)).unwrap()); + } + assert!(deserialize(b"invalid", schema).is_err()); +} From e8bf3060c54fdb28617031f043102a91f210bc8f Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:14:03 -0500 Subject: [PATCH 08/17] test: isolate mixed parser coverage from existing schema and nil writer limitations --- crates/polyxml-core/tests/test_runtime_fast_paths.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/polyxml-core/tests/test_runtime_fast_paths.rs b/crates/polyxml-core/tests/test_runtime_fast_paths.rs index a856cec..c0f13f1 100644 --- a/crates/polyxml-core/tests/test_runtime_fast_paths.rs +++ b/crates/polyxml-core/tests/test_runtime_fast_paths.rs @@ -222,7 +222,7 @@ fn lexical_list_formatting_preserves_escaping_empty_lists_and_long_numbers() { fn unified_scalar_state_keeps_mixed_branch_order_nil_and_nested_frames() { use polyxml::schema_parser::XsdParser; let ir = XsdParser::new().parse_str(r#" - + @@ -231,13 +231,14 @@ fn unified_scalar_state_keeps_mixed_branch_order_nil_and_nested_frames() { "#).unwrap(); let schema = ModelSchema::from_ir(&ir, Some("Root")).unwrap(); for document in [ - "startR&mid-7Readyend", + "startRemid-7Readyend", "nestedafter0", - "Ready", ] { let value = deserialize(document.as_bytes(),Arc::clone(&schema)).unwrap(); let output = serialize("Root",&value,&schema,None).unwrap(); assert_eq!(value,deserialize(&output,Arc::clone(&schema)).unwrap()); } + let nil_document = b"Ready"; + assert!(deserialize(nil_document, Arc::clone(&schema)).is_ok()); assert!(deserialize(b"invalid", schema).is_err()); } From c65d47d42ed6b11e849b769338c149f35c901ce8 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:17:23 -0500 Subject: [PATCH 09/17] bench: retain repeatable runtime diagnostics and constraint workloads --- .../polyxml-benchmark-workflow/SKILL.md | 6 ++ .agents/skills/polyxml-core-engine/SKILL.md | 22 +++++ .../polyxml-runtime-investigation/SKILL.md | 36 +++++++ benchmarks/README.md | 1 + .../rust-runtime-investigation/.gitignore | 2 + .../rust-runtime-investigation/README.md | 99 +++++++++++++++++++ .../rust-runtime-investigation/constraints.rs | 98 ++++++++++++++++++ .../rust-runtime-investigation/diagnostics.rs | 94 ++++++++++++++++++ benchmarks/rust-runtime-investigation/run.py | 93 +++++++++++++++++ .../rust-runtime-investigation/summarize.py | 51 ++++++++++ benchmarks/rust-xml-regression/run_core.py | 22 +++++ 11 files changed, 524 insertions(+) create mode 100644 .agents/skills/polyxml-runtime-investigation/SKILL.md create mode 100644 benchmarks/rust-runtime-investigation/.gitignore create mode 100644 benchmarks/rust-runtime-investigation/README.md create mode 100644 benchmarks/rust-runtime-investigation/constraints.rs create mode 100644 benchmarks/rust-runtime-investigation/diagnostics.rs create mode 100644 benchmarks/rust-runtime-investigation/run.py create mode 100644 benchmarks/rust-runtime-investigation/summarize.py diff --git a/.agents/skills/polyxml-benchmark-workflow/SKILL.md b/.agents/skills/polyxml-benchmark-workflow/SKILL.md index 9d76dd8..81dc9e0 100644 --- a/.agents/skills/polyxml-benchmark-workflow/SKILL.md +++ b/.agents/skills/polyxml-benchmark-workflow/SKILL.md @@ -66,3 +66,9 @@ description: Use when running, adding, or publishing PolyXML language and runtim revision order and repeat uncertain results before calling a regression. Check per-process medians as well as pooled samples; do not treat correlated samples as independent process repetitions or call noise a speedup. + +11. For runtime optimization experiments, consult + [polyxml-runtime-investigation](../polyxml-runtime-investigation/SKILL.md). + Its allocation and Callgrind consumers are diagnostic only. Confirm wins + with the uninstrumented Criterion runner, and anchor write-only filters as + `^serialization/` because `serialization` also matches deserialization. diff --git a/.agents/skills/polyxml-core-engine/SKILL.md b/.agents/skills/polyxml-core-engine/SKILL.md index 6320cee..1f67a06 100644 --- a/.agents/skills/polyxml-core-engine/SKILL.md +++ b/.agents/skills/polyxml-core-engine/SKILL.md @@ -250,3 +250,25 @@ records need not be walked for lexical-list validation at the outer field when its value type cannot be a lexical list. Preserve all constraints, mutable-schema semantics and full read/write regressions; source inspection alone does not prove which change caused a measured slowdown. Keep generated and dynamic timings separate. + +## Runtime hot paths + +Active scalar parser state stores field or mixed-branch indices into the schema +owned by its stack frame. Resolve metadata at the end event rather than cloning +rich enum/pattern definitions per occurrence. Keep split text, nil and nested +mixed-content tests when changing this state. + +Scalar regex validation uses the private process-wide `pattern` cache, keyed by +the exact original pattern and preserving anchored matching. Compilation and +matching run outside its lock. The FIFO admits 16 entries and keys up to 4,096 +bytes; larger keys bypass caching. These bound entries and key retention, not +compiled-regex memory. Public schema metadata remains mutable before sharing, +so avoid cached flags that become stale after edits. + +The serializer writes directly into an append-only byte vector and checks for +lexical-list obligations before traversing repeated values. Ordinary nested +records validate their own fields. Lexical lists append tokens to one string; +retain whitespace-token rejection, escaping and empty-list behavior. + +For measured changes, use +[polyxml-runtime-investigation](../polyxml-runtime-investigation/SKILL.md). diff --git a/.agents/skills/polyxml-runtime-investigation/SKILL.md b/.agents/skills/polyxml-runtime-investigation/SKILL.md new file mode 100644 index 0000000..922c18d --- /dev/null +++ b/.agents/skills/polyxml-runtime-investigation/SKILL.md @@ -0,0 +1,36 @@ +--- +name: polyxml-runtime-investigation +description: Diagnose and experimentally optimize regressions in PolyXML's dynamic Rust XML runtime using allocation counts, instruction profiles, and same-host latency comparisons. +--- + +# Dynamic XML runtime investigation + +Read [the investigation toolkit](../../../benchmarks/rust-runtime-investigation/README.md) +for exact commands and diagnostic boundaries. Keep generated XML/Serde consumers +separate from the schema-driven `PolyValue` runtime. + +- Start with an explicit detached baseline and a committed candidate on a branch. + Keep core sources stable while consumers build and run. Retain small experiments + independently so a failed hypothesis can be backed out without losing evidence. +- Use the counting allocator to distinguish allocation growth from CPU work. + Requested bytes are cumulative requests, not peak or retained memory. Larger + schema types can grow a fixed frame reserve without increasing allocation count. +- Use Callgrind's `measured_region` toggle for a fixed operation count. Its simulated + instruction count identifies candidates; verify changes with uninstrumented + Criterion consumers. Extracting Valgrind locally is an option when installation + would unnecessarily change the host. +- Run heavy work serially, with one Cargo worker and the repository memory cap. + Short comparisons screen hypotheses. Repeat retained improvements with longer + measurements, alternating revision order and preserving every raw sample. +- Anchor Criterion filters: `^serialization/` means writes only; `serialization` + also matches deserialization. Remove stale results only in the runner's owned + scratch directory before measurement, not from retained raw evidence. +- Check rich enums, patterns, lists and mixed branches alongside plain records. + Warm pattern-cache gains do not establish cold-start, churn or concurrent + throughput. Entry/key bounds do not constitute a compiled-regex byte budget. +- Preserve validation, errors, split Text/CData/GeneralRef handling, nil reads, + nesting and metadata mutation semantics. Borrow scalar metadata from the schema + owned by a frame instead of cloning rich scalar definitions per element. +- Publish positive and negative experiments with exact source revisions, raw + evidence and remaining regressions. Run the full quality gate before pushing + the experiment branch; a branch request does not authorize a merge to main. diff --git a/benchmarks/README.md b/benchmarks/README.md index dca4793..d15ec09 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -36,6 +36,7 @@ equivalent) and never at this root. | :--- | :--- | :--- | :--- | | Rust core engine | [`crates/polyxml-core/benches/`](../crates/polyxml-core/benches/) | [Criterion.rs](https://github.com/bheisler/criterion.rs) | `cargo bench --bench core_benchmarks` | | Rust same-host XML/Serde regression | [`rust-xml-regression/`](rust-xml-regression/README.md) | Generated consumers + Criterion | See suite README | +| Rust runtime investigation | [`rust-runtime-investigation/`](rust-runtime-investigation/README.md) | Dynamic core constraints, allocations and instruction profiles | See suite README | | Rust tag dispatch | [`crates/polyxml-core/benches/`](../crates/polyxml-core/benches/) | [Criterion.rs](https://github.com/bheisler/criterion.rs) + `perf stat` | `cargo bench --bench tag_dispatch` ([results](../docs/benchmarks/rust-phf-dispatch.md)) | | Rust end-to-end dispatch | [`rust-phf-e2e/`](rust-phf-e2e/README.md) | Generated decoders | `./benchmarks/rust-phf-e2e/run.sh` | | Rust dispatch compile cost | [`rust-phf-compile/`](rust-phf-compile/README.md) | Sequential capped release builds, GNU time, size | See suite README | diff --git a/benchmarks/rust-runtime-investigation/.gitignore b/benchmarks/rust-runtime-investigation/.gitignore new file mode 100644 index 0000000..9280984 --- /dev/null +++ b/benchmarks/rust-runtime-investigation/.gitignore @@ -0,0 +1,2 @@ +target/ +__pycache__/ diff --git a/benchmarks/rust-runtime-investigation/README.md b/benchmarks/rust-runtime-investigation/README.md new file mode 100644 index 0000000..9310402 --- /dev/null +++ b/benchmarks/rust-runtime-investigation/README.md @@ -0,0 +1,99 @@ +# Dynamic Rust XML runtime investigation + +These tools diagnose the schema-driven `PolyValue` runtime. Generated Rust XML +and JSON/Serde consumers have separate suites in +[`rust-xml-regression`](../rust-xml-regression/README.md). + +Start from a committed core implementation and an explicit detached baseline. +Run builds, profiles and latency measurements serially through `scripts/memcap.sh`. +The runners use one Cargo worker, systemd memory limits and disabled swap. Keep +source files stable until a comparison finishes; source revisions describe HEAD, +so an uncommitted core edit makes that identification incomplete. + +## Latency comparisons + +For plain records, use the current core harness for both revisions: + +```bash +python3 benchmarks/rust-xml-regression/run_core.py \ + --baseline ../polyxml-perf-control \ + --output benchmarks/rust-runtime-investigation/target/evidence/final-core \ + --rounds 3 --samples 100 --warmup 3 --measurement 5 +``` + +For scalar constraints and content-model validation, use the alternate harness: + +```bash +python3 benchmarks/rust-xml-regression/run_core.py \ + --baseline ../polyxml-perf-control \ + --harness benchmarks/rust-runtime-investigation/constraints.rs \ + --output benchmarks/rust-runtime-investigation/target/evidence/final-constraints \ + --rounds 3 --samples 100 --warmup 3 --measurement 5 +python3 benchmarks/rust-runtime-investigation/summarize.py \ + benchmarks/rust-runtime-investigation/target/evidence/final-constraints +``` + +Both harnesses check decoded values and XML round trips before timing. The +constraint harness measures 1,000 repeated values: a 16-member enum, one scalar +pattern, a string restriction with a pattern and length, lexical integer lists, +and a content regex. Pattern cases measure **warm reuse**, including value +validation but excluding the first compilation. They do not characterize cold +patterns, cache churn, many-pattern schemas or multithreaded throughput. + +Criterion filters are regexes: use `--filter '^serialization/'` for writes only. +The unanchored filter `serialization` also matches `deserialization`. The runner +clears its own Criterion directory before each process, retains separate results +and alternates baseline/candidate order. Short runs (`--rounds 2 --samples 50 +--warmup 1 --measurement 2`) screen hypotheses; confirm useful changes with longer +runs. The summarizer takes the median of independent process mean estimates and +retains each process's confidence interval and delta. It does not manufacture a +confidence interval across process repetitions. + +## Allocation diagnostics + +```bash +python3 benchmarks/rust-runtime-investigation/run.py \ + --repo ../polyxml-perf-control --label control \ + --output benchmarks/rust-runtime-investigation/target/evidence/control +python3 benchmarks/rust-runtime-investigation/run.py \ + --repo . --label candidate \ + --output benchmarks/rust-runtime-investigation/target/evidence/candidate +``` + +The standalone release consumer enables a counting allocator only around the +measured operation. It counts allocations, reallocations and requested bytes; +requested bytes are cumulative requests, **not peak RSS or retained memory**. +Schema construction, ten warmup operations, and correctness checks are outside +the counted region. The returned value or byte buffer is destroyed in that +region. Use count 0 for the sensor and 1,000/10,000 for catalogs. Diagnostic +binaries contain instrumentation even when counting is disabled; never use +these binaries for latency claims. Public schema/scalar/value sizes are recorded +to distinguish per-frame growth from per-value heap allocation. + +## Instruction profiles + +With Valgrind installed, profile the same consumer and fixed number of operations: + +```bash +scripts/memcap.sh valgrind --tool=callgrind --collect-atstart=no \ + --toggle-collect=measured_region \ + --callgrind-out-file=target/read.callgrind \ + --log-file=target/read-valgrind.txt --error-exitcode=93 \ + benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics \ + read 1000 25 instructions +callgrind_annotate --auto=no --inclusive=no --threshold=95 \ + target/read.callgrind > target/read-annotated.txt +``` + +`measured_region` is deliberately not inlined. Collection excludes startup and +warmup; the release consumer retains line tables for attribution. Callgrind +counts executed instructions in a simulation; those counts explain hypotheses, +but do not measure hardware cycles or prove a latency improvement. If Valgrind +is extracted into an isolated directory, set `VALGRIND_LIB` to its matching +`usr/libexec/valgrind` directory and invoke its executable by absolute path. + +Retain baseline and candidate profiles, source harnesses, lockfiles, build logs, +metadata, every Criterion sample and verification logs under a dated +`docs/benchmarks/data/` directory. Link the resulting report from the benchmark +index. Include experiments that failed to improve performance, and state what +remains slower than the historical baseline. diff --git a/benchmarks/rust-runtime-investigation/constraints.rs b/benchmarks/rust-runtime-investigation/constraints.rs new file mode 100644 index 0000000..92b0c13 --- /dev/null +++ b/benchmarks/rust-runtime-investigation/constraints.rs @@ -0,0 +1,98 @@ +use criterion::{ + criterion_group, criterion_main, BenchmarkId, Criterion, SamplingMode, Throughput, +}; +use polyxml::ir::RestrictionFacets; +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize, PolyValue}; +use std::{hint::black_box, sync::Arc}; + +fn fixture(kind: &str, count: usize) -> (Arc, Vec) { + let scalar = match kind { + "enum" => ScalarType::Enum((0..16).map(|i| format!("STATE{i}")).collect()), + "pattern" => ScalarType::Pattern( + Box::new(ScalarType::String), + vec!["[A-Z]{3}[0-9]{3}".into()], + ), + "restricted" => ScalarType::Restricted( + Box::new(ScalarType::String), + Box::new(RestrictionFacets { + patterns: vec!["[A-Z]{3}[0-9]{3}".into()], + length: Some(6), + ..Default::default() + }), + ), + "list" => ScalarType::List(Box::new(ScalarType::Int)), + "content" => ScalarType::String, + _ => unreachable!(), + }; + let mut builder = ModelSchema::builder("Root").field(FieldSchema::new( + "values", + b"Value", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Scalar(scalar))), + )); + if kind == "content" { + builder = builder + .content_pattern(polyxml::schema::compile_content_pattern("(?:Value;)*").unwrap()); + } + let schema = builder.build(); + let mut xml = String::from(""); + for i in 0..count { + let value = match kind { + "enum" => format!("STATE{}", i % 16), + "pattern" | "restricted" => format!("ABC{:03}", i % 1000), + "list" => format!("{i} {} -1", i + 1), + _ => format!("record-{i}"), + }; + xml.push_str(&format!("{value}")); + } + xml.push_str(""); + let value = deserialize(xml.as_bytes(), Arc::clone(&schema)).unwrap(); + let values = value.get("values").unwrap().as_list().unwrap(); + assert_eq!(values.len(), count); + for (i, value) in values.iter().enumerate() { + match kind { + "enum" => assert_eq!(value.as_str(), Some(format!("STATE{}", i % 16).as_str())), + "pattern" | "restricted" => { + assert_eq!(value.as_str(), Some(format!("ABC{:03}", i % 1000).as_str())) + } + "list" => assert_eq!( + value, + &PolyValue::List(vec![ + PolyValue::Int(i as i64), + PolyValue::Int(i as i64 + 1), + PolyValue::Int(-1) + ]) + ), + _ => assert_eq!(value.as_str(), Some(format!("record-{i}").as_str())), + } + } + let output = serialize("Root", &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + (schema, xml.into_bytes()) +} +fn benchmarks(c: &mut Criterion) { + for operation in ["constraint_read", "constraint_write"] { + let mut group = c.benchmark_group(operation); + group.sampling_mode(SamplingMode::Flat); + for kind in ["enum", "pattern", "restricted", "list", "content"] { + let (schema, xml) = fixture(kind, 1000); + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + group.throughput(Throughput::Bytes(xml.len() as u64)); + group.bench_function(BenchmarkId::new(kind, 1000), |b| { + if operation == "constraint_read" { + b.iter(|| { + black_box(deserialize(black_box(&xml), Arc::clone(&schema)).unwrap()) + }); + } else { + b.iter(|| { + black_box(serialize("Root", black_box(&value), &schema, None).unwrap()) + }); + } + }); + } + group.finish(); + } +} +criterion_group!(benches, benchmarks); +criterion_main!(benches); diff --git a/benchmarks/rust-runtime-investigation/diagnostics.rs b/benchmarks/rust-runtime-investigation/diagnostics.rs new file mode 100644 index 0000000..1fbe95d --- /dev/null +++ b/benchmarks/rust-runtime-investigation/diagnostics.rs @@ -0,0 +1,94 @@ +// Fixture definitions are extracted verbatim from core_benchmarks.rs by run.py. +include!("fixtures.rs"); + +use std::alloc::{GlobalAlloc, Layout, System}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; + +struct CountingAllocator; +static COUNTING: AtomicBool = AtomicBool::new(false); +static ALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static REALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static BYTES: AtomicUsize = AtomicUsize::new(0); + +// Diagnostic instrumentation only. The benchmark consumers use System directly. +unsafe impl GlobalAlloc for CountingAllocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc(layout) } + } + unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc_zeroed(layout) } + } + unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { + unsafe { System.dealloc(ptr, layout) } + } + unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + REALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(new_size, Ordering::Relaxed); + } + unsafe { System.realloc(ptr, layout, new_size) } + } +} +#[global_allocator] +static ALLOCATOR: CountingAllocator = CountingAllocator; + +fn main() { + let args: Vec = std::env::args().collect(); + let operation = args.get(1).expect("read or write"); + let count: usize = args + .get(2) + .expect("0 for sensor, or catalog count") + .parse() + .unwrap(); + let iterations: usize = args.get(3).expect("iteration count").parse().unwrap(); + let mode = args.get(4).map(String::as_str).unwrap_or("allocations"); + let (schema, xml) = if count == 0 { + build_sensor_fixture() + } else { + build_catalog_fixture(count) + }; + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let root = if count == 0 { "Sensor" } else { "Catalog" }; + let output = serialize(root, &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + for _ in 0..10 { + if operation == "read" { + black_box(deserialize(&xml, Arc::clone(&schema)).unwrap()); + } else { + black_box(serialize(root, &value, &schema, None).unwrap()); + } + } + COUNTING.store(mode == "allocations", Ordering::Relaxed); + measured_region(operation, iterations, &xml, &value, root, &schema); + COUNTING.store(false, Ordering::Relaxed); + println!("operation={operation},count={count},iterations={iterations},allocations={},reallocations={},requested_bytes={},input_bytes={},output_bytes={},field_schema_bytes={},scalar_type_bytes={},value_type_bytes={},poly_value_bytes={}", + ALLOCATIONS.load(Ordering::Relaxed), REALLOCATIONS.load(Ordering::Relaxed), BYTES.load(Ordering::Relaxed), xml.len(), output.len(), + std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::()); +} + +#[inline(never)] +#[no_mangle] +fn measured_region( + operation: &str, + iterations: usize, + xml: &[u8], + value: &polyxml::PolyValue, + root: &str, + schema: &Arc, +) { + for _ in 0..iterations { + if operation == "read" { + black_box(deserialize(black_box(xml), Arc::clone(schema)).unwrap()); + } else { + black_box(serialize(root, black_box(value), schema, None).unwrap()); + } + } +} diff --git a/benchmarks/rust-runtime-investigation/run.py b/benchmarks/rust-runtime-investigation/run.py new file mode 100644 index 0000000..42ea96d --- /dev/null +++ b/benchmarks/rust-runtime-investigation/run.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Build identical allocation diagnostics against an explicit source checkout.""" + +import argparse +import json +import os +import subprocess +from pathlib import Path + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--repo", type=Path, required=True) + parser.add_argument("--label", required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + root = Path(__file__).resolve().parents[2] + repo = args.repo.resolve() + output = args.output.resolve() + output.mkdir(parents=True, exist_ok=True) + crate = root / "benchmarks/rust-runtime-investigation/target" / args.label + (crate / "src").mkdir(parents=True, exist_ok=True) + fixtures = ( + (root / "crates/polyxml-core/benches/core_benchmarks.rs") + .read_text() + .split("fn bench_deserialization")[0] + ) + fixtures = "\n".join( + line for line in fixtures.splitlines() if not line.startswith("use criterion::") + ) + (crate / "src/fixtures.rs").write_text(fixtures + "\n") + (crate / "src/main.rs").write_bytes( + (Path(__file__).parent / "diagnostics.rs").read_bytes() + ) + (crate / "Cargo.toml").write_text( + '[package]\nname="xml-diagnostics"\nversion="0.0.0"\nedition="2021"\n[workspace]\n[dependencies]\npolyxml={path=' + + json.dumps(str(repo / "crates/polyxml-core")) + + "}\n[profile.release]\ndebug=1\n" + ) + seed = root / "benchmarks/rust-xml-regression/target/core-current/Cargo.lock" + if seed.exists(): + (crate / "Cargo.lock").write_bytes(seed.read_bytes()) + env = os.environ | {"CARGO_BUILD_JOBS": "1", "POLYXML_MEMCAP_BACKEND": "systemd"} + with (output / f"{args.label}-build.txt").open("w") as log: + subprocess.run( + [ + str(root / "scripts/memcap.sh"), + "cargo", + "build", + "--release", + "--manifest-path", + str(crate / "Cargo.toml"), + ], + env=env, + stdout=log, + stderr=subprocess.STDOUT, + check=True, + ) + executable = crate / "target/release/xml-diagnostics" + with (output / f"{args.label}-allocations.txt").open("w") as log: + for count in [0, 1000, 10000]: + for operation in ["read", "write"]: + subprocess.run( + [ + str(root / "scripts/memcap.sh"), + str(executable), + operation, + str(count), + "1", + ], + env=env, + stdout=log, + stderr=subprocess.STDOUT, + check=True, + ) + (output / f"{args.label}.lock").write_bytes((crate / "Cargo.lock").read_bytes()) + (output / f"{args.label}-metadata.json").write_text( + json.dumps( + { + "revision": subprocess.check_output( + ["git", "-C", str(repo), "rev-parse", "HEAD"], text=True + ).strip(), + "executable": str(executable), + "profile": "release debug=1; allocation instrumentation; not used for latency numbers", + }, + indent=2, + ) + + "\n" + ) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/rust-runtime-investigation/summarize.py b/benchmarks/rust-runtime-investigation/summarize.py new file mode 100644 index 0000000..eda91bb --- /dev/null +++ b/benchmarks/rust-runtime-investigation/summarize.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +"""Summarize an explicit experiment's independent Criterion process rounds.""" + +import argparse +import json +import statistics +from pathlib import Path + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("experiment", type=Path) + args = parser.parse_args() + metadata = json.loads((args.experiment / "metadata.json").read_text()) + records = {} + for file in sorted((args.experiment / "baseline-0").rglob("new/estimates.json")): + key = file.relative_to(args.experiment / "baseline-0") + estimates = { + label: [ + json.loads((args.experiment / f"{label}-{i}" / key).read_text())["mean"] + for i in range(metadata["rounds"]) + ] + for label in ["baseline", "current"] + } + values = { + label: [row["point_estimate"] for row in rows] + for label, rows in estimates.items() + } + old, new = ( + statistics.median(values[label]) for label in ["baseline", "current"] + ) + name = str(key.parent.parent) + records[name] = { + "baseline_ns": old, + "candidate_ns": new, + "delta_percent": (new / old - 1) * 100, + "speedup": old / new, + "process_deltas_percent": [ + (b / a - 1) * 100 + for a, b in zip(values["baseline"], values["current"], strict=True) + ], + "process_estimates": estimates, + } + print( + f"{name:45} {old / 1000:10.3f} -> {new / 1000:10.3f} us; {(new / old - 1) * 100:+.2f}%; {old / new:.2f}x" + ) + (args.experiment / "summary.json").write_text(json.dumps(records, indent=2) + "\n") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/rust-xml-regression/run_core.py b/benchmarks/rust-xml-regression/run_core.py index 4095c77..b9b164a 100644 --- a/benchmarks/rust-xml-regression/run_core.py +++ b/benchmarks/rust-xml-regression/run_core.py @@ -27,8 +27,12 @@ def main(): args = parser.parse_args() if args.rounds < 1: parser.error("--rounds must be positive") + if args.samples < 10 or args.warmup <= 0 or args.measurement <= 0: + parser.error("use at least 10 samples and positive warmup/measurement times") root = Path(__file__).resolve().parents[2] output = args.output.resolve() + if (output / "metadata.json").exists(): + parser.error("choose a new output directory to preserve earlier evidence") output.mkdir(parents=True, exist_ok=True) build = root / "benchmarks/rust-xml-regression/target" env = os.environ | {"CARGO_BUILD_JOBS": "1", "POLYXML_MEMCAP_BACKEND": "systemd"} @@ -47,10 +51,27 @@ def main(): (output / "harness.rs").write_text(source) executables = {} revisions = {} + core_status = {} for label, repo in [("baseline", args.baseline.resolve()), ("current", root)]: revisions[label] = run( ["git", "-C", str(repo), "rev-parse", "HEAD"], capture_output=True ).stdout.strip() + core_status[label] = run( + [ + "git", + "-C", + str(repo), + "status", + "--porcelain", + "--", + "crates/polyxml-core", + ], + capture_output=True, + ).stdout + if core_status[label]: + parser.error( + f"commit core changes before measuring {label}: {core_status[label]}" + ) crate = build / f"core-{label}" (crate / "benches").mkdir(parents=True, exist_ok=True) (crate / "benches/xml.rs").write_text(source) @@ -90,6 +111,7 @@ def main(): json.dumps( { "revisions": revisions, + "core_status": core_status, "sample_size": args.samples, "warmup_seconds": args.warmup, "measurement_seconds": args.measurement, From 5a6be5c0b480a6c4a07a6ebac7c9ebfb8f789fb5 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:19:50 -0500 Subject: [PATCH 10/17] bench: expose scalar pattern cache working-set boundaries --- .../rust-runtime-investigation/README.md | 7 ++ .../cache_boundaries.rs | 67 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 benchmarks/rust-runtime-investigation/cache_boundaries.rs diff --git a/benchmarks/rust-runtime-investigation/README.md b/benchmarks/rust-runtime-investigation/README.md index 9310402..b0f5d0d 100644 --- a/benchmarks/rust-runtime-investigation/README.md +++ b/benchmarks/rust-runtime-investigation/README.md @@ -97,3 +97,10 @@ metadata, every Criterion sample and verification logs under a dated `docs/benchmarks/data/` directory. Link the resulting report from the benchmark index. Include experiments that failed to improve performance, and state what remains slower than the historical baseline. + +`cache_boundaries.rs` is a second alternate harness for the cache's working-set +boundary: 1, 16, 17 and 64 distinct patterns, eight occurrences per pattern. +Reads cycle pattern keys to force FIFO misses above capacity. Writes visit each +field's eight occurrences consecutively, so they can still reuse each compiled +regex locally even when the full schema exceeds capacity. Run it with the same +`--harness` option and retain both cases; field order affects reuse. diff --git a/benchmarks/rust-runtime-investigation/cache_boundaries.rs b/benchmarks/rust-runtime-investigation/cache_boundaries.rs new file mode 100644 index 0000000..1965916 --- /dev/null +++ b/benchmarks/rust-runtime-investigation/cache_boundaries.rs @@ -0,0 +1,67 @@ +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, SamplingMode}; +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize}; +use std::{hint::black_box, sync::Arc}; + +// Cycle through more than the admitted cache capacity to measure FIFO misses. +// Schema construction and correctness checks remain outside measurement. +fn fixture(patterns: usize) -> (Arc, Vec) { + let mut builder = ModelSchema::builder("Root"); + for i in 0..patterns { + builder = builder.field(FieldSchema::new( + format!("values{i}"), + format!("Value{i}").as_bytes(), + FieldKind::Element, + ValueType::List(Box::new(ValueType::Scalar(ScalarType::Pattern( + Box::new(ScalarType::String), + vec![format!("P{i}-[0-9]{{3}}")], + )))), + )); + } + let schema = builder.build(); + let mut xml = String::from(""); + for _ in 0..8 { + for i in 0..patterns { + xml.push_str(&format!("P{i}-123")); + } + } + xml.push_str(""); + let value = deserialize(xml.as_bytes(), Arc::clone(&schema)).unwrap(); + for i in 0..patterns { + let values = value.get(&format!("values{i}")).unwrap().as_list().unwrap(); + assert_eq!(values.len(), 8); + assert!(values + .iter() + .all(|value| value.as_str() == Some(format!("P{i}-123").as_str()))); + } + let output = serialize("Root", &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + (schema, xml.into_bytes()) +} + +fn benchmarks(c: &mut Criterion) { + for operation in ["cache_read", "cache_write"] { + let mut group = c.benchmark_group(operation); + group.sampling_mode(SamplingMode::Flat); + for patterns in [1, 16, 17, 64] { + let (schema, xml) = fixture(patterns); + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + group.bench_with_input( + BenchmarkId::new("active_patterns", patterns), + &patterns, + |b, _| { + b.iter(|| { + if operation == "cache_read" { + black_box(deserialize(black_box(&xml), Arc::clone(&schema)).unwrap()); + } else { + black_box(serialize("Root", black_box(&value), &schema, None).unwrap()); + } + }); + }, + ); + } + group.finish(); + } +} +criterion_group!(benches, benchmarks); +criterion_main!(benches); From 8cd09503cc7cf2f287955fc7e5dfddc3ba2a6769 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:26:41 -0500 Subject: [PATCH 11/17] bench: record input byte lengths for pattern working sets --- benchmarks/rust-runtime-investigation/cache_boundaries.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/benchmarks/rust-runtime-investigation/cache_boundaries.rs b/benchmarks/rust-runtime-investigation/cache_boundaries.rs index 1965916..4e410c6 100644 --- a/benchmarks/rust-runtime-investigation/cache_boundaries.rs +++ b/benchmarks/rust-runtime-investigation/cache_boundaries.rs @@ -1,4 +1,6 @@ -use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, SamplingMode}; +use criterion::{ + criterion_group, criterion_main, BenchmarkId, Criterion, SamplingMode, Throughput, +}; use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; use polyxml::{deserialize, serialize}; use std::{hint::black_box, sync::Arc}; @@ -46,6 +48,7 @@ fn benchmarks(c: &mut Criterion) { for patterns in [1, 16, 17, 64] { let (schema, xml) = fixture(patterns); let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + group.throughput(Throughput::Bytes(xml.len() as u64)); group.bench_with_input( BenchmarkId::new("active_patterns", patterns), &patterns, From ac485e0421cadd8781e044e1f658932a532b0438 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:40:41 -0500 Subject: [PATCH 12/17] bench: snapshot diagnostic harnesses and reject uncommitted core sources --- benchmarks/rust-runtime-investigation/run.py | 23 +++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/benchmarks/rust-runtime-investigation/run.py b/benchmarks/rust-runtime-investigation/run.py index 42ea96d..26b8185 100644 --- a/benchmarks/rust-runtime-investigation/run.py +++ b/benchmarks/rust-runtime-investigation/run.py @@ -4,6 +4,7 @@ import argparse import json import os +import platform import subprocess from pathlib import Path @@ -16,6 +17,15 @@ def main(): args = parser.parse_args() root = Path(__file__).resolve().parents[2] repo = args.repo.resolve() + revision = subprocess.check_output( + ["git", "-C", str(repo), "rev-parse", "HEAD"], text=True + ).strip() + core_status = subprocess.check_output( + ["git", "-C", str(repo), "status", "--porcelain", "--", "crates/polyxml-core"], + text=True, + ) + if core_status: + parser.error("commit core changes before collecting diagnostics") output = args.output.resolve() output.mkdir(parents=True, exist_ok=True) crate = root / "benchmarks/rust-runtime-investigation/target" / args.label @@ -37,6 +47,12 @@ def main(): + json.dumps(str(repo / "crates/polyxml-core")) + "}\n[profile.release]\ndebug=1\n" ) + for name, source in [ + ("harness.rs", crate / "src/main.rs"), + ("fixtures.rs", crate / "src/fixtures.rs"), + ("Cargo.toml", crate / "Cargo.toml"), + ]: + (output / f"{args.label}-{name}").write_bytes(source.read_bytes()) seed = root / "benchmarks/rust-xml-regression/target/core-current/Cargo.lock" if seed.exists(): (crate / "Cargo.lock").write_bytes(seed.read_bytes()) @@ -77,9 +93,10 @@ def main(): (output / f"{args.label}-metadata.json").write_text( json.dumps( { - "revision": subprocess.check_output( - ["git", "-C", str(repo), "rev-parse", "HEAD"], text=True - ).strip(), + "revision": revision, + "core_status": core_status, + "os": platform.platform(), + "rustc": subprocess.check_output(["rustc", "-Vv"], text=True), "executable": str(executable), "profile": "release debug=1; allocation instrumentation; not used for latency numbers", }, From 45f5af3d9f96c6990ea978d5ebffb78b1f5f2650 Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:46:47 -0500 Subject: [PATCH 13/17] bench: summarize generated controls and document preflight rebuild hazards --- .../polyxml-runtime-investigation/SKILL.md | 4 ++ .../rust-runtime-investigation/README.md | 8 ++++ .../rust-runtime-investigation/summarize.py | 42 +++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/.agents/skills/polyxml-runtime-investigation/SKILL.md b/.agents/skills/polyxml-runtime-investigation/SKILL.md index 922c18d..ccdaf0b 100644 --- a/.agents/skills/polyxml-runtime-investigation/SKILL.md +++ b/.agents/skills/polyxml-runtime-investigation/SKILL.md @@ -19,6 +19,10 @@ separate from the schema-driven `PolyValue` runtime. instruction count identifies candidates; verify changes with uninstrumented Criterion consumers. Extracting Valgrind locally is an option when installation would unnecessarily change the host. +- Preflight companion tooling before timing. Even `uv run runner.py --help` can + synchronize and rebuild an editable binding. After preparing its environment, + use `uv run --no-sync` for companion runs. If a build overlaps timing, retain + and mark that attempt as contaminated, then repeat it. - Run heavy work serially, with one Cargo worker and the repository memory cap. Short comparisons screen hypotheses. Repeat retained improvements with longer measurements, alternating revision order and preserving every raw sample. diff --git a/benchmarks/rust-runtime-investigation/README.md b/benchmarks/rust-runtime-investigation/README.md index b0f5d0d..c4cf4dc 100644 --- a/benchmarks/rust-runtime-investigation/README.md +++ b/benchmarks/rust-runtime-investigation/README.md @@ -6,6 +6,8 @@ and JSON/Serde consumers have separate suites in Start from a committed core implementation and an explicit detached baseline. Run builds, profiles and latency measurements serially through `scripts/memcap.sh`. +Preflight companion tools before timing: even `uv run ... --help` can rebuild an +editable extension. Use `uv run --no-sync` after preparing that environment. The runners use one Cargo worker, systemd memory limits and disabled swap. Keep source files stable until a comparison finishes; source revisions describe HEAD, so an uncommitted core edit makes that identification incomplete. @@ -104,3 +106,9 @@ Reads cycle pattern keys to force FIFO misses above capacity. Writes visit each field's eight occurrences consecutively, so they can still reuse each compiled regex locally even when the full schema exceeds capacity. Run it with the same `--harness` option and retain both cases; field order affects reuse. + +For the generated sensor control, run the XML/Serde regression runner and use +`python3 benchmarks/rust-runtime-investigation/summarize.py --generated DIR` on +its output directory. This computes each process's median of seven timing +samples, then the median across processes; it retains the process deltas. The +statistic differs from the Criterion process means above. diff --git a/benchmarks/rust-runtime-investigation/summarize.py b/benchmarks/rust-runtime-investigation/summarize.py index eda91bb..3aed672 100644 --- a/benchmarks/rust-runtime-investigation/summarize.py +++ b/benchmarks/rust-runtime-investigation/summarize.py @@ -2,6 +2,8 @@ """Summarize an explicit experiment's independent Criterion process rounds.""" import argparse +import csv +from collections import defaultdict import json import statistics from pathlib import Path @@ -10,7 +12,11 @@ def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("experiment", type=Path) + parser.add_argument("--generated", action="store_true") args = parser.parse_args() + if args.generated: + summarize_generated(args.experiment) + return metadata = json.loads((args.experiment / "metadata.json").read_text()) records = {} for file in sorted((args.experiment / "baseline-0").rglob("new/estimates.json")): @@ -47,5 +53,41 @@ def main(): (args.experiment / "summary.json").write_text(json.dumps(records, indent=2) + "\n") +def summarize_generated(experiment): + records = defaultdict(lambda: defaultdict(list)) + for path in sorted(experiment.glob("*.csv")): + label, mode, _ = path.stem.split("-") + samples = defaultdict(list) + with path.open() as source: + for row in csv.DictReader(source): + samples[(row["operation"], row["count"])].append( + float(row["ns_per_op"]) + ) + for (operation, count), values in samples.items(): + records[(mode, operation, count)][label].append(statistics.median(values)) + summary = {} + for key, values in sorted(records.items()): + old, new = ( + statistics.median(values[label]) for label in ["baseline", "current"] + ) + name = "/".join(key) + summary[name] = { + "baseline_ns": old, + "candidate_ns": new, + "delta_percent": (new / old - 1) * 100, + "speedup": old / new, + "process_values_ns": values, + "process_deltas_percent": [ + (b / a - 1) * 100 + for a, b in zip(values["baseline"], values["current"], strict=True) + ], + "statistic": "median across process sample medians", + } + print( + f"{name:45} {old / 1000:10.3f} -> {new / 1000:10.3f} us; {(new / old - 1) * 100:+.2f}%" + ) + (experiment / "summary.json").write_text(json.dumps(summary, indent=2) + "\n") + + if __name__ == "__main__": main() From 19e76286ce73af355cc43fd26dc1a3f8394a0b1d Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 14:47:00 -0500 Subject: [PATCH 14/17] style: sort diagnostic summarizer imports --- benchmarks/rust-runtime-investigation/summarize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/rust-runtime-investigation/summarize.py b/benchmarks/rust-runtime-investigation/summarize.py index 3aed672..fd6fdc8 100644 --- a/benchmarks/rust-runtime-investigation/summarize.py +++ b/benchmarks/rust-runtime-investigation/summarize.py @@ -3,9 +3,9 @@ import argparse import csv -from collections import defaultdict import json import statistics +from collections import defaultdict from pathlib import Path From c2ea06b867337097091663bb522922ea583bd2db Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 15:00:14 -0500 Subject: [PATCH 15/17] perf: avoid cyclic scalar-pattern cache misses with salted victim selection --- crates/polyxml-core/src/pattern.rs | 51 ++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/crates/polyxml-core/src/pattern.rs b/crates/polyxml-core/src/pattern.rs index 14b4e19..0b05aad 100644 --- a/crates/polyxml-core/src/pattern.rs +++ b/crates/polyxml-core/src/pattern.rs @@ -1,5 +1,6 @@ //! Bounded process-wide reuse of anchored XML scalar patterns. -use std::collections::{HashMap, VecDeque}; +use std::collections::HashMap; +use std::hash::BuildHasher; use std::sync::{Arc, OnceLock, RwLock}; const MAX_ENTRIES: usize = 16; @@ -30,17 +31,26 @@ impl CompiledPattern { #[derive(Default)] struct PatternCache { entries: HashMap, - order: VecDeque, + keys: Vec, + eviction_nonce: u64, } impl PatternCache { fn insert(&mut self, pattern: &str, compiled: CompiledPattern) { if self.entries.len() == MAX_ENTRIES { - if let Some(oldest) = self.order.pop_front() { - self.entries.remove(&oldest); - } + // FIFO misses on every access when a cycle exceeds capacity by one. + // Salt the victim selection with each eviction to break that cycle, + // using the existing randomized hasher without another dependency. + self.eviction_nonce = self.eviction_nonce.wrapping_add(1); + let victim = self + .entries + .hasher() + .hash_one((pattern, self.eviction_nonce)) as usize + % MAX_ENTRIES; + let displaced = self.keys.swap_remove(victim); + self.entries.remove(&displaced); } - self.order.push_back(pattern.into()); + self.keys.push(pattern.into()); self.entries.insert(pattern.into(), compiled); } } @@ -90,10 +100,31 @@ mod tests { cache.insert(&pattern, CompiledPattern::compile(&pattern)); } assert_eq!(cache.entries.len(), MAX_ENTRIES); - assert_eq!(cache.order.len(), MAX_ENTRIES); - assert!(!cache.entries.contains_key("[")); - assert!(cache.entries["VALUE0"].matches("VALUE0")); - assert!(!cache.entries["VALUE0"].matches("VALUE00")); + assert_eq!(cache.keys.len(), MAX_ENTRIES); + assert!(cache.entries["VALUE15"].matches("VALUE15")); + assert!(!cache.entries["VALUE15"].matches("VALUE150")); + } + + #[test] + fn cyclic_working_set_above_capacity_keeps_reusing_entries() { + let mut cache = PatternCache::default(); + let patterns: Vec<_> = (0..MAX_ENTRIES + 1).map(|i| format!("VALUE{i}")).collect(); + let operations = patterns.len() * 512; + let mut misses = 0; + for pattern in patterns.iter().cycle().take(operations) { + if !cache.entries.contains_key(pattern) { + misses += 1; + cache.insert(pattern, CompiledPattern::compile(pattern)); + } + assert!(cache.entries[pattern].matches(pattern)); + assert!(cache.entries.len() <= MAX_ENTRIES); + } + // A generous bound checks reuse rather than one random eviction order. + // FIFO would miss on every operation after the initial fill. + assert!( + misses < operations / 2, + "misses={misses}, operations={operations}" + ); } #[test] From 7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 15:09:34 -0500 Subject: [PATCH 16/17] docs: record the cache eviction experiment and its bounded working set --- .agents/skills/polyxml-core-engine/SKILL.md | 6 ++++-- .agents/skills/polyxml-runtime-investigation/SKILL.md | 4 ++++ benchmarks/rust-runtime-investigation/README.md | 3 ++- benchmarks/rust-runtime-investigation/cache_boundaries.rs | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.agents/skills/polyxml-core-engine/SKILL.md b/.agents/skills/polyxml-core-engine/SKILL.md index 1f67a06..86dd4b3 100644 --- a/.agents/skills/polyxml-core-engine/SKILL.md +++ b/.agents/skills/polyxml-core-engine/SKILL.md @@ -260,9 +260,11 @@ mixed-content tests when changing this state. Scalar regex validation uses the private process-wide `pattern` cache, keyed by the exact original pattern and preserving anchored matching. Compilation and -matching run outside its lock. The FIFO admits 16 entries and keys up to 4,096 +matching run outside its lock. The cache admits 16 entries and keys up to 4,096 bytes; larger keys bypass caching. These bound entries and key retention, not -compiled-regex memory. Public schema metadata remains mutable before sharing, +compiled-regex memory. At capacity it selects a victim using the existing +randomized hasher and an eviction nonce; FIFO would miss on every access for a +cycle of 17 patterns. Public schema metadata remains mutable before sharing, so avoid cached flags that become stale after edits. The serializer writes directly into an append-only byte vector and checks for diff --git a/.agents/skills/polyxml-runtime-investigation/SKILL.md b/.agents/skills/polyxml-runtime-investigation/SKILL.md index ccdaf0b..b43445f 100644 --- a/.agents/skills/polyxml-runtime-investigation/SKILL.md +++ b/.agents/skills/polyxml-runtime-investigation/SKILL.md @@ -35,6 +35,10 @@ separate from the schema-driven `PolyValue` runtime. - Preserve validation, errors, split Text/CData/GeneralRef handling, nil reads, nesting and metadata mutation semantics. Borrow scalar metadata from the schema owned by a frame instead of cloning rich scalar definitions per element. +- Include the 17-pattern cycle when changing eviction: a 16-entry FIFO has + systematic misses, while salted victim selection preserves reuse at the same + capacity. Confirm hot cases too; pressure improvements alone do not establish + universal throughput gains. - Publish positive and negative experiments with exact source revisions, raw evidence and remaining regressions. Run the full quality gate before pushing the experiment branch; a branch request does not authorize a merge to main. diff --git a/benchmarks/rust-runtime-investigation/README.md b/benchmarks/rust-runtime-investigation/README.md index c4cf4dc..8c2e4f4 100644 --- a/benchmarks/rust-runtime-investigation/README.md +++ b/benchmarks/rust-runtime-investigation/README.md @@ -102,7 +102,8 @@ remains slower than the historical baseline. `cache_boundaries.rs` is a second alternate harness for the cache's working-set boundary: 1, 16, 17 and 64 distinct patterns, eight occurrences per pattern. -Reads cycle pattern keys to force FIFO misses above capacity. Writes visit each +Reads cycle pattern keys to expose FIFO misses above capacity and compare +replacement policies. Writes visit each field's eight occurrences consecutively, so they can still reuse each compiled regex locally even when the full schema exceeds capacity. Run it with the same `--harness` option and retain both cases; field order affects reuse. diff --git a/benchmarks/rust-runtime-investigation/cache_boundaries.rs b/benchmarks/rust-runtime-investigation/cache_boundaries.rs index 4e410c6..96494dd 100644 --- a/benchmarks/rust-runtime-investigation/cache_boundaries.rs +++ b/benchmarks/rust-runtime-investigation/cache_boundaries.rs @@ -5,7 +5,7 @@ use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType use polyxml::{deserialize, serialize}; use std::{hint::black_box, sync::Arc}; -// Cycle through more than the admitted cache capacity to measure FIFO misses. +// Cycle through more than the admitted cache capacity to compare eviction policies. // Schema construction and correctness checks remain outside measurement. fn fixture(patterns: usize) -> (Arc, Vec) { let mut builder = ModelSchema::builder("Root"); From 1819c91b0808b9242c642d82350d2b657b60108c Mon Sep 17 00:00:00 2001 From: Bailey Nguyen Date: Sat, 3 Oct 2026 16:14:02 -0500 Subject: [PATCH 17/17] docs: publish runtime optimization comparisons and retained experiment evidence --- .../runtime-optimization/README.txt | 60 + .../runtime-optimization/archives.json | 32 + .../diagnostics/control/control-Cargo.toml | 9 + .../control/control-allocations.txt | 12 + .../diagnostics/control/control-build.txt | 3 + .../diagnostics/control/control-fixtures.rs | 85 + .../diagnostics/control/control-harness.rs | 94 + .../diagnostics/control/control-metadata.json | 5 + .../diagnostics/control/control.lock | 317 ++ .../control/read-1000-annotated.txt | 213 + .../control/read-1000-valgrind.txt | 12 + .../diagnostics/control/read-1000.callgrind | 3752 +++++++++++++++++ .../control/write-1000-annotated.txt | 101 + .../control/write-1000-valgrind.txt | 12 + .../diagnostics/control/write-1000.callgrind | 2016 +++++++++ .../diagnostics/fifo/candidate-Cargo.toml | 9 + .../fifo/candidate-allocations.txt | 12 + .../diagnostics/fifo/candidate-build.txt | 37 + .../diagnostics/fifo/candidate-fixtures.rs | 85 + .../diagnostics/fifo/candidate-harness.rs | 94 + .../diagnostics/fifo/candidate-metadata.json | 8 + .../diagnostics/fifo/candidate.lock | 317 ++ .../diagnostics/fifo/read-1000-annotated.txt | 209 + .../diagnostics/fifo/read-1000-valgrind.txt | 12 + .../diagnostics/fifo/read-1000.callgrind | 3680 ++++++++++++++++ .../diagnostics/fifo/write-1000-annotated.txt | 92 + .../diagnostics/fifo/write-1000-valgrind.txt | 12 + .../diagnostics/fifo/write-1000.callgrind | 1874 ++++++++ .../diagnostics/old/old-Cargo.toml | 9 + .../diagnostics/old/old-allocations.txt | 12 + .../diagnostics/old/old-build.txt | 35 + .../diagnostics/old/old-fixtures.rs | 85 + .../diagnostics/old/old-harness.rs | 94 + .../diagnostics/old/old-metadata.json | 5 + .../diagnostics/old/old.lock | 278 ++ .../diagnostics/old/read-1000-annotated.txt | 191 + .../diagnostics/old/read-1000-valgrind.txt | 12 + .../diagnostics/old/read-1000.callgrind | 3453 +++++++++++++++ .../diagnostics/old/write-1000-annotated.txt | 98 + .../diagnostics/old/write-1000-valgrind.txt | 12 + .../diagnostics/old/write-1000.callgrind | 1891 +++++++++ .../selected/read-1000-annotated.txt | 209 + .../selected/read-1000-valgrind.txt | 12 + .../diagnostics/selected/read-1000.callgrind | 3680 ++++++++++++++++ .../diagnostics/selected/selected-Cargo.toml | 9 + .../selected/selected-allocations.txt | 12 + .../diagnostics/selected/selected-build.txt | 37 + .../diagnostics/selected/selected-fixtures.rs | 85 + .../diagnostics/selected/selected-harness.rs | 94 + .../selected/selected-metadata.json | 8 + .../diagnostics/selected/selected.lock | 317 ++ .../selected/write-1000-annotated.txt | 92 + .../selected/write-1000-valgrind.txt | 12 + .../diagnostics/selected/write-1000.callgrind | 1873 ++++++++ .../prototype-confirmation.tar.gz | Bin 0 -> 367345 bytes .../runtime-optimization/screening.tar.gz | Bin 0 -> 382056 bytes .../selected-cache-boundaries/baseline-0.txt | 83 + .../selected-cache-boundaries/baseline-1.txt | 83 + .../selected-cache-boundaries/baseline-2.txt | 83 + .../baseline-build.txt | 3 + .../selected-cache-boundaries/baseline.lock | 633 +++ .../selected-cache-boundaries/current-0.txt | 83 + .../selected-cache-boundaries/current-1.txt | 83 + .../selected-cache-boundaries/current-2.txt | 83 + .../current-build.txt | 3 + .../selected-cache-boundaries/current.lock | 633 +++ .../selected-cache-boundaries/harness.rs | 70 + .../selected-cache-boundaries/metadata.json | 19 + .../selected-cache-boundaries/samples.tar.gz | Bin 0 -> 56431 bytes .../selected-cache-boundaries/summary.json | 570 +++ .../selected-constraints/baseline-0.txt | 103 + .../selected-constraints/baseline-1.txt | 103 + .../selected-constraints/baseline-2.txt | 103 + .../selected-constraints/baseline-build.txt | 3 + .../selected-constraints/baseline.lock | 633 +++ .../selected-constraints/current-0.txt | 103 + .../selected-constraints/current-1.txt | 103 + .../selected-constraints/current-2.txt | 103 + .../selected-constraints/current-build.txt | 3 + .../selected-constraints/current.lock | 633 +++ .../selected-constraints/harness.rs | 98 + .../selected-constraints/metadata.json | 19 + .../selected-constraints/samples.tar.gz | Bin 0 -> 72214 bytes .../selected-constraints/summary.json | 712 ++++ .../selected-core/baseline-0.txt | 63 + .../selected-core/baseline-1.txt | 63 + .../selected-core/baseline-2.txt | 64 + .../selected-core/baseline-build.txt | 3 + .../selected-core/baseline.lock | 633 +++ .../selected-core/current-0.txt | 64 + .../selected-core/current-1.txt | 65 + .../selected-core/current-2.txt | 65 + .../selected-core/current-build.txt | 4 + .../selected-core/current.lock | 633 +++ .../selected-core/harness.rs | 172 + .../selected-core/metadata.json | 19 + .../selected-core/samples.tar.gz | Bin 0 -> 55440 bytes .../selected-core/summary.json | 428 ++ .../baseline-borrowed-0.csv | 57 + .../baseline-borrowed-1.csv | 57 + .../baseline-borrowed-2.csv | 57 + .../baseline-borrowed-3.csv | 57 + .../baseline-borrowed-batch.rs | 307 ++ .../selected-generated/baseline-borrowed.lock | 320 ++ .../selected-generated/baseline-build.txt | 16 + .../selected-generated/baseline-owned-0.csv | 57 + .../selected-generated/baseline-owned-1.csv | 57 + .../selected-generated/baseline-owned-2.csv | 57 + .../selected-generated/baseline-owned-3.csv | 57 + .../baseline-owned-batch.rs | 297 ++ .../selected-generated/baseline-owned.lock | 320 ++ .../selected-generated/current-borrowed-0.csv | 57 + .../selected-generated/current-borrowed-1.csv | 57 + .../selected-generated/current-borrowed-2.csv | 57 + .../selected-generated/current-borrowed-3.csv | 57 + .../current-borrowed-batch.rs | 307 ++ .../selected-generated/current-borrowed.lock | 320 ++ .../selected-generated/current-build.txt | 20 + .../selected-generated/current-owned-0.csv | 57 + .../selected-generated/current-owned-1.csv | 57 + .../selected-generated/current-owned-2.csv | 57 + .../selected-generated/current-owned-3.csv | 57 + .../selected-generated/current-owned-batch.rs | 297 ++ .../selected-generated/current-owned.lock | 320 ++ .../selected-generated/harness.rs | 83 + .../selected-generated/metadata.json | 12 + .../selected-generated/summary.json | 434 ++ .../selected-old-core/baseline-0.txt | 63 + .../selected-old-core/baseline-1.txt | 62 + .../selected-old-core/baseline-2.txt | 63 + .../selected-old-core/baseline-build.txt | 5 + .../selected-old-core/baseline.lock | 632 +++ .../selected-old-core/current-0.txt | 64 + .../selected-old-core/current-1.txt | 65 + .../selected-old-core/current-2.txt | 65 + .../selected-old-core/current-build.txt | 5 + .../selected-old-core/current.lock | 633 +++ .../selected-old-core/harness.rs | 172 + .../selected-old-core/metadata.json | 19 + .../selected-old-core/samples.tar.gz | Bin 0 -> 55389 bytes .../selected-old-core/summary.json | 428 ++ .../verification/cache-policy-clippy.txt | 12 + .../cache-policy-focused-tests.txt | 37 + .../verification/companion-sync.txt | 8 + .../verification/corpus-reference.txt | 57 + .../verification/corpus.txt | 53 + .../verification/docs-build.txt | 3 + .../verification/failed-corpus-preflight.txt | 8 + .../verification/known-limits-control.txt | 4 + .../verification/known-limits-selected.txt | 4 + .../verification/known-limits.rs | 25 + .../verification/quality-gate.txt | 756 ++++ .../verification/tooling-checks.txt | 3 + .../verification/verification.json | 26 + docs/benchmarks/index.md | 3 + .../rust-runtime-optimization-2026-10.md | 263 ++ .../rust-xml-serde-regression-2026-10.md | 4 + 157 files changed, 40710 insertions(+) create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/README.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/archives.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-Cargo.toml create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-allocations.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-fixtures.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-annotated.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-valgrind.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000.callgrind create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-annotated.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-valgrind.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000.callgrind create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-Cargo.toml create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-allocations.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-fixtures.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000-annotated.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000-valgrind.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000.callgrind create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000-annotated.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000-valgrind.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000.callgrind create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-Cargo.toml create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-allocations.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-fixtures.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-annotated.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-valgrind.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000.callgrind create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-annotated.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-valgrind.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000.callgrind create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-annotated.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-valgrind.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000.callgrind create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-Cargo.toml create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-allocations.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-fixtures.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-annotated.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-valgrind.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000.callgrind create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/prototype-confirmation.tar.gz create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/screening.tar.gz create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-0.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-1.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-2.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-0.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-1.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-2.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/samples.tar.gz create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/summary.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/baseline-0.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/baseline-1.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/baseline-2.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/baseline-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/baseline.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/current-0.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/current-1.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/current-2.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/current-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/current.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/samples.tar.gz create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/summary.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-0.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-1.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-2.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-0.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-1.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-2.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/samples.tar.gz create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/summary.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed-0.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed-1.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed-2.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed-3.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed-batch.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-0.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-1.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-2.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-3.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-batch.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-0.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-1.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-2.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-3.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-batch.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-0.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-1.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-2.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-3.csv create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-batch.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/summary.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-0.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-1.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-2.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-0.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-1.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-2.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current.lock create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/harness.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/metadata.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/samples.tar.gz create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/summary.json create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/cache-policy-clippy.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/cache-policy-focused-tests.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/companion-sync.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/corpus-reference.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/corpus.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/docs-build.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/failed-corpus-preflight.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits-control.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits-selected.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits.rs create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/quality-gate.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/tooling-checks.txt create mode 100644 docs/benchmarks/data/2026-10-03/runtime-optimization/verification/verification.json create mode 100644 docs/benchmarks/rust-runtime-optimization-2026-10.md diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/README.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/README.txt new file mode 100644 index 0000000..19ac5f0 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/README.txt @@ -0,0 +1,60 @@ +Dynamic Rust XML runtime investigation, October 3, 2026 + +Retained engine: 7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d +Control (0.34.6): bbbd087a9a8e9838a32912973cd4029c30f29c08 +Historical (0.27.0): cef575c11cc4f05e877ced157036f7ff53b8687b + +selected-core, selected-constraints, selected-cache-boundaries and +selected-old-core retain harnesses, locks, metadata, build/run logs, summaries +and samples.tar.gz. Each archive contains every original Criterion result file +for the six measured processes, including estimates and sample arrays. To +reconstruct a summary, extract samples.tar.gz in its comparison directory, then: + +python3 benchmarks/rust-runtime-investigation/summarize.py COMPARISON_DIRECTORY + +selected-generated retains every CSV, emitted model, lock, the common harness, +build logs and metadata for four rounds per revision/mode. For owned consumers, +the runner changes BatchType<'_> to BatchType in the common harness. Summarize: + +python3 benchmarks/rust-runtime-investigation/summarize.py --generated selected-generated + +screening.tar.gz retains exp1 through exp7 plus FIFO working-set and replacement +policy screens. These short runs select hypotheses; confirmation numbers are +in the selected-* directories. Exp1 retains writer results only; its unanchored +serialization filter also selected reads, but those read artifacts were not +retained and no read conclusion is drawn from that attempt. + +prototype-confirmation.tar.gz retains the earlier FIFO implementation's +comparisons and generated controls. Its final-core folder is excluded from +confirmation tables because a companion uv help invocation rebuilt an editable +binding during its last round. investigation-note.json records the exclusion; +final-core-clean repeats all three rounds, and selected-core subsequently tests +the retained replacement policy. Both generated controls are retained because +an initial apparent JSON batch-write slowdown did not repeat. + +archives.json records SHA-256 hashes, file counts and compressed sizes. Published +Criterion summaries were independently reconstructed from these archives and +checked for equality. This data does not contain benchmark binaries or downloaded +Valgrind packages. + +diagnostics/old, control, fifo and selected retain counting-allocator sources, +locks, counts, measured-region Callgrind files and annotations. Allocation +instrumentation is diagnostic only. Requested bytes are cumulative requests, +not peak RSS. Callgrind counts simulated instructions, not hardware cycles. +Counting is disabled in instruction-profile mode, so its printed allocation +zeros do not indicate allocation-free operations. + +verification retains the quality gate, refreshed companion CType output, +reference corpus output, tooling/docs checks and a minimal reproducer for two +unchanged correctness limitations. The corpus reference log has no source SHA; +its summary and group table match the refreshed run exactly. The failed corpus +preflight found no default release CLI; the actual sample explicitly placed the +fresh debug CLI on PATH. The companion lockfile was restored after refreshing +its editable extension, then the sample ran with uv --no-sync. + +All measured comparisons alternate revision order and run serially with systemd +memory caps and swap disabled. Core/constraint/cache confirmation: 3 processes, +100 samples, 3-second warmup, 5-second measurement targets. Generated controls: +4 process rounds per revision/mode, 100 warmup calls, 7 samples of at least 250ms. +Schema setup and correctness checks precede timing. Source, payload sizes, +toolchain and host details are in the accompanying report and metadata. diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/archives.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/archives.json new file mode 100644 index 0000000..659f465 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/archives.json @@ -0,0 +1,32 @@ +{ + "prototype-confirmation.tar.gz": { + "sha256": "4bb5860fe8fdb7cf8f73d39462cd6c912986995aa62eac75fd124902ef4df6ef", + "files": 1447, + "bytes": 367345 + }, + "screening.tar.gz": { + "sha256": "3a096fd3b001ca36fd137c12b5a702fe74d3785bc4b07329a3ee7c5f75839743", + "files": 1931, + "bytes": 382056 + }, + "selected-cache-boundaries/samples.tar.gz": { + "sha256": "ec9209b8895f3eb29a91fd9f52c1e009b7a50b27c9cd5a7d09f6925753e14f6c", + "files": 384, + "bytes": 56431 + }, + "selected-constraints/samples.tar.gz": { + "sha256": "84e4439facba3f926d20aab1843704c20496822962f4ebd9ad84100387579f9f", + "files": 480, + "bytes": 72214 + }, + "selected-core/samples.tar.gz": { + "sha256": "c6b469263f1e7e98ebb45b86558ceba9fea3f19b855a033b52a2d8ac455e140b", + "files": 288, + "bytes": 55440 + }, + "selected-old-core/samples.tar.gz": { + "sha256": "b031a7e6c35aba2a6809723d82e19ec1373afb4d769c9eb3b60b3c33818b2a02", + "files": 288, + "bytes": 55389 + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-Cargo.toml b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-Cargo.toml new file mode 100644 index 0000000..3928071 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-Cargo.toml @@ -0,0 +1,9 @@ +[package] +name="xml-diagnostics" +version="0.0.0" +edition="2021" +[workspace] +[dependencies] +polyxml={path="/home/bailey/github/polyxml-perf-control/crates/polyxml-core"} +[profile.release] +debug=1 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-allocations.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-allocations.txt new file mode 100644 index 0000000..25457ae --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-allocations.txt @@ -0,0 +1,12 @@ +memcap: <=7842 MiB (60% of 13070 MiB available) [systemd MemoryMax, swap off] +operation=read,count=0,iterations=1,allocations=12,reallocations=5,requested_bytes=11093,input_bytes=94,output_bytes=94,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7841 MiB (60% of 13069 MiB available) [systemd MemoryMax, swap off] +operation=write,count=0,iterations=1,allocations=2,reallocations=2,requested_bytes=554,input_bytes=94,output_bytes=94,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7841 MiB (60% of 13069 MiB available) [systemd MemoryMax, swap off] +operation=read,count=1000,iterations=1,allocations=5010,reallocations=1014,requested_bytes=717402,input_bytes=63911,output_bytes=63411,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7841 MiB (60% of 13068 MiB available) [systemd MemoryMax, swap off] +operation=write,count=1000,iterations=1,allocations=1001,reallocations=2007,requested_bytes=158560,input_bytes=63911,output_bytes=63411,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7841 MiB (60% of 13068 MiB available) [systemd MemoryMax, swap off] +operation=read,count=10000,iterations=1,allocations=50010,reallocations=10019,requested_bytes=7774738,input_bytes=668911,output_bytes=663911,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7845 MiB (60% of 13075 MiB available) [systemd MemoryMax, swap off] +operation=write,count=10000,iterations=1,allocations=10001,reallocations=20011,requested_bytes=2376640,input_bytes=668911,output_bytes=663911,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-build.txt new file mode 100644 index 0000000..5ffb0b0 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-build.txt @@ -0,0 +1,3 @@ +memcap: <=7852 MiB (60% of 13088 MiB available) [systemd MemoryMax, swap off] + Compiling xml-diagnostics v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control) + Finished `release` profile [optimized + debuginfo] target(s) in 0.63s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-fixtures.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-fixtures.rs new file mode 100644 index 0000000..f231439 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-fixtures.rs @@ -0,0 +1,85 @@ +use std::hint::black_box; + +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize}; +use std::sync::Arc; + +fn build_sensor_fixture() -> (Arc, Vec) { + let schema = ModelSchema::builder("Sensor") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "temp", + b"temp", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .field(FieldSchema::new( + "status", + b"status", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "active", + b"active", + FieldKind::Element, + ValueType::Scalar(ScalarType::Bool), + )) + .build(); + + let xml = br#"23.75OPERATIONALtrue"#.to_vec(); + (schema, xml) +} + +fn build_catalog_fixture(count: usize) -> (Arc, Vec) { + let item_schema = ModelSchema::builder("Item") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "name", + b"name", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "price", + b"price", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .build(); + + let catalog_schema = ModelSchema::builder("Catalog") + .field(FieldSchema::new( + "items", + b"item", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Nested(item_schema))), + )) + .build(); + + let mut xml = String::with_capacity(count * 64 + 32); + xml.push_str(""); + for i in 0..count { + use std::fmt::Write; + write!( + xml, + r#"Part-{i}{:.2}"#, + (i as f64) * 1.25 + ) + .unwrap(); + } + xml.push_str(""); + + (catalog_schema, xml.into_bytes()) +} + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-harness.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-harness.rs new file mode 100644 index 0000000..1fbe95d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-harness.rs @@ -0,0 +1,94 @@ +// Fixture definitions are extracted verbatim from core_benchmarks.rs by run.py. +include!("fixtures.rs"); + +use std::alloc::{GlobalAlloc, Layout, System}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; + +struct CountingAllocator; +static COUNTING: AtomicBool = AtomicBool::new(false); +static ALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static REALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static BYTES: AtomicUsize = AtomicUsize::new(0); + +// Diagnostic instrumentation only. The benchmark consumers use System directly. +unsafe impl GlobalAlloc for CountingAllocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc(layout) } + } + unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc_zeroed(layout) } + } + unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { + unsafe { System.dealloc(ptr, layout) } + } + unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + REALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(new_size, Ordering::Relaxed); + } + unsafe { System.realloc(ptr, layout, new_size) } + } +} +#[global_allocator] +static ALLOCATOR: CountingAllocator = CountingAllocator; + +fn main() { + let args: Vec = std::env::args().collect(); + let operation = args.get(1).expect("read or write"); + let count: usize = args + .get(2) + .expect("0 for sensor, or catalog count") + .parse() + .unwrap(); + let iterations: usize = args.get(3).expect("iteration count").parse().unwrap(); + let mode = args.get(4).map(String::as_str).unwrap_or("allocations"); + let (schema, xml) = if count == 0 { + build_sensor_fixture() + } else { + build_catalog_fixture(count) + }; + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let root = if count == 0 { "Sensor" } else { "Catalog" }; + let output = serialize(root, &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + for _ in 0..10 { + if operation == "read" { + black_box(deserialize(&xml, Arc::clone(&schema)).unwrap()); + } else { + black_box(serialize(root, &value, &schema, None).unwrap()); + } + } + COUNTING.store(mode == "allocations", Ordering::Relaxed); + measured_region(operation, iterations, &xml, &value, root, &schema); + COUNTING.store(false, Ordering::Relaxed); + println!("operation={operation},count={count},iterations={iterations},allocations={},reallocations={},requested_bytes={},input_bytes={},output_bytes={},field_schema_bytes={},scalar_type_bytes={},value_type_bytes={},poly_value_bytes={}", + ALLOCATIONS.load(Ordering::Relaxed), REALLOCATIONS.load(Ordering::Relaxed), BYTES.load(Ordering::Relaxed), xml.len(), output.len(), + std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::()); +} + +#[inline(never)] +#[no_mangle] +fn measured_region( + operation: &str, + iterations: usize, + xml: &[u8], + value: &polyxml::PolyValue, + root: &str, + schema: &Arc, +) { + for _ in 0..iterations { + if operation == "read" { + black_box(deserialize(black_box(xml), Arc::clone(schema)).unwrap()); + } else { + black_box(serialize(root, black_box(value), schema, None).unwrap()); + } + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-metadata.json new file mode 100644 index 0000000..1f70475 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control-metadata.json @@ -0,0 +1,5 @@ +{ + "revision": "bbbd087a9a8e9838a32912973cd4029c30f29c08", + "executable": "/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics", + "profile": "release debug=1; allocation instrumentation; not used for latency numbers" +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control.lock new file mode 100644 index 0000000..1614ee2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/control.lock @@ -0,0 +1,317 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "xml-diagnostics" +version = "0.0.0" +dependencies = [ + "polyxml", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-annotated.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-annotated.txt new file mode 100644 index 0000000..589c8a7 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-annotated.txt @@ -0,0 +1,213 @@ +-------------------------------------------------------------------------------- +Profile data file 'benchmarks/rust-runtime-investigation/target/evidence/control/read-1000.callgrind' (creator: callgrind-3.26.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 89369042 +Trigger: Program termination +Profiled target: benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics read 1000 25 instructions (PID 331945, part 1) +Events recorded: Ir +Events shown: Ir +Event sort order: Ir +Thresholds: 95 +Include dirs: +User annotated: +Auto-annotation: off + +-------------------------------------------------------------------------------- +Ir +-------------------------------------------------------------------------------- +294,910,404 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir file:function +-------------------------------------------------------------------------------- +21,680,675 ( 7.35%) ???:0x0000000000197a00 [/usr/lib/x86_64-linux-gnu/libc.so.6] +13,926,225 ( 4.72%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs:core::str::converts::from_utf8 +11,858,578 ( 4.02%) ???:0x00000000000b2400 [/usr/lib/x86_64-linux-gnu/libc.so.6] +10,868,100 ( 3.69%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::next [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +10,352,875 ( 3.51%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 9,327,200 ( 3.16%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:::parse_sub_tree::<&[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 8,900,000 ( 3.02%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs: as core::hash::Hasher>::write [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 7,805,073 ( 2.65%) ???:0x00000000000b20e0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 6,602,200 ( 2.24%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 6,401,100 ( 2.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::next [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 5,426,700 ( 1.84%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/parser/element.rs:::feed [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 5,127,950 ( 1.74%) ???:free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 4,625,000 ( 1.57%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs:::hash_one::<&[u8]> + 4,403,350 ( 1.49%) ???:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 4,058,539 ( 1.38%) ???:0x00000000001972a0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 3,275,600 ( 1.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 3,176,175 ( 1.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::parse_sub_tree::<&[u8]> + 3,150,700 ( 1.07%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs:core::str::converts::from_utf8 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 3,001,875 ( 1.02%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 3,000,000 ( 1.02%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::hash_one::<&[u8]> + 2,875,000 ( 0.97%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/converters.rs:::parse_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 2,825,700 ( 0.96%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::parse_sub_tree::<&[u8]> + 2,625,750 ( 0.89%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 2,550,000 ( 0.86%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:polyxml::parser::is_nil_element [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 2,475,825 ( 0.84%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:polyxml::parser::namespace_scope [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 2,414,886 ( 0.82%) ???:0x00000000000b0f70 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,375,000 ( 0.81%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::hash_one::<&[u8]> + 2,325,000 ( 0.79%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::check_for_duplicates [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 2,175,000 ( 0.74%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::next + 2,076,050 ( 0.70%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::emit_start + 2,025,675 ( 0.69%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_end [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 2,025,675 ( 0.69%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_start [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 2,001,075 ( 0.68%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:::parse_attributes [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 1,950,800 ( 0.66%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 1,948,250 ( 0.66%) ???:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,925,000 ( 0.65%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::parse_sub_tree::<&[u8]> + 1,900,350 ( 0.64%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::next + 1,800,000 ( 0.61%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::parse_sub_tree::<&[u8]> + 1,558,400 ( 0.53%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/parse.rs:::parse_scalar + 1,500,150 ( 0.51%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 1,500,000 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/mod.rs:::hash_one::<&[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 1,489,425 ( 0.51%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 1,465,250 ( 0.50%) ???:0x00000000000b4180 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,450,000 ( 0.49%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/schema.rs:::clone [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 1,366,800 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::next + 1,357,775 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::finish_grow [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 1,350,275 ( 0.46%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 1,350,000 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>>::grow_one [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 1,275,425 ( 0.43%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs:::emit_end + 1,226,475 ( 0.42%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::finish + 1,225,425 ( 0.42%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:; 8]>>::from_elem + 1,200,400 ( 0.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 1,200,000 ( 0.41%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:polyxml::parser::record_content_token [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 1,199,850 ( 0.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 1,151,775 ( 0.39%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:::finish [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 1,150,300 ( 0.39%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:::feed + 1,075,300 ( 0.36%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 1,075,000 ( 0.36%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::parse_sub_tree::<&[u8]> + 1,050,400 ( 0.36%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 1,050,300 ( 0.36%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:::feed + 1,050,300 ( 0.36%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::emit_end + 1,000,150 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::parse_sub_tree::<&[u8]> + 1,000,000 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 975,000 ( 0.33%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 950,100 ( 0.32%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::parse_scalar + 950,100 ( 0.32%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::next + 900,525 ( 0.31%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 900,300 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 900,275 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::emit_end + 900,100 ( 0.31%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 850,750 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::parse_sub_tree::<&[u8]> + 850,150 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 850,000 ( 0.29%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs:::local_name [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 850,000 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::local_name + 825,025 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::parse_sub_tree::<&[u8]> + 800,575 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::emit_start + 800,250 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 800,100 ( 0.27%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:::parse_sub_tree::<&[u8]> + 800,000 ( 0.27%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:::new [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 775,475 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::finish + 750,250 ( 0.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 750,250 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::emit_start + 750,000 ( 0.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::next + 750,000 ( 0.25%) /rust/deps/hashbrown-0.17.1/src/raw.rs:::parse_sub_tree::<&[u8]> + 750,000 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs: as core::hash::Hasher>::write + 750,000 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/hash/random.rs:::hash_one::<&[u8]> + 700,700 ( 0.24%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:; 8]>>::from_elem [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 700,250 ( 0.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 700,225 ( 0.24%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:::push_list_item [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 675,675 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter_nested.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 675,225 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/mem/mod.rs:::parse_sub_tree::<&[u8]> + 675,225 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::emit_start + 675,150 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:core::str::converts::from_utf8 + 675,000 ( 0.23%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::unescape [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 675,000 ( 0.23%) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs:::parse_sub_tree::<&[u8]> + 675,000 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::find:: + 650,125 ( 0.22%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:polyxml::parser::namespace_scope + 608,450 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::parse_scalar + 603,525 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::finish_grow + 600,600 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 600,200 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 600,150 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:core::ptr::drop_glue::> + 600,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 600,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:polyxml::parser::is_nil_element + 575,050 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs:::parse_sub_tree::<&[u8]> + 575,000 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/macros/mod.rs:::parse_scalar + 550,550 ( 0.19%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:polyxml::parser::resolve_record_schema [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 550,550 ( 0.19%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/schema.rs:polyxml::schema::validate_content [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 550,350 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::finish + 550,000 ( 0.19%) /rust/deps/hashbrown-0.17.1/src/raw.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 525,175 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::emit_end + 525,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::check_for_duplicates + 525,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::check_for_duplicates + 501,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs:__rustc::__rust_alloc + 501,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs:__rustc::__rust_alloc + 500,000 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/number.rs:::try_fast_path:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 500,000 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_text [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 500,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs: as core::hash::Hasher>::write + 500,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::parse_attributes + 491,750 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-integer-1.0.6/src/algorithm.rs:::parse_scalar + 475,475 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:>; 4]> as core::ops::drop::Drop>::drop [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 475,475 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:; 8]> as core::ops::drop::Drop>::drop [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 466,875 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 452,375 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::finish_grow + 450,150 ( 0.15%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::emit_end + 450,150 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 450,150 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::emit_start + 450,100 ( 0.15%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs:::parse_scalar + 450,050 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 450,000 ( 0.15%) /rust/deps/hashbrown-0.17.1/src/map.rs:::parse_sub_tree::<&[u8]> + 450,000 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::find:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 425,850 ( 0.14%) ???:0x00000000000b2300 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 425,050 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::parse_sub_tree::<&[u8]> + 422,350 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 400,400 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 400,300 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 400,125 ( 0.14%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 400,100 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::feed + 400,000 ( 0.14%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs:polyxml::parser::parse_field_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 377,250 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::finish_grow + 375,425 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::emit_start + 375,125 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:::parse_attributes + 375,125 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::emit_start + 375,000 ( 0.13%) /rust/deps/hashbrown-0.17.1/src/map.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 375,000 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs:::next + 375,000 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::parse_scalar + 350,100 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:::feed + 350,075 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:::parse_sub_tree::<&[u8]> + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>::push_mut [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs: as core::hash::Hasher>::write + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 325,050 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:::parse_sub_tree::<&[u8]> + 300,300 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>>::into_boxed_slice [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 300,200 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::finish + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/clone.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,075 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs:polyxml::parser::namespace_scope + 300,050 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,050 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs:::emit_end + 300,025 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::parse_sub_tree::<&[u8]> + 300,000 ( 0.10%) /rust/deps/hashbrown-0.17.1/src/lib.rs:::parse_sub_tree::<&[u8]> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs:polyxml::parser::is_nil_element + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:::check_for_duplicates + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::parse_sub_tree::<&[u8]> + 291,750 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/traits/iterator.rs:::next + 275,050 ( 0.09%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/noskip.rs:::parse_scalar + 275,050 ( 0.09%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::parse_attributes + 275,000 ( 0.09%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/iterator.rs:::parse_scalar + 250,500 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:__rustc::__rust_alloc + 250,500 ( 0.08%) benchmarks/rust-runtime-investigation/target/control/src/main.rs:__rustc::__rust_alloc [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 250,475 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::finish + 250,000 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs:::parse_sub_tree::<&[u8]> + 250,000 ( 0.08%) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs:::parse_attributes + 250,000 ( 0.08%) /rust/deps/hashbrown-0.17.1/src/raw.rs:::parse_attributes + 250,000 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::parse_scalar + 226,525 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::finish_grow + 225,225 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs:polyxml::parser::resolve_record_schema + 225,100 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::push_list_item + 225,075 ( 0.08%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/schema.rs:::finish + 225,050 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::emit_end + 225,050 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs:::emit_end + 225,000 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::parse_sub_tree::<&[u8]> + 225,000 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/sse2.rs:::parse_sub_tree::<&[u8]> + 225,000 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs:>>::grow_one + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-valgrind.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-valgrind.txt new file mode 100644 index 0000000..0f88426 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-valgrind.txt @@ -0,0 +1,12 @@ +==331945== Callgrind, a call-graph generating cache profiler +==331945== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al. +==331945== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info +==331945== Command: benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics read 1000 25 instructions +==331945== Parent PID: 331936 +==331945== +==331945== For interactive control, run 'callgrind_control -h'. +==331945== +==331945== Events : Ir +==331945== Collected : 294910404 +==331945== +==331945== I refs: 294,910,404 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000.callgrind b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000.callgrind new file mode 100644 index 0000000..febdd31 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/read-1000.callgrind @@ -0,0 +1,3752 @@ +# callgrind format +version: 1 +creator: callgrind-3.26.0 +pid: 331945 +cmd: benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics read 1000 25 instructions +part: 1 + + +desc: I1 cache: +desc: D1 cache: +desc: LL cache: + +desc: Timerange: Basic block 0 - 89369042 +desc: Trigger: Program termination + +positions: line +events: Ir +summary: 294910404 + + +ob=(2) /usr/lib/x86_64-linux-gnu/libc.so.6 +fl=(2) ??? +fn=(4502) 0x00000000000b2300 +0 300600 +cfn=(4508) 0x00000000000b20e0 +calls=37105 0 +0 3083347 +0 125250 + +fn=(4128) (below main) +cfn=(4162) 0x000000000002a580 +calls=1 0 +0 294910404 + +fn=(4508) +0 4946685 +cfn=(4952) 0x00000000000b0f70 +calls=73313 0 +0 1086761 +0 2459238 +cfn=(4952) +calls=35010 0 +0 548102 +0 399150 + +fn=(4330) 0x00000000000b08d0 +0 120120 + +fn=(4488) 0x0000000000197a00 +0 21680675 + +fn=(4952) +0 2414886 + +fn=(4232) 0x00000000000b2400 +0 10553314 +cfn=(4952) +calls=35955 0 +0 780023 +0 1272808 +cfn=(4330) +calls=32761 0 +0 117485 +0 8432 +cfn=(4330) +calls=799 0 +0 2635 +0 24024 + +fn=(4878) free +0 597300 +cfn=(4508) +calls=73670 0 +0 6356589 +0 4530650 + +fn=(4226) malloc +0 796400 +cfn=(4232) +calls=73729 0 +0 12746428 +0 3606950 + +fn=(4460) 0x00000000000b4180 +0 1109825 +cfn=(4232) +calls=64 0 +0 12293 +0 325500 +cfn=(4502) +calls=37042 0 +0 3506272 +0 25225 +cob=(3) ??? +cfi=(3) ??? +cfn=(4486) 0x0000000004b296a0 +calls=63 0 +0 325 +0 150 +cfn=(4502) +calls=63 0 +0 2925 +0 4550 + +fn=(5744) 0x00000000001972a0 +0 4058539 + +fn=(4162) +cob=(6) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics +cfi=(6) ??? +cfn=(4176) main +calls=1 0 +0 294910404 + +fn=(4458) realloc +0 1670225 +cfn=(4460) +calls=38415 0 +0 4987065 +0 278025 + +ob=(3) +fl=(3) +fn=(4486) +0 50 +cob=(2) +cfi=(2) +cfn=(4488) +calls=110 0 +0 275 + +ob=(6) +fl=(52) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/mod.rs +fn=(5734) ::hash_one::<&[u8]> +694 750000 ++5 125000 +fi=(53) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs +203 250000 +fi=(48) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/hash/random.rs +84 125000 +fi=(53) +204 250000 +fi=(48) +84 625000 +fi=(10) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs +4058 375000 +fi=(53) +233 375000 +cfn=(5292) as core::hash::Hasher>::write +calls=185000 +23 +* 6875000 +* 500000 +cfn=(5292) +calls=185000 +23 +* 3650000 ++81 375000 +-2 250000 ++4 250000 +fi=(10) +2652 250000 +fi=(47) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs +2215 125000 +fi=(10) +2652 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(47) +2215 250000 +fi=(53) +78 125000 +318 125000 ++2 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 250000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 250000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 500000 +fi=(53) +323 375000 +fe=(52) +702 625000 + +fl=(8) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/rt.rs +fn=(4178) std::rt::lang_start_internal +fi=(143) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/function.rs +cfn=(5136) std::rt::lang_start::<()>::{closure#0} +calls=1 206 +287 294910404 +fe=(8) + +fn=(5136) +cfi=(30) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/backtrace.rs +cfn=(5138) std::sys::backtrace::__rust_begin_short_backtrace:: +calls=1 162 +206 294910404 + +fl=(85) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs +fn=(5504) <&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: +211 1800600 +fi=(33) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs +3101 150050 +1032 300100 ++1 100 +cfi=(32) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs +cfn=(5508) >::grow_one +calls=74 186 +* 4800 +fi=(32) +611 150050 +fi=(18) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs +1963 150050 +fi=(33) +1038 450150 +fi=(76) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs +137 150050 +fe=(85) ++86 150050 +0 450150 +232 450150 +cfi=(87) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/parser/element.rs +cfn=(5516) ::feed +calls=222074 57 +* 14181000 +* 300100 +0 150050 +233 450150 +fi=(10) +1092 150050 +fi=(32) +616 150050 +fi=(33) +1461 150050 +fi=(10) +2689 150050 +fi=(32) +764 150050 +-94 150050 +fi=(33) +2981 300000 +0 150050 +fi=(20) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs +970 150050 +fi=(18) +573 750250 +cob=(2) +cfi=(2) +cfn=(4488) +calls=222074 0 +* 2200650 +* 300100 +fi=(33) +2986 450150 +fi=(44) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs +90 150050 +fi=(144) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs +389 450150 +fe=(85) +239 600200 +fi=(44) +544 450150 +90 300100 +fe=(85) +240 300100 +cfi=(38) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs +cfn=(5182) core::str::converts::from_utf8 +calls=222074 89 +* 12090575 +fi=(27) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs +0 300100 +2177 300100 +fe=(85) +253 1200400 +0 150050 +240 600200 +fi=(33) +0 50 +fi=(32) +672 300 +cfn=(5532) >::reserve::do_reserve_and_handle:: +calls=74 -14 +* 6600 +* 100 +fi=(33) +3101 50 +2981 50 +fe=(85) + +fl=(98) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs +fn=(6004) >; 4]>>::resize_with::<::push_list_item::{closure#0}> +1841 200 +1082 75 +-30 25 +0 25 +1846 75 +1082 50 +-17 25 +0 25 +1358 75 +0 50 +1230 50 +fi=(20) +970 25 +fi=(18) +1963 100 +fe=(98) +1237 25 +fi=(19) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs +2144 25 +fi=(34) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/range.rs +1100 50 +fi=(74) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/parser.rs +65 25 +fe=(98) +1082 50 +1217 25 +1856 200 + +fn=(5634) ; 8]>>::from_elem +2052 250250 ++1 50050 +856 25025 +fi=(18) +-9 25025 +fi=(19) +2144 25025 +fi=(34) +1100 25025 +fe=(98) +0 25025 +fi=(41) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs +2274 50050 ++2 25025 +fi=(18) +1963 400400 +fi=(19) +2144 25025 +fi=(34) +1100 25025 +fi=(41) +2276 25000 +fi=(18) +1963 400000 +fi=(19) +2144 25000 +fi=(34) +1100 25000 +fi=(41) +2276 25000 +fi=(18) +1963 400000 +fi=(19) +2144 25000 +fi=(34) +1100 25000 +fe=(98) +2615 50050 +2067 75075 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 0 +* 1926925 ++2 225225 + +fn=(5958) ; 8]> as core::ops::drop::Drop>::drop +2373 200200 +1082 50050 +2375 25025 +fi=(18) +847 50050 +fe=(98) +2382 200200 + +fn=(5984) >; 4]> as core::ops::drop::Drop>::drop +2373 200200 +1082 50050 +2375 25025 +fi=(23) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs +0 25025 +fi=(18) +847 50050 +fe=(98) +2382 200200 + +fn=(6142) >; 4]> as core::ops::drop::Drop>::drop +2483 250 ++10 50 +-8 200 + +fl=(59) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs +fn=(6150) >>::drop_slow +2138 75 ++6 25 +fi=(18) +842 25 ++5 25 +cfi=(55) /rust/deps/hashbrown-0.17.1/src/raw.rs +cfn=(6152) as core::ops::drop::Drop>::drop +calls=37 3486 +* 450 +fi=(119) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/rc.rs +3277 25 +fe=(59) +3392 25 +fi=(13) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs +4049 25 +fe=(59) +3544 25 +fi=(23) +175 175 +cfi=(26) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs +cfn=(5684) __rustc::__rust_dealloc +calls=37 65 +* 850 +fe=(59) + +fl=(18) +fn=(5614) core::ptr::drop_glue::> +847 700200 +fi=(32) +425 350100 +631 175050 +425 75000 +fi=(10) +1401 75000 +fi=(23) +175 150000 +cfi=(26) +cfn=(5684) +calls=111000 65 +* 2550000 +fe=(18) +847 1925550 + +fn=(6416) core::ptr::drop_glue:: +847 275 +fi=(14) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs +454 25 +fi=(13) +4049 25 +fi=(59) +2868 25 +fe=(18) +847 450 +cfn=(6417) core::ptr::drop_glue::'2 +calls=37 * +* 12447414 +* 200 +cob=(2) +cfi=(2) +cfn=(4878) +calls=37 0 +* 825 + +fn=(6417) +847 275 +fi=(32) +611 25 +fi=(33) +4358 25 +fe=(18) +847 125 +0 25 +847 50 +cfn=(6417) +calls=37 * +* 8314 +* 49950 +cfn=(6417) +calls=36963 * +* 12284032 +* 100000 +fi=(32) +631 50 +fe=(18) +847 175 +cob=(2) +cfi=(2) +cfn=(4878) +calls=37 0 +* 4368 +* 1700000 +fi=(32) +631 50000 +425 25000 +fi=(23) +312 25000 +fi=(14) +454 25000 +fi=(13) +4049 25000 +fi=(59) +2868 25000 +fe=(18) +847 900000 +cfn=(6417) +calls=111000 * +* 6176136 +* 525000 +cob=(2) +cfi=(2) +cfn=(4878) +calls=74000 0 +* 8992346 + +fn=(5896) core::ptr::drop_glue:: +847 1000000 + +fl=(45) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/schema.rs +fn=(5808) ::clone +13 1450000 + +fn=(5926) polyxml::schema::validate_content +725 200200 ++1 100100 +0 25025 +735 225225 + +fl=(87) +fn=(5516) +57 1500500 +fi=(54) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs +473 450150 +fi=(13) +3994 300100 +fi=(78) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs +153 900300 +cfi=(84) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs +cfn=(5522) memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 +calls=222073 1042 +* 4203450 +fi=(41) +2869 300100 +fi=(88) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs +0 150050 +fi=(54) +623 300100 +fe=(87) +59 300100 +fi=(54) +871 150050 +fe=(87) +59 625200 +fi=(13) +3994 25000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5522) +calls=37000 1042 +* 700000 +fi=(41) +2869 50000 +fi=(88) +0 25000 +fi=(54) +623 50000 +fe=(87) +59 50000 +fi=(54) +871 25000 +fe=(87) +59 375100 +-59 150050 +59 600200 +-59 150050 +59 200050 ++14 1350450 +fi=(88) +-73 25000 +fi=(54) +623 50000 +fe=(87) +59 50000 +fi=(54) +871 25000 +fe=(87) +59 75000 +fi=(13) +3994 25000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5522) +calls=37000 1042 +* 700000 +fi=(41) +2869 50000 +fe=(87) + +fl=(108) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/converters.rs +fn=(5782) ::parse_scalar +28 900000 ++5 900000 +fi=(76) +-33 25000 +cfi=(38) +cfn=(5182) +calls=37000 89 +0 1961250 +0 50000 +fi=(27) +2177 50000 +fi=(111) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/lib.rs +0 25000 +fi=(47) +478 25000 +fi=(32) +-17 25000 +0 25000 +cfi=(6) +cfn=(5100) __rustc::__rust_no_alloc_shim_is_unstable_v2 +calls=37000 0 +0 25000 +0 25000 +fi=(23) +130 75000 +cfi=(24) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/src/main.rs +cfn=(5102) __rustc::__rust_alloc +calls=37000 -89 +* 10653953 +fi=(32) +470 50000 +fi=(36) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/slice.rs +0 25000 +fi=(18) +573 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 330000 +fi=(36) +452 25000 +fi=(76) +0 25000 +199 100000 +fi=(56) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/macros/mod.rs +434 75000 +0 25000 +434 75000 +fi=(18) +0 50000 +fe=(108) +138 50000 +0 100000 +fi=(76) +199 50000 +0 100000 +fi=(56) +434 75000 +fi=(32) +0 125000 +fe=(108) +95 25000 +fi=(56) +434 150000 +fi=(76) +0 25000 +fi=(56) +434 175000 +fi=(112) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/parse.rs +175 100000 +fi=(109) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-integer-1.0.6/src/algorithm.rs ++24 175000 +fi=(44) +0 150000 +fi=(113) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/iterator.rs +252 125000 +0 50000 +fi=(44) +184 50000 +0 50000 +fi=(112) +872 50000 +fi=(10) +2689 25000 +fi=(126) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs +39 50000 +fi=(112) +872 155600 +fi=(10) +2689 77800 +fi=(126) +39 155600 +fi=(10) +2728 155600 +fi=(112) +566 77800 +fi=(10) +2652 77800 +fi=(110) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/noskip.rs +144 77800 +fi=(44) ++40 155600 +fi=(109) +677 25000 ++10 25000 +0 75000 +411 50000 +fi=(10) +2689 25000 +fi=(126) +39 50000 +fi=(109) +-39 47250 +411 94500 +fi=(10) +2689 47250 +fi=(126) +39 94500 +fi=(110) +270 72250 +fi=(145) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/int_macros.rs +2261 72250 +fi=(115) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs +132 72250 +fi=(145) +2189 72250 +fi=(44) +184 144500 +0 25000 +fe=(108) +160 75000 +-65 25000 +fi=(19) +2105 25000 +fi=(112) +616 25000 +0 50000 +fi=(44) +380 25000 +fi=(113) +252 100000 +fi=(44) +-68 50000 +0 50000 +fi=(112) +872 100000 +fi=(10) +2689 50000 +fi=(126) +39 100000 +fi=(10) +2728 100000 +fi=(112) +623 50000 +fi=(10) +2652 50000 +fi=(110) +144 50000 +fi=(44) ++40 100000 +0 50000 +90 50000 +fi=(112) +616 225000 +fe=(108) +0 25000 +fi=(112) +568 100000 +fi=(44) +184 50000 +fi=(110) +0 75000 +fi=(112) +666 50000 +0 25000 +666 25000 ++81 50000 +0 25000 +747 25000 +855 50000 +216 300000 ++51 25000 +cfi=(114) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/number.rs +cfn=(5908) ::try_fast_path:: +calls=37000 45 +* 675000 +* 50000 +fe=(108) +-97 75000 +-75 25000 +215 675000 + +fl=(30) +fn=(5138) +fi=(143) +cfi=(24) +cfn=(5140) xml_diagnostics::main +calls=1 43 +250 294910404 +fe=(30) + +fl=(90) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs +fn=(5554) ::emit_start +314 750250 +fi=(92) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs ++70 150050 +fi=(43) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs +1229 75025 +fi=(91) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs +493 75025 +0 75025 +221 150050 +fi=(76) +2736 150050 +fi=(77) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs +157 75025 +fi=(76) +2738 75025 +0 75025 +2738 75025 +fe=(90) +345 150050 +fi=(10) +1092 75025 +fi=(92) +380 150050 ++4 150050 +fi=(43) +1229 75025 +fi=(91) +424 75025 +0 225075 +fi=(93) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs +331 325175 +-4 650350 ++1 700350 +-13 350175 +0 50000 +fi=(33) +3101 25000 +1029 25000 ++3 50000 +fi=(32) +611 75025 +fi=(18) +1963 75025 +fi=(33) +1038 150050 +fi=(92) +380 150050 ++4 150050 +fi=(43) +1229 25000 +fi=(91) +424 25000 +fi=(33) +1033 100 +cfi=(32) +cfn=(5570) >::grow_one +calls=37 186 +* 2675 +* 75 +0 50025 +3101 50025 +1029 50025 ++3 100075 +fi=(91) +424 50025 +fi=(32) +616 75025 +fi=(33) +1461 75025 +fi=(10) +2689 75025 +fi=(32) +764 75025 +-94 75025 +0 75025 +fi=(20) +970 75025 +fi=(18) +573 300100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=111037 0 +* 1125375 +* 75025 +fi=(33) +2986 225075 +fe=(90) +0 450150 +356 675225 +fi=(32) +672 250 +cfn=(5532) +calls=74 -14 +* 5825 +* 50 +fi=(33) +3101 100 +fe=(90) + +fn=(5816) ::emit_text +63 50000 ++1 100000 ++11 200000 ++1 150000 + +fn=(5850) ::emit_end +197 525175 +fi=(91) +-68 150050 +fi=(43) +1229 75025 +fi=(91) +145 75025 +fi=(43) +1229 75025 +fi=(91) +262 75025 +0 300100 +fe=(90) +214 225075 +fi=(93) +315 300100 +0 75025 +fi=(50) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs +402 150050 +fi=(93) +-87 75025 +fi=(33) +2873 225075 ++4 150050 +fi=(32) +611 75025 +fi=(18) +1755 75025 +fe=(90) +228 150050 +fi=(32) +611 75025 +fi=(33) +1865 75025 +fi=(92) +380 150050 ++4 150000 +fi=(43) +1229 75000 +fi=(91) +493 75000 +fi=(40) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs +1490 150050 +fi=(92) +380 450150 +fi=(32) +611 75000 +fi=(43) +1229 75000 +fi=(40) +1491 75000 +fi=(33) +1828 75025 +fe=(90) +257 375125 ++1 675225 +fi=(92) +384 225075 +fi=(91) +221 150050 +fi=(54) +871 75025 +fi=(77) +21 150050 +-21 75025 +157 600200 +cob=(2) +cfi=(2) +cfn=(5744) +calls=111037 0 +* 1617539 +* 450150 +fe=(90) ++73 75025 +fi=(92) +394 75025 +fi=(91) ++30 75025 +fe=(90) + +fl=(103) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs +fn=(5714) ::local_name +141 250000 ++69 250000 +fi=(10) +1096 100000 +fi=(44) +90 50000 +fi=(102) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs +-62 100000 ++13 100000 +-41 100000 +42 200000 ++4 100000 +-5 250000 +fi=(54) +-41 50000 +fe=(103) +143 350000 + +fl=(107) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs +fn=(5770) quick_xml::escape::unescape +236 250000 ++52 25000 +fi=(54) +473 75000 +0 25000 +fi=(13) +3994 50000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5492) memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 +calls=37000 659 +* 1053000 +fi=(41) +2869 50000 +fe=(107) +321 50000 +fi=(91) +0 25000 +fe=(107) +327 100000 +0 25000 +238 225000 + +fl=(84) +fn=(5492) +659 350100 +fi=(78) +0 700200 +fi=(54) +623 350100 +fe=(84) ++40 350100 ++1 50100 +fi=(88) +1161 50050 +0 25025 +1162 25025 +fe=(84) +668 50050 +fi=(88) +1162 47250 +fe=(84) +668 239000 +fi=(54) +389 72250 +fi=(88) +1161 144500 +0 25000 +fi=(78) +86 75000 +fi=(18) +573 150000 +fi=(146) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs +699 300000 +2315 150000 +2163 150000 +fi=(147) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/vector.rs +147 150000 +fi=(88) +679 150000 +fi=(18) +573 25 +fi=(57) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/sse2.rs +920 50 +-25 25 +1569 25 +fi=(147) +147 25 +fi=(88) +679 25 +fe=(84) +0 450075 +fi=(78) +86 300100 +fe=(84) + +fn=(5522) +1042 400100 +0 1400350 +fi=(54) +623 400100 +fe=(84) +1046 400100 ++1 150 +fi=(88) +1161 50 +0 25 +1162 50 +fe=(84) +1051 25 +fi=(88) +1162 400 +fe=(84) +1051 1050 +fi=(54) +389 200 +fi=(88) +1161 400 +fi=(18) +573 199975 +fi=(146) +699 399950 +2315 199975 +699 199975 +2315 199975 +2163 199975 +fi=(147) +147 199975 +fi=(88) +972 199975 +fi=(18) +573 50 +fi=(57) +920 100 +-25 50 ++25 50 +-25 50 +1569 50 +fi=(147) +147 50 +fi=(88) +972 50 +fe=(84) +0 800100 +fi=(78) +86 400050 +-86 25 +86 50 +fe=(84) + +fl=(117) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter.rs +fn=(5946) > as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter +32 200200 +fi=(98) +2493 100100 +0 25025 +2498 50050 +1082 25025 +-30 25025 +fi=(37) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter_nested.rs +0 25025 +26 225225 +fi=(98) +2506 25025 +fi=(10) +-10 75075 +fi=(19) +1051 75075 +fi=(10) +3212 25025 +fi=(37) +0 25025 +fi=(47) +478 75075 +fi=(98) +1052 25025 +fi=(54) +871 25025 +fi=(18) +1755 25025 +fi=(37) +24 50050 +fe=(117) ++10 200200 +fi=(32) +461 50050 +0 25025 +cfi=(6) +cfn=(5100) +calls=37037 0 +0 25025 +0 25025 +fi=(23) +130 75075 +cfi=(24) +cfn=(5102) +calls=37037 -89 +* 4837200 +fi=(32) +470 50050 +0 50050 +fi=(18) +1963 200200 +fi=(37) +36 100100 ++5 100100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 -41 +* 1926925 +fi=(98) +2493 125125 +0 50 +2493 50 +0 100000 +fi=(33) +4100 225000 +fi=(18) +1963 400000 +fi=(33) +4111 50000 +2224 50000 +fi=(98) +2493 150000 ++5 100000 +fi=(18) +1755 50000 +fi=(33) +4100 550000 ++2 100000 +fi=(98) +0 75000 +2493 50000 +0 25025 +fi=(18) +847 25025 +cfi=(98) +cfn=(5958) +calls=37037 2373 +* 525525 +fi=(37) +42 150150 +fe=(117) + +fl=(114) +fn=(5908) +45 75000 +-45 25000 +46 50000 +-46 50000 +46 100000 ++36 50000 +fi=(115) ++70 50000 +fe=(114) +-67 50000 ++22 25000 +fi=(116) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/table_decimal.rs +-30 75000 +fi=(148) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/arith.rs +515 50000 +fe=(114) +100 75000 + +fl=(75) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/mod.rs +fn=(5470) >::read_event_impl::<&mut alloc::vec::Vec> +1006 2400600 +289 1400350 +fi=(76) +2635 50 +fi=(77) +157 125 +fi=(85) +24 25 +fe=(75) +306 25 ++45 300100 +fi=(33) +3101 150050 +fi=(76) +137 300100 +0 300100 +fi=(54) +871 150050 +fi=(13) +3994 300100 +fi=(78) +153 750250 +cfi=(84) +cfn=(5492) +calls=222073 659 +* 3301100 +fi=(41) +2869 300100 +fi=(85) +72 600200 ++7 100000 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 100000 +-94 50000 +fi=(20) +970 50000 +fi=(18) +573 200000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=74000 0 +* 705000 +* 100000 +fi=(33) +2986 100000 +fi=(85) +0 50000 +fi=(44) +549 100000 +fi=(144) +389 100000 +fi=(44) +544 50000 +fi=(85) +79 100000 +fi=(44) +544 150000 +90 100000 +fi=(85) +-4 150000 +cfi=(38) +cfn=(5182) +calls=74000 +3 +* 3700250 +* 100000 +-25 150000 ++14 100050 +fi=(144) +389 100050 +fe=(75) +-34 100050 +0 300150 +437 100050 +fi=(44) +544 200100 +fe=(75) +437 50000 +fi=(44) +544 100000 +fe=(75) +0 150050 +fi=(144) +389 300100 +fi=(44) +90 150050 +fi=(76) ++66 300100 +fi=(144) +389 300100 +fi=(76) +156 150050 +fi=(72) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/clone.rs +716 300100 +fe=(75) +440 600200 +0 75025 +464 225075 +cfi=(85) +cfn=(5504) +calls=111037 211 +* 19183725 +-1 150050 ++4 375125 +cfi=(90) +cfn=(5850) +calls=111037 197 +* 8894789 +* 75025 +0 75025 +488 225075 +cfi=(85) +cfn=(5504) +calls=111037 211 +* 22204750 +-1 150050 +0 250000 +cfi=(90) +cfn=(5816) +calls=74000 63 +0 500000 +fi=(27) +2177 50000 +0 200000 +2177 100000 +fe=(75) +0 300000 +323 50000 +491 375125 +cfi=(90) +cfn=(5554) +calls=111037 314 +* 9137500 +* 75025 +-91 750250 +1011 1800450 + +fl=(32) +fn=(5508) +186 300 +493 50 ++30 50 +fi=(19) +1051 150 +fe=(32) +529 200 +cfn=(5230) ::finish_grow +calls=74 +15 +* 3550 +fi=(27) +2177 100 ++1 50 +fe=(32) +773 50 ++1 50 +189 250 + +fn=(5532) +658 300 +512 150 +fi=(10) +938 75 +fi=(47) +478 75 +0 75 +fe=(32) +523 150 +fi=(19) +1051 150 +fe=(32) +159 525 +fi=(19) +1051 225 +fe=(32) +529 300 +cfn=(5230) +calls=1118 +15 +* 6775 +fi=(27) +2177 150 ++1 75 +fe=(32) +773 75 ++1 75 +668 300 +-10 150 +fi=(10) +938 50 +fi=(47) +478 50 +0 50 +fe=(32) +523 100 +fi=(19) +1051 250 +fe=(32) +529 350 +cfn=(5230) +calls=1074 +15 +* 4375 +fi=(27) +2177 100 ++1 50 +fe=(32) +773 50 ++1 50 +668 200 + +fn=(5230) +544 2600 +fi=(10) +3212 2600 +fi=(47) +478 975 +0 325 +fe=(32) +631 325 +fi=(10) +1401 300 +fi=(23) +228 1500 +cfi=(24) +cfn=(5540) __rustc::__rust_realloc +calls=1451 41 +* 54143 +fi=(27) +965 600 +fi=(23) +298 50 ++4 25 +cfi=(6) +cfn=(5100) +calls=39 0 +* 25 +130 75 +cfi=(24) +cfn=(5102) +calls=39 -89 +* 950 +fi=(27) +965 50 ++1 975 +fe=(32) +0 650 +564 1950 +-20 600600 +fi=(10) +3212 600600 +fi=(47) +478 225225 +fe=(32) +631 150150 +fi=(10) +1401 25 +fi=(23) +228 125 +cfi=(24) +cfn=(5540) +calls=1037 41 +* 1400 +fi=(27) +965 50 +fi=(23) +298 150100 ++4 75050 +cfi=(6) +cfn=(5100) +calls=111074 0 +* 75050 +130 225150 +cfi=(24) +cfn=(5102) +calls=111074 -89 +* 3152000 +fi=(27) +965 150100 ++1 225225 +fe=(32) +0 150150 +564 450450 +-20 400 +fi=(86) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/layout.rs +75 50 ++38 50 +0 50 +fe=(32) +631 100 +fi=(23) +298 100 +128 50 +cfi=(6) +cfn=(5100) +calls=74 0 +* 50 ++2 150 +cfi=(24) +cfn=(5102) +calls=74 -89 +* 1900 +fi=(27) +965 100 ++1 150 +fe=(32) +0 100 +564 300 + +fn=(6020) >::grow_one +186 900 +493 225 ++30 225 +fi=(19) +1051 675 +fe=(32) +529 1350 +cfn=(5230) +calls=333 +15 +* 40950 +fi=(27) +2177 450 ++1 225 +fe=(32) +773 225 ++1 225 +189 900 + +fn=(5570) +186 100 +493 25 ++30 25 +fi=(19) +1051 75 +fe=(32) +529 150 +cfn=(5230) +calls=37 +15 +* 2075 +fi=(27) +2177 50 ++1 25 +fe=(32) +773 25 ++1 25 +189 100 + +fn=(5662) >>::grow_one +186 300000 +493 75000 ++30 75000 +fi=(19) +1051 225000 +fe=(32) +529 450000 +cfn=(5230) +calls=111000 +15 +* 6225000 +fi=(27) +2177 150000 ++1 75000 +fe=(32) +773 75000 ++1 75000 +189 300000 + +fn=(5686) >::grow_one +186 100 +493 25 ++30 25 +fi=(19) +1051 75 +fe=(32) +529 150 +cfn=(5230) +calls=37 +15 +* 20393 +fi=(27) +2177 50 ++1 25 +fe=(32) +773 25 ++1 25 +189 100 + +fl=(26) +fn=(5684) +65 75200 +cob=(2) +cfi=(2) +cfn=(4878) +calls=112323 -65 +* 2487000 + +fl=(94) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs +fn=(5602) ::next +601 1500300 ++1 1000200 +cfn=(5604) ::next +calls=370074 1123 +* 28202100 +* 1250250 ++1 350100 ++1 450000 +fi=(91) +129 525000 +fe=(94) +777 225000 +fi=(91) +129 150000 ++4 150000 ++12 150000 +fi=(43) +1229 150000 +fi=(91) +146 150000 +fi=(43) +1229 75000 +fi=(91) +262 75000 +129 375000 ++4 150000 ++12 150000 +fi=(43) +1229 75000 +fi=(91) +145 75000 ++1 150000 +fi=(43) +1229 75000 +fi=(91) +262 75000 +fi=(54) +871 225000 +fe=(94) +604 375000 ++3 1250250 + +fn=(5604) +1123 1750350 ++1 750150 +955 750150 ++2 250050 +1124 250050 +fi=(44) +544 500100 +fi=(14) +1663 500100 +fi=(50) +180 250050 +fe=(94) +1125 75000 +fi=(44) +90 375000 +-90 75000 +fe=(94) +1130 75000 +fi=(14) +627 75000 +fe=(94) +1130 75000 +fi=(93) +315 75000 +fe=(94) +1130 75000 +fi=(14) +627 75000 +fe=(94) +1130 75000 +fi=(93) +315 75000 +0 225000 +fi=(50) +180 75000 +fe=(94) +0 75000 +fi=(50) +180 75000 +fe=(94) +1138 175050 ++1 175050 +0 75000 +fi=(50) +180 75000 +fe=(94) +1143 300000 +fi=(14) +1663 150000 +fi=(50) +180 75000 +fe=(94) +1143 450000 +0 375000 +1188 525000 +0 175050 +1261 2250450 +-73 450000 +cfn=(5658) ::check_for_duplicates +calls=111000 1036 +* 12075000 +* 150000 +fi=(14) +1663 300000 +fi=(50) +180 75000 +0 225000 +fe=(94) +1199 150000 +fi=(93) +315 75000 +0 150000 +fe=(94) +0 225000 +fi=(14) +1663 150000 +fi=(50) +180 300000 +fe=(94) +1243 75000 +fi=(149) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/traits/iterator.rs +2490 75000 +fe=(94) +1243 216750 +fi=(149) +2490 216750 +fi=(14) +627 216750 +1663 433500 +fi=(50) +180 216750 +fi=(93) +0 150000 +fe=(94) +1243 75000 +0 150000 +1243 150000 +1113 150000 +0 375000 + +fn=(5658) +1036 525000 ++5 150000 +0 150000 +fi=(33) +3101 75000 +fe=(94) +1042 150000 +0 300000 +fi=(32) +611 150000 +fi=(20) +970 300000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +fe=(94) +0 225000 +fi=(33) +1032 150000 ++1 75000 +cfi=(32) +cfn=(5662) +calls=111000 186 +* 8025000 +fi=(32) +611 150000 +0 225000 +fi=(18) +1963 225000 +fi=(33) +1038 225000 +fe=(94) ++16 225000 ++1 600000 + +fl=(74) +fn=(5580) ::check_root +338 200 ++1 50 ++14 25 ++1 200 + +fn=(5708) polyxml::parser::is_nil_element +151 525000 +fi=(100) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs +0 75000 +fi=(101) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs +272 75000 +fe=(74) +152 1125000 +0 75000 +fi=(99) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs +403 225000 +cfi=(94) +cfn=(5602) +calls=111000 601 +* 12008500 +* 75000 +cfi=(94) +cfn=(5602) +calls=37000 601 +* 1350000 +fi=(95) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs +855 300000 +fi=(41) +-90 50000 +fi=(95) ++90 200000 ++1 100000 +fe=(74) +152 25000 +fi=(103) ++70 50000 +fi=(77) +21 50000 +fi=(76) +2635 25000 +fe=(74) +157 50000 +cfi=(103) +cfn=(5714) +calls=37000 -16 +* 950000 +fi=(77) +21 100000 +fi=(18) +847 50000 +fi=(23) +0 150000 +fe=(74) +163 75000 +cfi=(18) +cfn=(5614) +calls=111000 847 +* 2300000 ++2 675000 + +fn=(5600) polyxml::parser::namespace_scope +169 525175 ++1 75025 +fi=(100) +0 75025 +fi=(101) +272 75025 +fe=(74) +171 975325 +0 75025 +fi=(99) +403 225075 +cfi=(94) +cfn=(5602) +calls=111037 601 +* 12009850 +* 75000 +cfi=(94) +cfn=(5602) +calls=37000 601 +* 1350000 +fi=(95) +855 300075 +fi=(41) +-90 50000 +fi=(95) ++90 200050 ++1 150000 +fi=(77) +21 50000 +fi=(76) +2635 25000 +fi=(18) +847 75000 +fi=(96) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/collections/hash/map.rs +0 75025 +fe=(74) +182 75025 +cfi=(18) +cfn=(5614) +calls=111037 847 +* 2300450 ++1 75025 +fi=(41) +1162 150050 +fi=(13) +4029 75025 +fi=(59) +2434 75025 +fe=(74) +184 675225 + +fn=(5620) polyxml::parser::resolve_record_schema +215 200200 +fi=(14) +454 25025 +fe=(74) +220 50050 +fi=(14) +454 25025 +fi=(13) +3994 25025 +fi=(97) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs +54 50050 ++45 25025 +fi=(13) +4149 25025 +fi=(97) +97 25025 +fi=(13) +3994 25025 +fi=(33) +3101 50050 +fi=(13) +4049 25025 +fi=(97) +111 25025 ++7 100100 +fi=(33) +3126 25025 +fe=(74) +220 25025 +fi=(13) +4029 25025 +fi=(59) +2434 25025 +fe=(74) +221 25025 +0 25025 +269 225225 + +fn=(5590) ::parse_sub_tree::<&[u8]> +405 350 +cfi=(6) +cfn=(5100) +calls=37 0 +* 25 +fi=(23) +130 75 +cfi=(24) +cfn=(5102) +calls=37 -89 +* 3725 +fi=(32) +470 50 +fi=(33) +969 75 +fi=(23) +128 25 +cfi=(6) +cfn=(5100) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5102) +calls=37 -89 +* 950 +fi=(28) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/boxed.rs +251 50 +fe=(74) +413 100 +cfn=(5600) +calls=37 169 +* 3000 +* 25 +fi=(33) +1196 125 +fe=(74) +415 75 +cfn=(5620) +calls=37 215 +* 1050 +fi=(27) +2177 25 +0 25 +2177 50 +fi=(41) +634 25 +fi=(33) +3101 25 +fe=(74) +33 25 ++1 100 +cfi=(98) +cfn=(5634) +calls=37 2052 +* 3225 +-7 25 ++9 75 +-4 150 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 -32 +* 1925 +* 175 +417 75 +cfn=(5638) ::parse_attributes +calls=37 967 +* 3225 +fi=(27) +2177 50 +fe=(74) +0 50 +418 50 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fi=(33) +1029 25 ++3 50 +fi=(20) +-62 75 +fi=(18) +1963 75 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fi=(33) +1038 50 +fe=(74) +420 25 ++1 25 +fi=(33) ++41 450 +3082 600000 +fi=(85) +412 800000 +cfi=(75) +cfn=(5470) +calls=296000 1006 +* 85032514 +* 100 +cfi=(75) +cfn=(5470) +calls=37 1006 +* 24575 +fe=(74) ++16 1000125 +0 200025 +428 600075 +fi=(33) +1865 75000 +fi=(76) +282 150000 +fi=(32) +611 75000 +fi=(76) +282 150000 +fe=(74) +430 150000 +cfn=(5600) +calls=111000 169 +* 19808500 +0 150000 +fi=(33) +1029 75000 ++3 150000 ++1 50 +cfi=(32) +cfn=(5686) +calls=37 186 +* 20993 +fi=(32) +611 75000 +fi=(18) +1963 75000 +fi=(33) +1038 150000 +fe=(74) +431 150000 +fi=(18) +0 200000 +847 1200000 +fe=(74) +-73 100000 +fi=(100) +350 100000 +fi=(54) +871 50000 +fi=(33) +3126 50000 +fi=(13) +3994 100000 +fe=(74) +777 50000 +fi=(33) +2873 225075 ++4 150050 +fi=(32) +611 75025 +fi=(18) +1755 75025 +fi=(33) +0 75025 +fi=(13) +4049 75025 +fi=(59) +2868 75025 +fe=(74) +876 150050 +fi=(33) +3101 75025 ++25 75025 +fe=(74) +880 75025 +fi=(41) +634 300000 +fe=(74) +435 150000 +0 75000 +fi=(33) +3126 75000 +fe=(74) +437 75000 +fi=(76) +282 150000 +fi=(33) +1904 75000 +fi=(76) +305 150000 +fi=(32) +611 150000 +fi=(76) +305 225000 +fi=(14) +454 75000 +fi=(59) +2454 75000 +fe=(74) +440 150000 +cfn=(5694) polyxml::parser::record_content_token +calls=111000 1093 +* 1350000 +fi=(41) +634 150000 +fe=(74) +442 150000 +fi=(33) +3126 75000 +fe=(74) +446 75000 +fi=(78) +153 150000 +cfn=(5826) memchr::arch::x86_64::memchr::memchr_raw::find_avx2 +calls=73999 -75 +* 3000300 +fi=(41) +2869 100000 +fi=(11) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/mem/mod.rs +975 75025 ++1 75025 +fe=(74) +-69 225075 +fi=(41) +634 100000 +fe=(74) +792 50000 +fi=(33) +3101 75000 +fe=(74) +463 150000 +fi=(100) +0 75000 +fi=(101) +202 75000 +fi=(92) +380 150000 +fi=(101) +202 75000 +fi=(92) +384 150000 +fi=(43) +1229 25000 +fi=(91) +424 25000 +fi=(11) +975 450150 ++1 75025 +fe=(74) +-65 75025 +-1 75025 +fi=(33) +1865 50000 +fi=(76) +282 100000 +fe=(74) +0 50000 +fi=(32) +611 50000 +fi=(76) +282 50000 +fi=(14) +454 50000 +fi=(33) +1865 50000 +fi=(44) +238 100000 +fe=(74) +0 50000 +fi=(44) +238 150000 +fi=(32) +611 50000 +fi=(33) +1865 100000 +fe=(74) +914 150000 +cfn=(5880) polyxml::parser::parse_field_scalar +calls=74000 132 +* 20928803 +fi=(27) +2177 50000 +0 400000 +2177 100000 +fe=(74) +914 400000 +fi=(33) +1904 50000 +fi=(76) +305 200000 +fe=(74) +916 100000 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 50000 +-94 50000 +fi=(33) +2981 99950 +0 50000 +fi=(20) +970 50000 +fi=(18) +573 150000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=74000 0 +* 705000 +fi=(33) +2986 150000 +fi=(91) +424 50000 +0 150000 +fi=(10) +1096 150000 +fi=(44) +90 150000 +fi=(102) +-62 150000 ++13 75000 +fi=(10) +1092 75000 +0 150000 +fi=(102) +42 650000 ++4 325000 +-5 725000 +fe=(74) +470 150000 +cfn=(5708) +calls=111000 151 +* 20683500 +0 75000 +fi=(33) +1865 75000 +fi=(76) +282 150000 +0 150000 +fi=(32) +611 75000 +fi=(76) +282 75000 +fi=(14) +454 75000 +fi=(13) +4029 75000 +fi=(59) +2434 75000 +fe=(74) +472 75000 +fi=(59) +2438 75000 +320 75000 +fi=(55) +1337 75000 +fi=(51) /rust/deps/hashbrown-0.17.1/src/map.rs +-53 75000 ++3 225000 +241 75000 +cfi=(52) +cfn=(5734) +calls=111000 694 +* 13650000 +* 75000 +fi=(106) /rust/deps/hashbrown-0.17.1/src/control/tag.rs +47 150000 +fi=(55) +2452 450000 +0 75000 +fi=(18) +573 75000 +fi=(57) +1569 225000 +fi=(104) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs +40 150000 +-40 525000 +fi=(58) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/nonzero.rs +628 75000 +fi=(55) +2032 150000 +fi=(20) +1054 300000 +fi=(77) +21 150000 +fi=(105) /rust/deps/hashbrown-0.17.1/src/lib.rs +157 225000 +cob=(2) +cfi=(2) +cfn=(5744) +calls=111000 0 +* 1473000 +* 75000 +fi=(47) +455 75000 +fe=(74) ++18 75000 +fi=(33) +1865 75000 +fi=(44) +238 150000 +fi=(32) +611 75000 +fi=(44) +238 225000 +fe=(74) +478 600000 +0 25000 +478 50000 +fi=(28) +2415 25000 +fe=(74) +488 175000 +0 25000 +488 50000 ++13 50000 +fi=(33) +3101 25025 +fe=(74) +921 50050 +fi=(33) +2877 50000 +fi=(54) +871 50000 +fi=(41) +1013 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fi=(100) +350 50000 +fi=(103) +210 75000 +cfi=(92) +cfn=(5914) ::find:: +calls=37000 1497 +* 1200000 ++62 175000 +cfi=(41) +cfn=(5922) >::map_or::<&str, >::from::{closure#0}> +calls=37000 1222 +* 125000 +fe=(74) +0 50000 +fi=(41) +2274 50000 +fe=(74) +919 400000 +fi=(98) +1082 100000 +-17 50000 +fe=(74) +945 50 +480 100000 +fi=(98) +0 50000 +fi=(44) +245 200000 +fi=(18) +847 100000 +fe=(74) ++72 250000 +0 150000 +fi=(18) +847 250000 +cfn=(5896) +calls=74000 * +* 1000000 +* 50000 +fe=(74) +0 100000 +484 100000 +cfi=(45) +cfn=(5808) +calls=74000 13 +* 1450000 +* 200000 +fi=(41) +634 50000 +fi=(18) +847 50000 +fe=(74) +484 300000 +fi=(33) +3082 100000 +0 25000 +fe=(74) +925 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +* 75000 +cfn=(5924) ::finish +calls=37000 75 +* 27532831 +fi=(27) +2177 50000 +0 200000 +2177 50000 +fe=(74) +925 200000 +fi=(33) +1904 25000 +fi=(76) +305 50000 +fi=(32) +611 25000 +fi=(76) +305 75000 +fe=(74) +928 50000 +0 25000 +fi=(14) +454 25000 +fi=(96) +1039 100000 +cfi=(55) +cfn=(5990) , usize, std::hash::random::RandomState>>::get::<[u8]> +calls=37000 1337 +* 6550000 +fe=(74) +933 75000 +fi=(33) +1865 25000 +fi=(44) +238 50000 +fi=(32) +611 25000 +fi=(44) +238 50000 +fe=(74) +939 75000 ++1 275000 +cfn=(6000) ::push_list_item +calls=37000 62 +* 1474250 +* 25000 +fi=(33) +1865 25000 +fi=(76) +282 75000 +fe=(74) +0 25000 +fi=(32) +611 25000 +fi=(76) +282 50000 +fe=(74) +509 50000 +cfn=(5620) +calls=37000 215 +* 1050000 +fi=(27) +2177 25000 +0 25000 +2177 50000 +fe=(74) +514 50000 +cfn=(5754) ::new +calls=37000 25 +* 6950000 +0 25000 +515 100000 +cfn=(5638) +calls=37000 967 +* 28121500 +fi=(27) +2177 50000 +fe=(74) +516 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fi=(33) +996 75000 +cfn=(5802) >::push_mut +calls=37000 +31 +* 2700000 +0 75000 +fi=(14) +454 75000 +fi=(13) +4049 75000 +fi=(59) +2868 75000 +0 125000 +fe=(74) +958 400000 +fi=(18) +847 600000 +fi=(32) +672 150 +cfn=(5532) +calls=37 -14 +* 2875 +fi=(33) +3101 25 +2981 25 +fe=(74) +958 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5684) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5684) +calls=37 65 +* 850 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +fi=(18) +847 125 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5684) +calls=37 65 +* 850 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5684) +calls=37 65 +* 3250 +fi=(14) +454 25 +fi=(13) +4049 25 +fi=(59) +2868 25 +fe=(74) +965 200 +fi=(18) +847 75 +0 25 +847 150 +fi=(33) +2877 25 +fi=(32) +611 50 +fi=(18) +1755 75 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fe=(74) +947 75 +cfn=(5924) +calls=37 75 +* 29016 +* 25 + +fn=(5638) +967 200200 ++1 25025 +fi=(100) +0 25025 +fi=(101) +272 25025 +fe=(74) +969 500500 +fi=(99) +403 75075 +cfi=(94) +cfn=(5602) +calls=37037 601 +* 9309850 +* 75000 +cfi=(94) +cfn=(5602) +calls=37000 601 +* 1350000 +fi=(95) +855 150075 +fi=(41) +-90 50000 +fi=(95) ++90 100050 ++1 125000 +fe=(74) +969 25000 +fi=(103) +222 75000 +fi=(77) +21 75000 +fi=(76) +2635 25000 +fe=(74) +0 25000 +974 50000 +cfi=(103) +cfn=(5714) +calls=37000 141 +* 950000 +0 50000 +fi=(14) +454 25000 +fi=(55) +1337 25000 +fi=(51) +-53 25000 +0 25000 +1287 25000 +241 50000 +cfi=(52) +cfn=(5734) +calls=37000 694 +* 4625000 +fi=(106) +47 75000 +fi=(55) +2452 150000 +0 25000 +fi=(18) +573 25000 +fi=(57) +1569 75000 +fi=(104) +40 50000 +-40 200000 +fi=(58) +628 25000 +fi=(55) +2032 50000 +fi=(20) +1054 75000 +fi=(77) +21 50000 +fi=(105) +157 100000 +cob=(2) +cfi=(2) +cfn=(5744) +calls=37000 0 +* 493000 +* 25000 +fi=(47) +455 25000 +fe=(74) +975 25000 +fi=(33) +1865 25000 +fi=(44) +238 50000 +fi=(32) +611 25000 +fi=(44) +238 50000 +fe=(74) +977 100000 +fi=(100) +350 50000 +fe=(74) +978 50000 +cfi=(107) +cfn=(5770) +calls=37000 236 +* 2078000 +fi=(27) +2177 25000 +0 100000 +2177 50000 +fe=(74) +0 75000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fe=(74) +979 75000 +cfi=(108) +cfn=(5782) +calls=37000 28 +* 2617000 +fi=(27) +2177 50000 +0 200000 +2177 75000 +fe=(74) +979 225000 +fi=(98) +1082 75000 +-17 25000 +fi=(44) +245 50000 +0 25000 +fi=(98) +1082 25000 +-17 25000 +fi=(44) +245 50000 +fi=(18) +847 50000 +fe=(74) +984 225000 +fi=(18) +847 100000 +fi=(23) +0 50000 +fi=(18) +847 50000 +fi=(11) +0 25025 +fe=(74) +994 25025 +cfi=(18) +cfn=(5614) +calls=37037 847 +* 1400450 +* 25025 +fi=(14) +454 25025 +fe=(74) +995 50050 ++3 25025 +fi=(18) +847 50050 +fe=(74) +999 225225 + +fn=(5694) +1093 525000 +fi=(14) +454 75000 +fi=(41) +634 75000 +fe=(74) +1098 75000 ++8 600000 + +fn=(5468) ::deserialize_with_limit +360 250 +fi=(75) +810 300 +fi=(33) +462 150 +0 50 +fi=(85) +412 100 +cfi=(75) +cfn=(5470) +calls=37 1006 +* 24750 +fe=(74) +-43 225 +fi=(14) ++85 25 +fi=(59) +2454 100 +fe=(74) +371 50 +cfn=(5580) +calls=37 -33 +* 475 +fi=(27) +2177 50 +fe=(74) +374 50 +fi=(150) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/thread_local/native/mod.rs +105 75 +fi=(151) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/thread_local/native/lazy.rs +-46 50 +fi=(60) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cell.rs +558 50 +fi=(10) +2652 25 +fi=(11) +976 25 +fi=(59) +440 200 +fi=(23) +128 25 +cfi=(6) +cfn=(5100) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5102) +calls=37 -89 +* 1050 +fi=(28) +251 50 +0 25 +293 200 +fi=(59) ++27 75 +fe=(74) ++52 125 +cfn=(5590) +calls=37 +33 +* 282423282 +fi=(13) +4049 25 +fi=(59) +2868 25 +0 50 +2911 25 +cfn=(6150) +calls=37 2138 +* 1725 +0 25 +fe=(74) +396 75 +fi=(18) +847 75 +0 25 +847 150 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5684) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5684) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5684) +calls=37 65 +* 3850 +fe=(74) +403 275 + +fn=(5754) +25 150000 +fi=(41) +634 25000 +fi=(33) +3101 25000 +fe=(74) +33 25000 ++1 100000 +cfi=(98) +cfn=(5634) +calls=37000 2052 +* 4175000 +-7 25000 ++9 75000 +-4 125000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 -32 +* 1925000 +* 150000 ++8 150000 + +fn=(5466) polyxml::deserialize +357 50 +cfn=(5468) +calls=37 +3 +* 282460432 + +fn=(5924) +75 225225 +fi=(14) +454 50050 +fi=(59) +2454 25025 +fi=(32) +611 25025 +fi=(33) +1865 75075 +fe=(74) +76 25025 +cfi=(45) +cfn=(5926) +calls=37037 725 +* 550550 +fi=(27) +2177 50050 +fi=(18) +0 50050 +fi=(14) +454 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +fi=(50) +180 25025 +0 125125 +180 100100 +fi=(41) +634 25000 +fe=(74) +78 25000 +fi=(50) +-78 75025 +fi=(14) +1663 150050 +fi=(118) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs +82 75025 +fi=(14) +1663 75025 +fi=(50) +180 75025 +fi=(45) +4 75025 +fe=(74) ++74 75025 +fi=(98) +1082 75000 +-30 25000 +fi=(44) +238 50000 +0 25000 +fi=(98) +1082 25000 +-30 25000 ++30 75075 +-30 25025 +-15 50050 +fe=(74) +91 25025 +-91 50 +fi=(98) +1082 25 +fe=(74) +92 300 +fi=(98) +996 50 ++56 25 +-56 25 +fe=(74) +92 25 +fi=(118) +-68 125 +fe=(74) ++68 25 +fi=(98) +2493 50 +0 125 +fe=(74) +94 200 +fi=(98) +2493 50 +0 25 +2493 50 ++5 50 +1082 50 +-30 25 +fi=(54) +871 25 +fi=(18) +1755 25 +fi=(41) +2869 50 +fi=(118) +80 25 +fi=(41) +2870 50 +fi=(118) +81 25 ++1 50 +fe=(74) ++11 100 ++1 50 +fi=(98) +1082 75 +-17 25 +fi=(44) +245 50 +0 25 +fi=(98) +1082 25 +-17 25 +fi=(44) +245 50 +fi=(18) +847 50 +0 25 +847 25 +cfi=(98) +cfn=(6142) +calls=37 2483 +* 500 +0 75 +847 25 +cfi=(98) +cfn=(5984) +calls=37 2373 +* 550 +0 25 +fi=(14) +454 25 +fe=(74) +99 100 +-99 50000 +fi=(14) +454 25000 +fe=(74) +99 75000 +fi=(14) +454 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +0 100100 +fi=(98) +1052 125125 +fi=(14) +1663 150050 +fi=(118) +82 75025 +fi=(14) +1663 75025 +fi=(50) +180 75025 +0 75025 +fi=(98) +1082 225075 +-30 75025 +fi=(44) +238 150050 +0 75025 +fi=(98) +1082 75025 +-30 75025 +fi=(41) +743 150050 +fi=(45) +-74 150050 +fi=(111) +0 25025 +fe=(74) +126 100100 ++1 75075 +fi=(98) +1082 25025 +1607 25025 +fe=(74) +127 25025 +fi=(98) +1615 100100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 0 +* 1926925 +2552 50050 +-1 150150 +fi=(33) +3996 25025 +cfi=(117) +cfn=(5946) +calls=37037 32 +* 11517075 +0 25025 +fe=(74) +127 25025 +cfi=(33) +cfn=(5964) >>::into_boxed_slice +calls=37037 1723 +* 7835597 +-2 125125 ++4 50050 +0 25000 +fi=(18) +847 25000 +cfi=(98) +cfn=(5984) +calls=37000 2373 +* 550000 +* 175175 +fi=(32) +425 50050 +631 25025 +fe=(74) +129 225225 + +fn=(6000) +62 175000 +fi=(98) +1082 75000 +-30 25000 +-15 25000 +fe=(74) +63 25000 +-63 24975 +fi=(98) +1082 24975 +-17 24975 +fi=(44) +195 50000 +fi=(98) +1082 25000 +-17 25000 +fe=(74) +0 25 +63 50 +fi=(14) +454 25 +fi=(33) +3101 25 +fe=(74) +65 50 +cfi=(98) +cfn=(6004) +calls=37 1841 +* 1200 +-65 25 +fi=(98) +1082 100 +-17 50 +fe=(74) +67 25000 +fi=(44) +197 50000 +fe=(74) +68 75000 ++1 199800 +fi=(33) +1029 24975 ++3 49950 ++1 450 +cfi=(32) +cfn=(6020) +calls=333 186 +* 46350 +fi=(32) +611 24975 +fi=(20) +970 24975 +fi=(18) +1963 199800 +fi=(33) +1038 74925 +fi=(23) +128 25 +cfi=(6) +cfn=(5100) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5102) +calls=37 -89 +* 1050 +fi=(28) +251 50 +fe=(74) +70 225 +fi=(18) +847 50 +fe=(74) +70 75 ++3 175000 + +fn=(5880) +132 100000 +fi=(76) ++5 100000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(74) +146 150000 +cfi=(108) +cfn=(5782) +calls=74000 28 +* 20328803 ++1 150000 + +fl=(78) +fn=(5826) +78 50000 +fi=(84) +184 100000 +0 150000 +fi=(54) +623 100000 +fi=(84) +188 100000 ++1 100000 +fi=(88) +1161 50000 +0 50000 +fi=(84) +193 1050150 +fi=(54) +389 350050 +fi=(88) +1161 700100 +0 100000 +fe=(78) +86 100000 + +fl=(24) +fn=(6470) measured_region +79 9 +fi=(19) +2144 1 +fi=(34) +1100 1 +0 10 +fi=(26) +0 5 +fi=(152) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hint.rs +491 4 +fi=(13) +4029 1 +fi=(59) +2434 1 +fi=(26) +0 24 +fi=(152) +491 96 +fi=(13) +4029 24 +fi=(59) +2434 24 +fe=(24) +89 125 +cfi=(74) +cfn=(5466) +calls=25 357 +* 282460482 +fi=(27) +1230 50 ++1 200 +fe=(24) +89 50 +cfi=(18) +cfn=(6416) +calls=25 847 +* 12449239 +fi=(19) +2144 25 +fi=(34) +1100 25 +fe=(24) +94 8 + +fn=(5140) +cfn=(6470) +calls=1 79 +70 294910404 + +fn=(5102) +41 125250 +fi=(13) +3994 125250 +762 125250 +fe=(24) +16 125250 +fi=(25) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs +161 501000 +fi=(26) +30 250500 ++1 250500 +cob=(2) +cfi=(2) +cfn=(4226) +calls=186395 -31 +* 17149778 +fe=(24) + +fn=(5540) +41 25350 +fi=(13) +3994 25350 +762 25350 +fe=(24) +33 25350 +fi=(89) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs +-33 126750 +405 50700 +fi=(26) +70 50050 ++1 50050 +cob=(2) +cfi=(2) +cfn=(4458) +calls=37037 -71 +* 6884647 +-1 650 ++1 650 +cob=(2) +cfi=(2) +cfn=(4458) +calls=2488 -71 +* 50668 +fe=(24) + +fl=(38) +fn=(5182) +89 1125250 +fi=(39) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs ++44 675150 ++12 450100 +0 1575350 +164 225050 ++1 450100 +fi=(10) +2689 450100 +3875 225050 +fi=(39) +222 225050 ++2 450100 ++17 450100 +0 225050 +241 3590050 ++1 1795025 +-1 3815100 +fe=(38) +94 900200 +-94 225050 +98 900200 + +fl=(41) +fn=(5922) +1222 25000 ++5 50000 ++4 50000 + +fl=(6) +fn=(4126) (below main) +cob=(2) +cfi=(2) +cfn=(4128) +calls=1 0 +0 294910404 + +fn=(4176) +cfi=(8) +cfn=(4178) +calls=1 152 +0 294910404 + +fn=(5100) +0 125250 + +fl=(55) +fn=(5990) +1337 25000 +fi=(51) +-53 25000 +0 225000 +1287 50000 +241 50000 +cfi=(52) +cfn=(5734) +calls=37000 694 +* 4500000 +fi=(106) +47 75000 +fe=(55) +2452 200000 +0 25000 +fi=(18) +573 25000 +fi=(57) +1569 75000 +fi=(104) +40 50000 +-40 125000 +fi=(58) +628 25000 +fe=(55) +2032 50000 +fi=(20) +1054 75000 +fi=(77) +21 50000 +fi=(105) +157 100000 +cob=(2) +cfi=(2) +cfn=(5744) +calls=37000 0 +* 475000 +* 25000 +fi=(47) +455 25000 +fe=(55) +1217 250000 +fi=(51) ++76 25000 +fe=(55) + +fn=(6152) +3486 175 +2656 50 +2271 25 +3498 200 + +fl=(33) +fn=(5964) +1723 100100 +fi=(32) +616 25025 +fe=(33) +1598 75075 +fi=(32) +832 25025 +fi=(10) +1401 25025 +fi=(32) +839 50050 +fi=(10) +1401 25025 +fi=(23) +228 75075 +cfi=(24) +cfn=(5540) +calls=37037 41 +* 7260022 +fi=(27) +965 50050 +fe=(33) +1731 125125 + +fn=(5802) +1027 125000 ++2 25000 ++3 50000 +fi=(20) +-62 50000 +fi=(18) +1963 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fe=(33) +1038 50000 ++4 100000 + +fl=(53) +fn=(5292) +256 250000 ++2 250000 ++4 750000 +0 500000 +278 250000 ++1 750000 ++3 500000 +0 625000 +fi=(18) +573 125000 +fe=(53) +288 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fe=(53) +78 125000 +fi=(47) +2215 125000 +fe=(53) +79 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fe=(53) +79 125000 +fi=(47) +2215 250000 +fe=(53) +78 125000 +290 125000 ++2 125000 +-10 250000 +0 500000 +126 500000 +fi=(18) +573 200000 +fe=(53) +132 400000 +0 300000 +132 450000 +fi=(54) +871 25000 +fi=(18) +573 25000 +fe=(53) +134 75000 ++1 25000 ++2 500000 ++2 150000 +298 25000 +0 25000 +300 50000 +-2 225000 +0 225000 +300 450000 + +fl=(92) +fn=(5914) +1497 275000 +fi=(10) +1096 50000 +fi=(44) +90 25000 +fi=(102) +-62 50000 ++13 50000 +-41 50000 +42 200000 ++4 100000 +-5 225000 +fe=(92) +1499 175000 + +ob=(1) /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 +fl=(1) ??? +fn=(0) 0x0000000000023340 +cob=(6) +cfi=(6) +cfn=(4126) +calls=1 0 +0 294910404 + +totals: 294910404 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-annotated.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-annotated.txt new file mode 100644 index 0000000..d583c4d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-annotated.txt @@ -0,0 +1,101 @@ +-------------------------------------------------------------------------------- +Profile data file 'benchmarks/rust-runtime-investigation/target/evidence/control/write-1000.callgrind' (creator: callgrind-3.26.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 32437241 +Trigger: Program termination +Profiled target: benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics write 1000 25 instructions (PID 328692, part 1) +Events recorded: Ir +Events shown: Ir +Event sort order: Ir +Thresholds: 95 +Include dirs: +User annotated: +Auto-annotation: off + +-------------------------------------------------------------------------------- +Ir +-------------------------------------------------------------------------------- +88,873,605 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir file:function +-------------------------------------------------------------------------------- +7,250,000 ( 8.16%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/serializer.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +7,202,000 ( 8.10%) ???:0x0000000000197a00 [/usr/lib/x86_64-linux-gnu/libc.so.6] +6,239,550 ( 7.02%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs:core::str::converts::from_utf8 +6,077,100 ( 6.84%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/cursor.rs: as core::io::cursor::WriteThroughCursor>::write_all [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +5,226,325 ( 5.88%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/writer.rs:>>>::write_event:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +2,962,775 ( 3.33%) ???:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] +2,725,825 ( 3.07%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/cursor.rs:>>>::write_event:: +2,500,200 ( 2.81%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::_escape::::{closure#0}, &str> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +2,240,625 ( 2.52%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/algorithm.rs:::format_scalar_to +2,100,350 ( 2.36%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs:core::str::converts::from_utf8 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +2,050,200 ( 2.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:quick_xml::escape::_escape::::{closure#0}, &str> +2,000,000 ( 2.25%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/serializer.rs:::format_scalar_to [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +1,925,000 ( 2.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 +1,825,575 ( 2.05%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/serializer.rs:::validate_lexical_list_items [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +1,575,375 ( 1.77%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:>>>::write_event:: +1,433,475 ( 1.61%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/jeaiii.rs:::format_scalar_to +1,250,000 ( 1.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 +1,200,400 ( 1.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/io/cursor.rs:>>>::write_event:: +1,187,750 ( 1.34%) ???:0x00000000000b4180 [/usr/lib/x86_64-linux-gnu/libc.so.6] +1,150,000 ( 1.29%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/serializer.rs:::validate_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +1,100,400 ( 1.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:>>>::write_event:: +1,079,375 ( 1.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>::reserve::do_reserve_and_handle:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] +1,062,650 ( 1.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 975,000 ( 1.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 916,750 ( 1.03%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::_escape::::{closure#0}, &str> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 900,375 ( 1.01%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs: as core::io::cursor::WriteThroughCursor>::write_all + 877,975 ( 0.99%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::finish_grow [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 825,925 ( 0.93%) ???:free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 775,225 ( 0.87%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>>>::write_event:: + 651,125 ( 0.73%) ???:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 600,150 ( 0.68%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/convert/mod.rs:>>>::write_event:: + 600,000 ( 0.68%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 550,250 ( 0.62%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>>>::write_event:: + 525,000 ( 0.59%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/serializer.rs:::validate_lexical_list_items'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 500,000 ( 0.56%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::push_attribute::<(&str, &str)> + 475,825 ( 0.54%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>>>::write_event:: + 466,750 ( 0.53%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 451,575 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::finish_grow + 450,450 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:core::str::converts::from_utf8 + 450,225 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs: as core::io::cursor::WriteThroughCursor>::write_all + 450,150 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs: as core::io::cursor::WriteThroughCursor>::write_all + 450,000 ( 0.51%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::push_attribute::<(&str, &str)> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 450,000 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 425,425 ( 0.48%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/schema.rs:::matches_variant [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 425,000 ( 0.48%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::push_attr [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 402,475 ( 0.45%) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/serializer.rs:::write_model::<&mut core::io::cursor::Cursor>> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 400,000 ( 0.45%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 400,000 ( 0.45%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::push_attr + 375,000 ( 0.42%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 351,225 ( 0.40%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs:__rustc::__rust_realloc + 350,000 ( 0.39%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::push_attr + 350,000 ( 0.39%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 325,025 ( 0.37%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:>>>::write_event:: + 314,000 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 300,000 ( 0.34%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:>::from [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics] + 300,000 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 280,300 ( 0.32%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::format_scalar_to + 262,500 ( 0.30%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/write.rs:::format_scalar_to + 250,875 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::finish_grow + 250,875 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs:>::reserve::do_reserve_and_handle:: + 250,875 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::finish_grow + 225,975 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs: as core::io::cursor::WriteThroughCursor>::write_all + 225,225 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs:::matches_variant + 225,075 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs: as core::io::cursor::WriteThroughCursor>::write_all + 225,000 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::push_attr + 224,825 ( 0.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs:::format_scalar_to + 200,700 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs:__rustc::__rust_realloc + 200,000 ( 0.23%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 200,000 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::push_attribute::<(&str, &str)> + 200,000 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 192,225 ( 0.22%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::format_scalar_to + 175,700 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::finish_grow + 168,725 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs:::format_scalar_to + 150,525 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>::reserve::do_reserve_and_handle:: + 150,050 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>>>::write_event:: + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-valgrind.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-valgrind.txt new file mode 100644 index 0000000..888b4ff --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-valgrind.txt @@ -0,0 +1,12 @@ +==328692== Callgrind, a call-graph generating cache profiler +==328692== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al. +==328692== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info +==328692== Command: benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics write 1000 25 instructions +==328692== Parent PID: 328685 +==328692== +==328692== For interactive control, run 'callgrind_control -h'. +==328692== +==328692== Events : Ir +==328692== Collected : 88873605 +==328692== +==328692== I refs: 88,873,605 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000.callgrind b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000.callgrind new file mode 100644 index 0000000..e3e75dd --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/control/write-1000.callgrind @@ -0,0 +1,2016 @@ +# callgrind format +version: 1 +creator: callgrind-3.26.0 +pid: 328692 +cmd: benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics write 1000 25 instructions +part: 1 + + +desc: I1 cache: +desc: D1 cache: +desc: LL cache: + +desc: Timerange: Basic block 0 - 32437241 +desc: Trigger: Program termination + +positions: line +events: Ir +summary: 88873605 + + +ob=(1) /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 +fl=(1) ??? +fn=(0) 0x0000000000023340 +cob=(6) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/target/release/xml-diagnostics +cfi=(6) ??? +cfn=(4126) (below main) +calls=1 0 +0 88873605 + +ob=(2) /usr/lib/x86_64-linux-gnu/libc.so.6 +fl=(2) ??? +fn=(4128) (below main) +cfn=(4162) 0x000000000002a580 +calls=1 0 +0 88873605 + +fn=(4508) 0x00000000000b20e0 +0 18350 +cfn=(4952) 0x00000000000b0f70 +calls=721 0 +0 3050 +0 1125 + +fn=(4976) 0x0000000000198400 +0 103400 + +fn=(4488) 0x0000000000197a00 +0 7202000 + +fn=(4952) +0 8275 + +fn=(4232) 0x00000000000b2400 +0 20825 +cfn=(4952) +calls=36 0 +0 775 +0 15950 +cfn=(4952) +calls=749 0 +0 2800 +0 2075 + +fn=(4878) free +0 300 +cfn=(4508) +calls=4021 0 +0 3175 +0 825625 + +fn=(4226) malloc +0 400 +cfn=(4232) +calls=4089 0 +0 10525 +0 650725 + +fn=(4460) 0x00000000000b4180 +0 1182900 +cfn=(4232) +calls=163 0 +0 31900 +0 1675 +cfn=(4502) 0x00000000000b2300 +calls=2112 0 +0 8425 +0 1050 +cfn=(4952) +calls=109 0 +0 1650 +0 1325 +cob=(3) ??? +cfi=(3) ??? +cfn=(4486) 0x0000000004b296a0 +calls=162 0 +0 620850 +0 600 +cfn=(4502) +calls=162 0 +0 13900 +0 200 + +fn=(4162) +cob=(6) +cfi=(6) +cfn=(4176) main +calls=1 0 +0 88873605 + +fn=(4458) realloc +0 2685850 +cfn=(4460) +calls=38275 0 +0 1864475 +0 276925 + +fn=(4502) +0 2100 +cfn=(4508) +calls=2274 0 +0 19350 +0 875 + +ob=(3) +fl=(3) +fn=(4486) +0 200 +cob=(2) +cfi=(2) +cfn=(4488) +calls=209 0 +0 620650 + +ob=(6) +fl=(123) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/writer.rs +fn=(6240) >>>::write_event:: +262 1600400 +fi=(144) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/convert/mod.rs +792 600150 +fe=(123) +264 600150 ++1 375125 ++53 75025 +0 75025 +318 75025 +-31 250000 ++26 50000 +fi=(32) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs +616 50000 +fi=(124) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/cursor.rs +199 50000 +fi=(10) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs +2496 200000 +fi=(124) +136 100000 +fi=(33) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs +3101 75 +fi=(124) +146 75 +fi=(10) +2689 75 +fi=(32) +764 75 +-94 75 +0 50000 +fi=(33) +3101 50000 +fi=(124) +151 150000 +fe=(123) +272 375125 +fi=(41) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs +765 225075 +fi=(124) +205 50000 +fi=(20) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs +970 50000 +fi=(18) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs +664 250000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=72000 0 +* 705300 +fi=(124) +206 100000 +fi=(33) +2224 50000 +fi=(124) +212 100000 +fi=(18) +847 150000 +fi=(23) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs +0 150000 +fi=(18) +847 50000 +fe=(123) +0 75025 +318 75025 +fi=(32) +616 75025 +fi=(124) +199 75025 +fi=(10) +2496 300100 +fi=(124) +136 150050 +fi=(32) +0 75025 +fi=(33) +3101 75025 +fi=(124) +151 225075 ++54 75025 +fi=(18) +664 75025 +fi=(124) +206 150050 +fi=(33) +2224 75025 +fi=(124) +212 75025 +fi=(121) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/io/cursor.rs +508 300100 +cfi=(124) +cfn=(6248) as core::io::cursor::WriteThroughCursor>::write_all +calls=108036 315 +* 3891925 +0 75025 +fi=(27) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs +2177 150050 +fi=(121) +508 300100 +cfi=(124) +cfn=(6248) +calls=108036 315 +* 3976325 +0 75025 +fi=(41) +765 150050 +fi=(18) ++82 300100 +fi=(23) +175 100000 +cfi=(26) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs +cfn=(5684) __rustc::__rust_dealloc +calls=36000 65 +* 850000 +0 75025 +fi=(18) +847 75025 +fi=(41) +-82 400100 +fe=(123) +308 1600400 +fi=(32) +616 75025 +fi=(124) +199 75025 +fi=(10) +2496 300100 +fi=(124) +136 150050 +fi=(33) +3101 25 +fi=(124) +146 25 +fi=(10) +2689 25 +fi=(32) +764 25 +-94 25 +fi=(33) +3101 75025 +fi=(124) +151 225075 ++54 75025 +fi=(18) +664 75025 +fi=(124) +206 150050 +fi=(33) +2224 150050 +fi=(124) +212 75025 +fi=(10) +2496 300100 +fi=(32) +616 75025 +fi=(124) +136 150050 +fi=(32) +0 75025 +fi=(124) +151 225075 +fi=(32) +672 300 +cfn=(5532) >::reserve::do_reserve_and_handle:: +calls=108 -14 +* 660025 +* 175 +cfn=(5532) +calls=36 -14 +* 18650 +* 25 +fi=(124) +205 75025 +fi=(20) +970 75025 +fi=(18) +664 300100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=108036 0 +* 1125375 +fi=(124) +206 150050 +fi=(33) +2224 75025 +fi=(124) +212 75025 +fi=(121) +508 300100 +cfi=(124) +cfn=(6248) +calls=108036 315 +* 3976325 +0 150050 +fi=(18) +847 300100 +fe=(123) + +fl=(6) +fn=(4126) +cob=(2) +cfi=(2) +cfn=(4128) +calls=1 0 +0 88873605 + +fn=(4176) +cfi=(8) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/rt.rs +cfn=(4178) std::rt::lang_start_internal +calls=1 152 +0 88873605 + +fn=(5100) __rustc::__rust_no_alloc_shim_is_unstable_v2 +0 25025 + +fl=(101) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs +fn=(6278) ::push_attribute::<(&str, &str)> +256 175000 +fi=(100) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs ++28 75000 +fi=(32) +611 25000 +fi=(128) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/char/methods.rs +2558 25000 +fi=(40) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs +1440 25000 +fi=(33) +2224 75000 +fi=(144) +781 50000 +cfi=(94) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs +cfn=(6290) >::from +calls=36000 376 +* 2097500 +fe=(101) +261 75000 +cfn=(6300) ::push_attr +calls=36000 +41 +* 5899500 ++1 200000 +fi=(100) ++23 50000 +fi=(47) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs +478 25000 +fi=(32) +0 25000 +461 25000 +0 100000 +cfi=(6) +cfn=(5100) +calls=36000 0 +0 25000 +0 25000 +fi=(23) +130 75000 +cfi=(24) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/control/src/main.rs +cfn=(5102) __rustc::__rust_alloc +calls=36000 -89 +* 950000 +fi=(32) +470 50000 +fi=(36) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/slice.rs +0 25000 +fi=(18) +573 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 375000 +* 50000 +fi=(100) +286 75000 +fi=(32) +672 175000 +cfn=(5532) +calls=36000 -14 +* 5375000 +* 75000 +fe=(101) + +fn=(6300) +302 225000 +fi=(100) +-18 75000 +fi=(33) +1461 50000 +fi=(103) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs +222 50000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +fi=(33) +2981 50000 +0 25000 +fi=(20) +970 25000 +fi=(18) +573 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 450000 +fi=(33) +2986 50000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +-59 25000 +fi=(18) +-38 25000 +fi=(33) +2986 50000 +fi=(100) +0 75000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +fi=(33) +2981 50000 +fi=(20) +970 50000 +fi=(18) +573 50000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 449500 +fi=(33) +2986 50000 +fi=(32) +764 25000 +-94 25000 +fi=(128) +2558 25000 +fi=(40) +1440 25000 +fi=(33) +2224 25000 +fi=(18) +847 75000 +fe=(101) +309 200000 +fi=(32) +672 100000 +cfn=(5532) +calls=36000 -14 +* 3125000 +-56 25000 +fi=(33) +3101 50000 +fe=(101) + +fl=(8) +fn=(4178) +fi=(145) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/function.rs +cfn=(5136) std::rt::lang_start::<()>::{closure#0} +calls=1 206 +287 88873605 +fe=(8) + +fn=(5136) +cfi=(30) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/backtrace.rs +cfn=(5138) std::sys::backtrace::__rust_begin_short_backtrace:: +calls=1 162 +206 88873605 + +fl=(111) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/lib.rs +fn=(6164) polyxml::serialize +39 50 +fi=(120) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/serializer.rs +181 125 +cfn=(6166) ::serialize_with_options +calls=36 +3 +* 88868600 +* 25 +fe=(111) +46 75 + +fl=(120) +fn=(6166) +184 350 +cfi=(6) +cfn=(5100) +calls=36 0 +* 25 +fi=(23) +-54 75 +cfi=(24) +cfn=(5102) +calls=36 -89 +* 11950 +fi=(32) +470 50 +fi=(121) +102 100 +fe=(120) ++91 50 +fi=(41) +0 25 +743 25 +0 25 +fi=(123) +124 75 +fe=(120) ++74 50 +0 50 +200 75 +cfn=(6176) ::build +calls=36 23 +* 7000 +fi=(41) +743 75 +0 25 +743 75 +0 50 +fe=(120) +203 225 +cfn=(6204) ::write_model::<&mut core::io::cursor::Cursor>> +calls=36 +82 +* 88847675 +* 25 +fi=(27) +2177 50 +fe=(120) +213 125 +fi=(18) +847 125 +fe=(120) +214 225 + +fn=(6222) ::validate_lexical_list_items +243 600200 ++1 525100 ++16 75 +fi=(33) +1865 25 +fi=(14) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs +1663 25 +fi=(50) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs +180 25 +0 125 +fe=(120) +262 100 +cfn=(6223) ::validate_lexical_list_items'2 +calls=36 -19 +* 525 +* 99900 +cfn=(6223) +calls=35964 -19 +* 524475 +fi=(27) +2177 50000 +fi=(14) +627 25000 +1663 25000 +fi=(50) +180 25000 +fe=(120) ++85 75025 ++1 525175 + +fn=(6223) +243 200000 ++1 100000 ++16 25000 ++5 25000 ++1 175000 + +fn=(6316) ::validate_scalar +268 200000 ++10 50000 +-9 150000 ++9 200000 +-9 350000 ++13 50000 ++1 150000 + +fn=(6176) +23 250 +fi=(33) +462 100 +fe=(120) +28 50 +cfn=(6178) ::collect_namespaces +calls=36 +60 +* 6150 +fi=(33) +3126 25 +fe=(120) +30 25 +fi=(41) +709 50 +fe=(120) +0 25 +31 25 +fi=(32) +425 50 +631 25 +fe=(120) +86 225 + +fn=(6204) +285 250 ++9 125 +0 50 +307 75 +0 25 +fi=(14) +454 25 +fi=(59) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs +2454 75 +fe=(120) +308 75 +cfi=(45) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/schema.rs +cfn=(6206) ::matches_variant +calls=36 182 +* 950 +* 50 +fi=(50) +0 50 +fi=(33) +1865 25 +fi=(14) +1663 50 +fi=(50) +180 25 +0 450 +fi=(32) +611 25 +fi=(33) +1865 50 +fe=(120) +328 50 +fi=(44) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs +184 50 ++2 50 +fi=(41) +743 25 +0 50 +fi=(45) +669 50 +fe=(120) +338 100 +cfn=(6222) +calls=36 -95 +* 750775 +fi=(27) +2177 75 +fi=(118) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs +0 50 +fi=(14) +1663 25 +fi=(50) +180 25 +fi=(41) +634 50 +fe=(120) +342 25 +fi=(23) +0 75 +fe=(120) +390 25 +cfi=(38) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs +cfn=(5182) core::str::converts::from_utf8 +calls=36 89 +* 2600 +fi=(27) +0 50 +2177 50 +fi=(111) +0 25 +fe=(120) +391 50 ++3 75 +fi=(101) +124 100 +0 25 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 500 +fi=(14) +1663 25 +fi=(50) +180 25 +fe=(120) +415 125 ++33 50 ++21 200 +cfi=(123) +cfn=(6240) +calls=36 262 +* 4400 +* 25 +0 25 +fi=(27) +965 50 +fi=(111) +0 25 +fe=(120) +473 50 ++30 50 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 475 +fe=(120) +597 125 +328 50 +fi=(44) +184 50 ++2 50 +fi=(41) +743 50 +0 50 +fi=(131) /home/bailey/github/polyxml-perf-control/crates/polyxml-core/src/value.rs +59 25 +fe=(120) +599 25 +fi=(41) +743 75 +fi=(27) +0 25 +fi=(41) +743 50 +fe=(120) +605 225 +0 25 +637 50 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 25075 +fi=(14) +1663 25000 +fi=(50) +180 25000 +fi=(28) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/boxed.rs +2415 25000 +fe=(120) +639 175000 +fi=(41) +743 50000 +fi=(14) +454 25000 +fi=(41) +743 50000 +fi=(23) +0 25000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fi=(59) +2454 25000 +fe=(120) +695 200000 +cfn=(6205) ::write_model::<&mut core::io::cursor::Cursor>>'2 +calls=36000 285 +* 87303975 +* 25000 +fi=(27) +2177 50000 +fe=(120) +0 25 +fi=(41) +743 25 +fi=(118) +0 50 +fi=(14) +1663 25 +fi=(50) +180 25 +fi=(100) +350 50 +fe=(120) +737 175 +cfi=(123) +cfn=(6240) +calls=36 262 +* 3800 +fi=(27) +965 50 +fe=(120) +741 200 +0 25 +740 25 ++1 25 +fi=(18) +847 50 +fi=(23) +0 25 +fi=(18) +847 75 +fe=(120) + +fn=(6205) +285 250000 ++9 125000 +0 50000 +307 75000 +0 25000 +fi=(14) +454 25000 +fi=(59) +2454 75000 +fe=(120) +308 75000 +cfi=(45) +cfn=(6206) +calls=36000 182 +* 950000 +* 50000 +fi=(50) +0 50000 +fi=(33) +1865 25000 +fi=(14) +1663 50000 +fi=(50) +180 25000 +0 450000 +fi=(32) +611 75000 +fi=(33) +1865 150000 +fe=(120) +328 150000 +fi=(44) +184 150000 ++2 150000 +fi=(41) +743 75000 +0 150000 +fi=(45) +669 150000 +fe=(120) +338 300000 +cfn=(6222) +calls=108000 -95 +* 1725000 +fi=(27) +2177 225000 +fi=(118) +0 150000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +fi=(41) +634 50000 +fe=(120) +342 25000 +fi=(23) +0 75000 +fe=(120) +390 25000 +cfi=(38) +cfn=(5182) +calls=36000 89 +* 1475000 +fi=(27) +0 50000 +2177 50000 +fi=(111) +0 25000 +fe=(120) +391 50000 ++3 75000 +fi=(101) +124 100000 +0 25000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 550000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 100000 +fi=(14) +1663 50000 +fi=(50) +180 50000 +fe=(120) +415 375000 +0 25000 +328 50000 +fi=(44) +184 50000 ++2 50000 +fi=(41) +743 50000 +0 50000 +fi=(131) +59 25000 +fe=(120) +417 25000 +0 25000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fe=(120) +418 50000 +cfi=(38) +cfn=(5182) +calls=36000 89 +* 1225000 +fi=(27) +0 50000 +2177 50000 +0 25000 +fe=(120) +391 25000 ++28 25000 ++3 75000 +-3 25000 +0 25000 +424 100000 ++1 100000 +cfn=(6266) ::format_scalar_to +calls=36000 216 +* 2805750 +* 125000 +278 25000 +-9 100000 +426 50000 +278 150000 +-9 75000 +fi=(100) ++81 25000 +fe=(120) ++77 175000 +cfi=(101) +cfn=(6278) +calls=36000 256 +* 16322000 +fi=(18) +847 125000 +fe=(120) +269 125000 +448 50000 ++21 200000 +cfi=(123) +cfn=(6240) +calls=36000 262 +* 5319400 +* 25000 +0 25000 +fi=(27) +965 50000 +fi=(111) +0 25000 +fe=(120) +473 50000 ++30 50000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 475000 +fe=(120) +597 375000 +328 100000 +fi=(44) +184 100000 ++2 100000 +fi=(41) +743 100000 +0 100000 +fi=(131) +59 50000 +fe=(120) +599 50000 +fi=(41) +743 150000 +fi=(27) +0 50000 +fi=(41) +743 100000 +fe=(120) +605 450000 +fi=(41) +0 100000 +fe=(120) +607 200000 ++1 200000 +cfn=(6266) +calls=72000 216 +* 8087575 +* 150000 +0 100000 +608 100000 +fi=(32) ++3 50000 +fi=(33) +1865 50000 +fe=(120) +609 250000 +cfn=(6316) +calls=72000 268 +* 1150000 +fi=(27) +2177 100000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(120) +610 100000 +cfi=(38) +cfn=(5182) +calls=72000 89 +* 3075000 +fi=(27) +0 100000 +2177 100000 +0 50000 +fe=(120) +391 50000 +611 50000 +0 50000 +fi=(41) +743 50000 +fi=(33) +0 50000 +fe=(120) +614 150000 ++4 400000 +cfi=(123) +cfn=(6240) +calls=72000 262 +* 8821225 +fi=(27) +965 100000 +fi=(107) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs +108 200000 +cfn=(6320) quick_xml::escape::_escape::::{closure#0}, &str> +calls=72000 +93 +* 5613050 +fi=(101) +564 250000 +fe=(120) ++61 200000 +cfi=(123) +cfn=(6240) +calls=72000 262 +* 4466075 +fi=(27) +965 100000 +fe=(120) +630 350000 +cfi=(123) +cfn=(6240) +calls=72000 262 +* 7618900 +fi=(27) +965 100000 +fe=(120) +634 50000 +fi=(18) +847 100000 +fi=(23) +0 50000 +fi=(18) +847 100000 +fi=(118) +0 150000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +fi=(100) +350 50000 +fe=(120) +737 175000 +cfi=(123) +cfn=(6240) +calls=36000 262 +* 3800000 +fi=(27) +965 50000 +fe=(120) +741 200000 +0 25000 +740 25000 ++1 25000 +fi=(18) +847 50000 +fi=(23) +0 25000 +fi=(18) +847 75000 +fe=(120) + +fn=(6266) +216 600000 ++4 300000 +0 75000 +220 225000 ++7 25000 +fi=(146) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/f64.rs +1264 25000 +886 100000 +fi=(115) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs +1037 50000 +fi=(32) +611 50000 +fe=(120) +223 25000 +fi=(19) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs +2144 25000 +fi=(147) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/api.rs +50 25000 +fi=(125) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/jeaiii.rs +310 50000 ++2 50000 +118 22500 ++2 45000 ++1 45000 +fi=(126) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs +-60 22500 +fi=(125) ++16 22500 +-39 45000 ++76 67500 +fi=(44) +219 22500 +fi=(125) +68 22500 ++20 22500 ++1 22500 +-21 22500 ++21 45000 +314 22500 +0 125000 +fi=(130) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/bit.rs +178 50000 +fi=(19) +2105 25000 +fi=(127) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/write.rs +121 25000 +fi=(10) +0 25000 +fi=(129) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/algorithm.rs +292 50025 +0 50 +fi=(130) +282 50 +fi=(10) +154 25 +fi=(148) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/decimal.rs +32 50 +fi=(44) +186 25 +fi=(19) +2150 25 +fi=(148) +108 25 +fi=(129) +-54 25 +fi=(149) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/shared.rs +181 100 +fi=(130) +282 49950 +fi=(10) +154 24975 +fi=(148) +32 49950 +fi=(44) +186 24975 +fi=(19) +2150 24975 +fi=(148) +108 24975 +fi=(129) +-54 24975 +fi=(149) +181 99900 +fi=(125) +0 25000 +fi=(149) +186 50000 +fi=(129) +53 50000 +fi=(125) +310 50000 ++2 24500 +118 9375 ++2 18750 ++1 28125 +fi=(126) +-60 3350 +fi=(125) ++16 3350 +-39 6700 ++76 10050 +fi=(44) +219 3350 +fi=(125) +68 3350 ++20 3350 ++1 3350 +-21 3350 ++21 6700 +fi=(129) +225 3350 ++3 9500 +fi=(44) +0 99900 +fi=(129) +352 24975 +0 49950 +fi=(130) +178 24975 +fi=(115) +1057 74925 +fi=(19) +2105 24975 +fi=(115) +1057 99900 +fi=(150) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/int_macros.rs +2261 24975 +fi=(129) +875 24975 +456 49950 +fi=(44) +219 24975 +fi=(150) +2261 24975 +fi=(44) +219 49950 +fi=(151) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/index.rs +13 24975 +fi=(129) +883 24975 +457 24975 +1381 149850 +fi=(151) +13 24975 +fi=(129) +461 49950 ++12 74925 +836 99900 +-6 74925 ++7 49950 +-7 99900 +968 24975 +fi=(10) +2728 24975 +fi=(129) +484 24975 ++13 49950 +-51 49950 ++54 24975 +fi=(125) +314 5000 +fi=(44) +-95 2250 +fi=(125) +68 2250 ++20 4500 +fi=(23) +-88 12750 +fi=(125) +319 38250 ++2 25500 +fi=(126) +61 250 +fi=(125) ++16 500 +314 250 +0 4500 +314 8625 +fi=(44) +-95 2350 +fi=(125) +68 4700 ++20 2350 ++1 4700 +fi=(129) +225 2350 ++3 7000 +fi=(44) +-9 6025 +fi=(125) +68 12050 ++20 6025 ++1 6025 +-51 12050 ++76 18075 +-46 6025 ++20 6025 ++1 6025 +-21 6025 ++21 12050 +fi=(129) +225 6025 ++3 12675 +fi=(125) ++98 25500 +fi=(126) +61 525 +fi=(125) ++16 525 +fi=(129) +225 1575 +0 24975 +1398 74925 +535 24975 +1404 149850 ++2 99900 +0 24975 +fi=(10) +2728 24975 +fi=(129) +1088 24975 +1412 74925 +0 36050 +fi=(10) +2728 36050 +fi=(129) +1088 36050 +1412 108150 +fi=(10) +2728 24975 +fi=(129) +1088 24975 +1421 124875 +-32 49950 +fi=(125) +328 38250 +118 12750 ++2 25500 ++1 25500 +fi=(126) +-60 10250 +fi=(125) ++16 10250 +-39 30750 ++76 30750 +fi=(44) +219 10250 +fi=(125) +68 10250 ++20 10250 ++1 10250 +-21 10250 ++21 10250 +-51 10250 ++76 30750 +-46 10250 ++20 10250 ++1 10250 +-21 10250 ++21 20500 +fi=(129) +225 10250 ++3 20500 ++19 37500 +fi=(44) +102 18750 +fi=(34) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/range.rs +1142 37500 +0 18750 +1142 18750 +fi=(19) +2144 18750 +0 18750 +2144 18750 +fi=(129) +251 56250 +fi=(34) +1142 18750 +fi=(19) +2144 12500 +fi=(129) +251 37500 +fi=(34) +1142 12500 +fi=(129) +248 18750 ++7 18750 +fi=(127) +154 18750 +fi=(10) +1092 18750 +fi=(44) +219 2500 +fi=(125) +68 5000 ++20 2500 ++1 2500 +-51 7500 ++76 7500 +-46 2500 ++20 2500 ++1 2500 +-21 2500 ++21 2500 +-51 2500 ++76 7500 +-46 2500 ++20 2500 ++1 2500 +-21 2500 ++21 5000 +fi=(129) +225 2500 ++3 5000 +fi=(10) +1096 12500 +fi=(44) +102 12500 +fi=(152) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/specialize.rs +-68 18750 +cob=(2) +cfi=(2) +cfn=(4976) +calls=9000 -34 +* 103400 +fi=(129) +236 6250 ++3 6250 +fi=(127) +-85 12500 +0 31250 +cfi=(38) +cfn=(5182) +calls=9000 89 +0 403500 +0 175000 +cfi=(38) +cfn=(5182) +calls=63000 89 +0 2609250 +fi=(27) +714 100000 ++1 50000 +fe=(120) +0 100000 +241 400000 +0 50000 +241 200000 + +fn=(6178) +88 225 ++1 100 +fi=(33) +-89 25 +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 150 +180 25 +fi=(14) +454 25 +fi=(59) +2454 50 +fe=(120) +0 25 +cfn=(6179) ::collect_namespaces'2 +calls=36 88 +0 3225 +0 25 +fi=(14) +1663 25 +fi=(50) +180 25 +fe=(120) +-85 50 ++5 225 +fi=(28) +2415 25 +fe=(120) +103 75 +fi=(14) +454 25 +fe=(120) +103 25 +0 25 +110 50 +0 50 +126 25 +cfi=(45) +cfn=(6188) ::variants +calls=36 +17 +* 1200 +fi=(33) +3101 25 ++25 50 +fe=(120) +127 25 +fi=(32) +425 50 +631 25 +fe=(120) +135 200 + +fn=(6179) +88 225 ++1 100 +fi=(33) +-89 25 +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 150 +180 25 +fe=(120) +0 75 +fi=(14) +1663 75 +fi=(50) +180 75 +fe=(120) +-85 150 ++5 525 +0 25 +110 50 +0 50 +126 25 +cfi=(45) +cfn=(6188) +calls=36 +17 +* 1200 +fi=(33) +3101 25 ++25 50 +fe=(120) +127 25 +fi=(32) +425 50 +631 25 +fe=(120) +135 200 + +fl=(45) +fn=(6188) +143 350 +fi=(14) +454 50 +fi=(59) +2454 50 +fi=(13) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs +3994 50 +fi=(97) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs +54 100 ++45 50 +fi=(13) +4149 50 +fi=(97) +97 50 +fi=(13) +3994 50 +fi=(33) +1865 50 +fi=(10) +3212 350 +fi=(47) +478 100 +fi=(32) +-17 100 +fi=(122) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/take.rs +0 50 +fi=(36) +440 200 +fi=(13) +4049 50 +fi=(97) +111 50 ++7 200 +fe=(45) ++30 450 + +fn=(6206) +182 200200 +fi=(14) +454 25025 +fi=(13) +3994 25025 +fi=(97) +54 50050 ++45 25025 +fi=(13) +4149 25025 +fi=(97) +97 25025 +fi=(13) +3994 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +fi=(50) +180 25025 +0 75075 +fi=(13) +4049 25025 +fi=(97) +111 25025 ++7 100100 +fe=(45) ++73 225225 + +fl=(30) +fn=(5138) +fi=(145) +cfi=(24) +cfn=(5140) xml_diagnostics::main +calls=1 43 +250 88873605 +fe=(30) + +fl=(107) +fn=(6292) quick_xml::escape::_escape::::{closure#0}, &str> +201 225000 ++3 50000 +fi=(20) +970 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 225000 +fi=(14) +1663 144500 +fi=(50) +385 72250 +fi=(14) +1663 144500 +fi=(50) +379 144500 +fe=(107) +169 72250 +0 144500 +218 75000 ++7 125000 ++2 225000 + +fn=(6320) +201 500000 ++3 50000 +fi=(14) +1663 50000 +fi=(50) +180 50000 +0 250000 +180 250000 +0 150000 +fi=(14) +1663 675100 +fi=(50) +385 337550 +fi=(14) +1663 337550 +fi=(50) +180 337550 +379 675100 +fe=(107) +109 337550 +0 712650 +218 250000 ++7 200000 ++2 450000 + +fl=(124) +fn=(6248) +315 1800600 +fi=(32) +616 225075 +fe=(124) +199 225075 +fi=(10) +2496 900300 +fe=(124) +136 450150 +fi=(33) +3101 75 +fe=(124) +146 75 +fi=(10) +2689 75 +fi=(32) +764 75 +-94 75 +fi=(33) +3101 225000 +fe=(124) +151 675000 +fi=(32) +672 600 +cfn=(5532) +calls=108 -14 +* 39500 +* 150 +fi=(33) +3101 75 +fe=(124) +151 225 ++54 225075 +fi=(20) +970 225075 +fi=(18) +664 450150 +cob=(2) +cfi=(2) +cfn=(4488) +calls=324108 0 +* 3476175 +fe=(124) +206 450150 +fi=(33) +2224 225075 +fe=(124) +212 225075 +319 2025675 + +fl=(32) +fn=(5532) +658 100700 +512 50350 +fi=(10) +938 25175 +fi=(47) +478 25175 +0 25175 +fe=(32) +523 50350 +fi=(19) +1051 50350 +fe=(32) +159 176225 +fi=(19) +1051 75525 +fe=(32) +529 100700 +cfn=(5230) ::finish_grow +calls=36258 +15 +* 5186875 +fi=(27) +2177 50350 ++1 25175 +fe=(32) +773 25175 ++1 25175 +668 100700 +-10 75000 +fi=(10) +938 25000 +fi=(47) +478 25000 +0 25000 +fe=(32) +523 50000 +fi=(19) +1051 125000 +fe=(32) +529 175000 +cfn=(5230) +calls=36004 +15 +* 2400000 +fi=(27) +2177 50000 ++1 25000 +fe=(32) +773 25000 ++1 25000 +668 100000 + +fn=(5230) +544 201400 +fi=(10) +3212 201400 +fi=(47) +478 75525 +0 25175 +fe=(32) +631 25175 +fi=(10) +1401 25175 +fi=(23) +228 125875 +cfi=(24) +cfn=(5540) __rustc::__rust_realloc +calls=36276 41 +* 4179875 +fi=(27) +965 50350 ++1 75525 +fe=(32) +0 50350 +564 151050 +-20 200000 +fi=(10) +3212 200000 +fi=(47) +478 75000 +fe=(32) +631 50000 +fi=(10) +1401 25000 +fi=(23) +228 125000 +cfi=(24) +cfn=(5540) +calls=36002 41 +* 1400000 +fi=(27) +965 50000 ++1 75000 +fe=(32) +0 50000 +564 150000 + +fl=(26) +fn=(5684) +65 25000 +cob=(2) +cfi=(2) +cfn=(4878) +calls=42043 -65 +* 825000 + +fl=(94) +fn=(6290) +376 75000 ++2 50000 ++1 50000 +fi=(107) +168 50000 +cfn=(6292) +calls=36000 +33 +* 1722500 +* 25000 +fe=(94) +377 25000 ++4 100000 + +fl=(24) +fn=(5102) +41 25025 +fi=(13) +3994 25025 +762 25025 +fe=(24) +16 25025 +fi=(25) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs +161 100100 +fi=(26) +30 50050 ++1 50050 +cob=(2) +cfi=(2) +cfn=(4226) +calls=46080 -31 +* 661650 +fe=(24) + +fn=(5540) +41 50175 +fi=(13) +3994 50175 +762 50175 +fe=(24) +33 50175 +fi=(89) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs +-33 250875 +405 100350 +fi=(26) +70 100350 ++1 100350 +cob=(2) +cfi=(2) +cfn=(4458) +calls=72278 -71 +* 4827250 +fe=(24) + +fn=(6446) measured_region +79 9 +fi=(19) +2144 1 +fi=(34) +1100 1 +0 8 +fi=(26) +0 3 +fi=(19) +2144 25 +fi=(34) +1100 25 +fi=(133) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hint.rs +491 50 +fe=(24) +91 175 +cfi=(111) +cfn=(6164) +calls=25 -52 +* 88868875 +fi=(27) +1230 50 ++1 100 +fi=(133) +491 50 +fi=(32) +631 50 +425 25 +fi=(26) +65 25 +cob=(2) +cfi=(2) +cfn=(4878) +calls=25 -65 +* 4100 +* 25 +fe=(24) ++29 8 + +fn=(5140) +cfn=(6446) +calls=1 79 +70 88873605 + +fl=(38) +fn=(5182) +89 750125 +fi=(39) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs ++44 450075 ++12 300050 +0 1050175 +145 250 ++19 150150 ++1 300300 +fi=(10) +2689 300300 +3875 150150 +fi=(39) +222 150150 ++23 250 +-21 300050 ++17 300050 +0 150025 +241 1175200 ++1 587600 +-1 1325225 +fe=(38) +94 600100 +-94 150025 +98 600100 + +totals: 88873605 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-Cargo.toml b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-Cargo.toml new file mode 100644 index 0000000..7afbad6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-Cargo.toml @@ -0,0 +1,9 @@ +[package] +name="xml-diagnostics" +version="0.0.0" +edition="2021" +[workspace] +[dependencies] +polyxml={path="/home/bailey/github/PolyXML/crates/polyxml-core"} +[profile.release] +debug=1 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-allocations.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-allocations.txt new file mode 100644 index 0000000..cae34e6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-allocations.txt @@ -0,0 +1,12 @@ +memcap: <=7798 MiB (60% of 12996 MiB available) [systemd MemoryMax, swap off] +operation=read,count=0,iterations=1,allocations=12,reallocations=5,requested_bytes=11093,input_bytes=94,output_bytes=94,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7811 MiB (60% of 13019 MiB available) [systemd MemoryMax, swap off] +operation=write,count=0,iterations=1,allocations=2,reallocations=2,requested_bytes=554,input_bytes=94,output_bytes=94,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7811 MiB (60% of 13019 MiB available) [systemd MemoryMax, swap off] +operation=read,count=1000,iterations=1,allocations=5010,reallocations=1014,requested_bytes=717402,input_bytes=63911,output_bytes=63411,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7811 MiB (60% of 13018 MiB available) [systemd MemoryMax, swap off] +operation=write,count=1000,iterations=1,allocations=1001,reallocations=2007,requested_bytes=158560,input_bytes=63911,output_bytes=63411,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7811 MiB (60% of 13018 MiB available) [systemd MemoryMax, swap off] +operation=read,count=10000,iterations=1,allocations=50010,reallocations=10019,requested_bytes=7774738,input_bytes=668911,output_bytes=663911,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7814 MiB (60% of 13023 MiB available) [systemd MemoryMax, swap off] +operation=write,count=10000,iterations=1,allocations=10001,reallocations=20011,requested_bytes=2376640,input_bytes=668911,output_bytes=663911,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-build.txt new file mode 100644 index 0000000..70acba9 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-build.txt @@ -0,0 +1,37 @@ +memcap: <=7873 MiB (60% of 13123 MiB available) [systemd MemoryMax, swap off] + Compiling proc-macro2 v1.0.107 + Compiling unicode-ident v1.0.26 + Compiling quote v1.0.47 + Compiling syn v3.0.6 + Compiling serde_core v1.0.229 + Compiling lexical-util v1.0.7 + Compiling memchr v2.8.3 + Compiling serde v1.0.229 + Compiling serde_derive v1.0.229 + Compiling zmij v1.0.23 + Compiling siphasher v1.0.4 + Compiling phf_shared v0.14.0 + Compiling aho-corasick v1.1.5 + Compiling lexical-write-integer v1.0.6 + Compiling lexical-parse-integer v1.0.6 + Compiling fastrand v2.5.0 + Compiling serde_json v1.0.151 + Compiling thiserror v2.0.21 + Compiling regex-syntax v0.8.11 + Compiling regex-automata v0.4.18 + Compiling phf_generator v0.14.0 + Compiling lexical-parse-float v1.0.6 + Compiling lexical-write-float v1.0.6 + Compiling thiserror-impl v2.0.21 + Compiling itoa v1.0.18 + Compiling memo-map v0.3.4 + Compiling minijinja v2.24.0 + Compiling lexical-core v1.0.6 + Compiling phf_codegen v0.14.0 + Compiling regex v1.13.1 + Compiling quick-xml v0.42.0 + Compiling smallvec v1.16.2 + Compiling heck v0.5.0 + Compiling polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling xml-diagnostics v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate) + Finished `release` profile [optimized + debuginfo] target(s) in 1m 11s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-fixtures.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-fixtures.rs new file mode 100644 index 0000000..f231439 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-fixtures.rs @@ -0,0 +1,85 @@ +use std::hint::black_box; + +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize}; +use std::sync::Arc; + +fn build_sensor_fixture() -> (Arc, Vec) { + let schema = ModelSchema::builder("Sensor") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "temp", + b"temp", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .field(FieldSchema::new( + "status", + b"status", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "active", + b"active", + FieldKind::Element, + ValueType::Scalar(ScalarType::Bool), + )) + .build(); + + let xml = br#"23.75OPERATIONALtrue"#.to_vec(); + (schema, xml) +} + +fn build_catalog_fixture(count: usize) -> (Arc, Vec) { + let item_schema = ModelSchema::builder("Item") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "name", + b"name", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "price", + b"price", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .build(); + + let catalog_schema = ModelSchema::builder("Catalog") + .field(FieldSchema::new( + "items", + b"item", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Nested(item_schema))), + )) + .build(); + + let mut xml = String::with_capacity(count * 64 + 32); + xml.push_str(""); + for i in 0..count { + use std::fmt::Write; + write!( + xml, + r#"Part-{i}{:.2}"#, + (i as f64) * 1.25 + ) + .unwrap(); + } + xml.push_str(""); + + (catalog_schema, xml.into_bytes()) +} + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-harness.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-harness.rs new file mode 100644 index 0000000..1fbe95d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-harness.rs @@ -0,0 +1,94 @@ +// Fixture definitions are extracted verbatim from core_benchmarks.rs by run.py. +include!("fixtures.rs"); + +use std::alloc::{GlobalAlloc, Layout, System}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; + +struct CountingAllocator; +static COUNTING: AtomicBool = AtomicBool::new(false); +static ALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static REALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static BYTES: AtomicUsize = AtomicUsize::new(0); + +// Diagnostic instrumentation only. The benchmark consumers use System directly. +unsafe impl GlobalAlloc for CountingAllocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc(layout) } + } + unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc_zeroed(layout) } + } + unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { + unsafe { System.dealloc(ptr, layout) } + } + unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + REALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(new_size, Ordering::Relaxed); + } + unsafe { System.realloc(ptr, layout, new_size) } + } +} +#[global_allocator] +static ALLOCATOR: CountingAllocator = CountingAllocator; + +fn main() { + let args: Vec = std::env::args().collect(); + let operation = args.get(1).expect("read or write"); + let count: usize = args + .get(2) + .expect("0 for sensor, or catalog count") + .parse() + .unwrap(); + let iterations: usize = args.get(3).expect("iteration count").parse().unwrap(); + let mode = args.get(4).map(String::as_str).unwrap_or("allocations"); + let (schema, xml) = if count == 0 { + build_sensor_fixture() + } else { + build_catalog_fixture(count) + }; + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let root = if count == 0 { "Sensor" } else { "Catalog" }; + let output = serialize(root, &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + for _ in 0..10 { + if operation == "read" { + black_box(deserialize(&xml, Arc::clone(&schema)).unwrap()); + } else { + black_box(serialize(root, &value, &schema, None).unwrap()); + } + } + COUNTING.store(mode == "allocations", Ordering::Relaxed); + measured_region(operation, iterations, &xml, &value, root, &schema); + COUNTING.store(false, Ordering::Relaxed); + println!("operation={operation},count={count},iterations={iterations},allocations={},reallocations={},requested_bytes={},input_bytes={},output_bytes={},field_schema_bytes={},scalar_type_bytes={},value_type_bytes={},poly_value_bytes={}", + ALLOCATIONS.load(Ordering::Relaxed), REALLOCATIONS.load(Ordering::Relaxed), BYTES.load(Ordering::Relaxed), xml.len(), output.len(), + std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::()); +} + +#[inline(never)] +#[no_mangle] +fn measured_region( + operation: &str, + iterations: usize, + xml: &[u8], + value: &polyxml::PolyValue, + root: &str, + schema: &Arc, +) { + for _ in 0..iterations { + if operation == "read" { + black_box(deserialize(black_box(xml), Arc::clone(schema)).unwrap()); + } else { + black_box(serialize(root, black_box(value), schema, None).unwrap()); + } + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-metadata.json new file mode 100644 index 0000000..6a293cc --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate-metadata.json @@ -0,0 +1,8 @@ +{ + "revision": "ac485e0421cadd8781e044e1f658932a532b0438", + "core_status": "", + "os": "Linux-6.18.40.1-microsoft-standard-WSL2-x86_64-with-glibc2.43", + "rustc": "rustc 1.99.0 (b940084d7 2026-09-28)\nbinary: rustc\ncommit-hash: b940084d7eb6a299eb4bfeb8e34901bc051e7ac4\ncommit-date: 2026-09-28\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.0\nLLVM version: 23.1.1\n", + "executable": "/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics", + "profile": "release debug=1; allocation instrumentation; not used for latency numbers" +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate.lock new file mode 100644 index 0000000..1614ee2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/candidate.lock @@ -0,0 +1,317 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "xml-diagnostics" +version = "0.0.0" +dependencies = [ + "polyxml", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000-annotated.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000-annotated.txt new file mode 100644 index 0000000..2b70f52 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000-annotated.txt @@ -0,0 +1,209 @@ +-------------------------------------------------------------------------------- +Profile data file 'benchmarks/rust-runtime-investigation/target/evidence/candidate/read-1000.callgrind' (creator: callgrind-3.26.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 89728348 +Trigger: Program termination +Profiled target: benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics read 1000 25 instructions (PID 373371, part 1) +Events recorded: Ir +Events shown: Ir +Event sort order: Ir +Thresholds: 95 +Include dirs: +User annotated: +Auto-annotation: off + +-------------------------------------------------------------------------------- +Ir +-------------------------------------------------------------------------------- +296,585,254 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir file:function +-------------------------------------------------------------------------------- +21,680,675 ( 7.31%) ???:0x0000000000197a00 [/usr/lib/x86_64-linux-gnu/libc.so.6] +13,926,225 ( 4.70%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs:core::str::converts::from_utf8 +11,858,578 ( 4.00%) ???:0x00000000000b2400 [/usr/lib/x86_64-linux-gnu/libc.so.6] +10,868,100 ( 3.66%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::next [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] +10,352,875 ( 3.49%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 9,477,175 ( 3.20%) crates/polyxml-core/src/parser.rs:::parse_sub_tree::<&[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 8,900,000 ( 3.00%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs: as core::hash::Hasher>::write [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 7,805,073 ( 2.63%) ???:0x00000000000b20e0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 6,602,200 ( 2.23%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 6,401,100 ( 2.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::next [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 5,426,700 ( 1.83%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/parser/element.rs:::feed [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 5,127,950 ( 1.73%) ???:free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 4,625,000 ( 1.56%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs:::hash_one::<&[u8]> + 4,403,350 ( 1.48%) ???:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 4,058,539 ( 1.37%) ???:0x00000000001972a0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 3,650,000 ( 1.23%) crates/polyxml-core/src/converters.rs:::parse_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 3,275,600 ( 1.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 3,150,700 ( 1.06%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs:core::str::converts::from_utf8 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 3,001,875 ( 1.01%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 3,000,000 ( 1.01%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::hash_one::<&[u8]> + 2,825,000 ( 0.95%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::find:: + 2,801,425 ( 0.94%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::parse_sub_tree::<&[u8]> + 2,625,750 ( 0.89%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 2,550,000 ( 0.86%) crates/polyxml-core/src/parser.rs:polyxml::parser::is_nil_element [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 2,475,825 ( 0.83%) crates/polyxml-core/src/parser.rs:polyxml::parser::namespace_scope [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 2,475,550 ( 0.83%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::parse_sub_tree::<&[u8]> + 2,414,886 ( 0.81%) ???:0x00000000000b0f70 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,375,000 ( 0.80%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::hash_one::<&[u8]> + 2,325,000 ( 0.78%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::check_for_duplicates [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 2,200,000 ( 0.74%) /rust/deps/hashbrown-0.17.1/src/raw.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 2,175,000 ( 0.73%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::next + 2,076,050 ( 0.70%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::emit_start + 2,025,675 ( 0.68%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_end [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 2,025,675 ( 0.68%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_start [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 2,001,075 ( 0.67%) crates/polyxml-core/src/parser.rs:::parse_attributes [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 1,950,800 ( 0.66%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 1,948,250 ( 0.66%) ???:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,900,350 ( 0.64%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::next + 1,800,000 ( 0.61%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::find:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 1,583,400 ( 0.53%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/parse.rs:::parse_scalar + 1,525,000 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::parse_sub_tree::<&[u8]> + 1,500,150 ( 0.51%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 1,500,000 ( 0.51%) /rust/deps/hashbrown-0.17.1/src/map.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 1,500,000 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/mod.rs:::hash_one::<&[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 1,489,425 ( 0.50%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 1,465,250 ( 0.49%) ???:0x00000000000b4180 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,366,800 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::next + 1,357,775 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::finish_grow [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 1,350,275 ( 0.46%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 1,350,000 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>>::grow_one [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 1,275,425 ( 0.43%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs:::emit_end + 1,226,475 ( 0.41%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::finish + 1,225,425 ( 0.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:; 8]>>::from_elem + 1,200,400 ( 0.40%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 1,200,000 ( 0.40%) crates/polyxml-core/src/parser.rs:polyxml::parser::record_content_token [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 1,199,850 ( 0.40%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 1,151,775 ( 0.39%) crates/polyxml-core/src/parser.rs:::finish [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 1,150,300 ( 0.39%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:::feed + 1,075,300 ( 0.36%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 1,050,400 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 1,050,300 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:::feed + 1,050,300 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::emit_end + 1,050,150 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::parse_sub_tree::<&[u8]> + 1,000,000 ( 0.34%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs:::parse_sub_tree::<&[u8]> + 975,000 ( 0.33%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 950,100 ( 0.32%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::next + 900,750 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::parse_sub_tree::<&[u8]> + 900,525 ( 0.30%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 900,300 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 900,275 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::emit_end + 900,100 ( 0.30%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 897,350 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::parse_scalar + 850,150 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 850,000 ( 0.29%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs:::local_name [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 850,000 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::parse_sub_tree::<&[u8]> + 850,000 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::local_name + 800,575 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::emit_start + 800,250 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 800,100 ( 0.27%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:::parse_sub_tree::<&[u8]> + 800,000 ( 0.27%) crates/polyxml-core/src/parser.rs:::new [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 775,475 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::finish + 775,000 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::try_allocate_in [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 750,250 ( 0.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 750,250 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::emit_start + 750,000 ( 0.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::next + 750,000 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs: as core::hash::Hasher>::write + 750,000 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/hash/random.rs:::hash_one::<&[u8]> + 700,700 ( 0.24%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:; 8]>>::from_elem [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 700,250 ( 0.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 700,225 ( 0.24%) crates/polyxml-core/src/parser.rs:::push_list_item [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 700,000 ( 0.24%) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 675,675 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter_nested.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 675,225 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::emit_start + 675,150 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:core::str::converts::from_utf8 + 675,000 ( 0.23%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::unescape [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 650,125 ( 0.22%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:polyxml::parser::namespace_scope + 608,450 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::parse_scalar + 603,525 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::finish_grow + 600,600 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 600,200 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 600,150 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:core::ptr::drop_glue::> + 600,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 600,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:polyxml::parser::is_nil_element + 575,050 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs:::parse_sub_tree::<&[u8]> + 575,000 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/macros/mod.rs:::parse_scalar + 550,550 ( 0.19%) crates/polyxml-core/src/parser.rs:polyxml::parser::resolve_record_schema [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 550,550 ( 0.19%) crates/polyxml-core/src/schema.rs:polyxml::schema::validate_content [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 550,350 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::finish + 525,175 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::emit_end + 525,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::check_for_duplicates + 525,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::check_for_duplicates + 501,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs:__rustc::__rust_alloc + 501,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs:__rustc::__rust_alloc + 500,000 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/number.rs:::try_fast_path:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 500,000 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_text [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 500,000 ( 0.17%) /rust/deps/hashbrown-0.17.1/src/lib.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 500,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs: as core::hash::Hasher>::write + 500,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>::map_or::<&str, >::from::{closure#0}> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 500,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::parse_attributes + 500,000 ( 0.17%) crates/polyxml-core/src/parser.rs:polyxml::parser::parse_field_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 475,475 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:>; 4]> as core::ops::drop::Drop>::drop [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 475,475 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:; 8]> as core::ops::drop::Drop>::drop [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 466,875 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 452,375 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::finish_grow + 450,150 ( 0.15%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::emit_end + 450,150 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 450,150 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::emit_start + 450,100 ( 0.15%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs:::parse_scalar + 450,050 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 425,850 ( 0.14%) ???:0x00000000000b2300 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 422,350 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 419,500 ( 0.14%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-integer-1.0.6/src/algorithm.rs:::parse_scalar + 400,400 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 400,300 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 400,125 ( 0.13%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 400,100 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::feed + 400,000 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/collections/hash/map.rs:::parse_sub_tree::<&[u8]> + 377,250 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::finish_grow + 375,425 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::emit_start + 375,125 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:::parse_attributes + 375,125 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::emit_start + 375,000 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs:::next + 350,100 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:::feed + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>::push_mut [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs: as core::hash::Hasher>::write + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 325,050 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:::parse_sub_tree::<&[u8]> + 300,300 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>>::into_boxed_slice [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 300,200 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::finish + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/clone.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,075 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs:polyxml::parser::namespace_scope + 300,050 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,050 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs:::emit_end + 300,025 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::parse_sub_tree::<&[u8]> + 300,025 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::parse_sub_tree::<&[u8]> + 300,000 ( 0.10%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::parse_sub_tree::<&[u8]> + 300,000 ( 0.10%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::name + 300,000 ( 0.10%) /rust/deps/hashbrown-0.17.1/src/control/tag.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/sse2.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs:polyxml::parser::is_nil_element + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:::check_for_duplicates + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::name + 291,750 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/traits/iterator.rs:::next + 275,050 ( 0.09%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::parse_attributes + 250,500 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:__rustc::__rust_alloc + 250,500 ( 0.08%) benchmarks/rust-runtime-investigation/target/candidate/src/main.rs:__rustc::__rust_alloc [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 250,475 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::finish + 250,050 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/noskip.rs:::parse_scalar + 250,000 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/iterator.rs:::parse_scalar + 250,000 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::parse_sub_tree::<&[u8]> + 250,000 ( 0.08%) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs:::parse_attributes + 250,000 ( 0.08%) /rust/deps/hashbrown-0.17.1/src/raw.rs:::parse_attributes + 250,000 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::parse_scalar + 226,525 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::finish_grow + 225,225 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs:polyxml::parser::resolve_record_schema + 225,100 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::push_list_item + 225,075 ( 0.08%) crates/polyxml-core/src/schema.rs:::finish + 225,050 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::emit_end + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000-valgrind.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000-valgrind.txt new file mode 100644 index 0000000..49e36e9 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000-valgrind.txt @@ -0,0 +1,12 @@ +==373371== Callgrind, a call-graph generating cache profiler +==373371== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al. +==373371== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info +==373371== Command: benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics read 1000 25 instructions +==373371== Parent PID: 365338 +==373371== +==373371== For interactive control, run 'callgrind_control -h'. +==373371== +==373371== Events : Ir +==373371== Collected : 296585254 +==373371== +==373371== I refs: 296,585,254 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000.callgrind b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000.callgrind new file mode 100644 index 0000000..3b62a9d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/read-1000.callgrind @@ -0,0 +1,3680 @@ +# callgrind format +version: 1 +creator: callgrind-3.26.0 +pid: 373371 +cmd: benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics read 1000 25 instructions +part: 1 + + +desc: I1 cache: +desc: D1 cache: +desc: LL cache: + +desc: Timerange: Basic block 0 - 89728348 +desc: Trigger: Program termination + +positions: line +events: Ir +summary: 296585254 + + +ob=(2) /usr/lib/x86_64-linux-gnu/libc.so.6 +fl=(2) ??? +fn=(4508) 0x00000000000b20e0 +0 4946685 +cfn=(4954) 0x00000000000b0f70 +calls=73313 0 +0 1086761 +0 2459238 +cfn=(4954) +calls=35010 0 +0 548102 +0 399150 + +fn=(4330) 0x00000000000b08d0 +0 120120 + +fn=(4488) 0x0000000000197a00 +0 21680675 + +fn=(4162) 0x000000000002a580 +cob=(6) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics +cfi=(6) ??? +cfn=(4176) main +calls=1 0 +0 296585254 + +fn=(4232) 0x00000000000b2400 +0 10553314 +cfn=(4954) +calls=35955 0 +0 780023 +0 1272808 +cfn=(4330) +calls=32761 0 +0 117485 +0 8432 +cfn=(4330) +calls=799 0 +0 2635 +0 24024 + +fn=(4226) malloc +0 796400 +cfn=(4232) +calls=73729 0 +0 12746428 +0 3606950 + +fn=(4460) 0x00000000000b4180 +0 1109825 +cfn=(4232) +calls=64 0 +0 12293 +0 325500 +cfn=(4502) 0x00000000000b2300 +calls=37042 0 +0 3506272 +0 25225 +cob=(3) ??? +cfi=(3) ??? +cfn=(4486) 0x0000000004b296a0 +calls=63 0 +0 325 +0 150 +cfn=(4502) +calls=63 0 +0 2925 +0 4550 + +fn=(4954) +0 2414886 + +fn=(4128) (below main) +cfn=(4162) +calls=1 0 +0 296585254 + +fn=(4458) realloc +0 1670225 +cfn=(4460) +calls=38415 0 +0 4987065 +0 278025 + +fn=(4880) free +0 597300 +cfn=(4508) +calls=73670 0 +0 6356589 +0 4530650 + +fn=(4502) +0 300600 +cfn=(4508) +calls=37105 0 +0 3083347 +0 125250 + +fn=(5756) 0x00000000001972a0 +0 4058539 + +ob=(3) +fl=(3) +fn=(4486) +0 50 +cob=(2) +cfi=(2) +cfn=(4488) +calls=114 0 +0 275 + +ob=(6) +fl=(41) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs +fn=(5714) >::map_or::<&str, >::from::{closure#0}> +1222 100000 ++5 200000 ++4 200000 + +fl=(107) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs +fn=(5782) quick_xml::escape::unescape +236 250000 ++52 25000 +fi=(54) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs +473 75000 +0 25000 +fi=(13) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs +3994 50000 +fi=(78) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs +153 125000 +cfi=(84) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs +cfn=(5494) memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 +calls=37000 659 +* 1053000 +fi=(41) +2869 50000 +fe=(107) +321 50000 +fi=(91) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs +0 25000 +fe=(107) +327 100000 +0 25000 +238 225000 + +fl=(85) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs +fn=(5506) <&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: +211 1800600 +fi=(33) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs +3101 150050 +1032 300100 ++1 100 +cfi=(32) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs +cfn=(5510) >::grow_one +calls=74 186 +* 4800 +fi=(32) +611 150050 +fi=(18) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs +1963 150050 +fi=(33) +1038 450150 +fi=(76) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs +137 150050 +fe=(85) ++86 150050 +0 450150 +232 450150 +cfi=(87) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/parser/element.rs +cfn=(5518) ::feed +calls=222074 57 +* 14181000 +* 300100 +0 150050 +233 450150 +fi=(10) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs +1092 150050 +fi=(32) +616 150050 +fi=(33) +1461 150050 +fi=(10) +2689 150050 +fi=(32) +764 150050 +-94 150050 +fi=(33) +2981 300000 +0 150050 +fi=(20) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs +970 150050 +fi=(18) +573 750250 +cob=(2) +cfi=(2) +cfn=(4488) +calls=222074 0 +* 2200650 +* 300100 +fi=(33) +2986 450150 +fi=(44) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs +90 150050 +fi=(141) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs +389 450150 +fe=(85) +239 600200 +fi=(44) +544 450150 +90 300100 +fe=(85) +240 300100 +cfi=(38) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs +cfn=(5184) core::str::converts::from_utf8 +calls=222074 89 +* 12090575 +fi=(27) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs +0 300100 +2177 300100 +fe=(85) +253 1200400 +0 150050 +240 600200 +fi=(33) +0 50 +fi=(32) +672 300 +cfn=(5534) >::reserve::do_reserve_and_handle:: +calls=74 -14 +* 6600 +* 100 +fi=(33) +3101 50 +2981 50 +fe=(85) + +fl=(98) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs +fn=(5636) ; 8]>>::from_elem +2052 250250 ++1 50050 +856 25025 +fi=(18) +-9 25025 +fi=(19) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs +2144 25025 +fi=(34) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/range.rs +1100 25025 +fe=(98) +0 25025 +fi=(41) +2274 50050 ++2 25025 +fi=(18) +1963 400400 +fi=(19) +2144 25025 +fi=(34) +1100 25025 +fi=(41) +2276 25000 +fi=(18) +1963 400000 +fi=(19) +2144 25000 +fi=(34) +1100 25000 +fi=(41) +2276 25000 +fi=(18) +1963 400000 +fi=(19) +2144 25000 +fi=(34) +1100 25000 +fe=(98) +2615 50050 +2067 75075 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 0 +* 1926925 ++2 225225 + +fn=(5962) ; 8]> as core::ops::drop::Drop>::drop +2373 200200 +1082 50050 +2375 25025 +fi=(18) +847 50050 +fe=(98) +2382 200200 + +fn=(5988) >; 4]> as core::ops::drop::Drop>::drop +2373 200200 +1082 50050 +2375 25025 +fi=(23) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs +0 25025 +fi=(18) +847 50050 +fe=(98) +2382 200200 + +fn=(5998) >; 4]>>::resize_with::<::push_list_item::{closure#0}> +1841 200 +1082 75 +-30 25 +0 25 +1846 75 +1082 50 +-17 25 +0 25 +1358 75 +0 50 +1230 50 +fi=(20) +970 25 +fi=(18) +1963 100 +fe=(98) +1237 25 +fi=(19) +2144 25 +fi=(34) +1100 50 +fi=(74) /home/bailey/github/PolyXML/crates/polyxml-core/src/parser.rs +70 25 +fe=(98) +1082 50 +1217 25 +1856 200 + +fn=(6136) >; 4]> as core::ops::drop::Drop>::drop +2483 250 ++10 50 +-8 200 + +fl=(33) +fn=(5818) >::push_mut +1027 125000 ++2 25000 ++3 50000 +fi=(20) +-62 50000 +fi=(18) +1963 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fe=(33) +1038 50000 ++4 100000 + +fn=(5968) >>::into_boxed_slice +1723 100100 +fi=(32) +616 25025 +fe=(33) +1598 75075 +fi=(32) +832 25025 +fi=(10) +1401 25025 +fi=(32) +839 50050 +fi=(10) +1401 25025 +fi=(23) +228 75075 +cfi=(24) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/src/main.rs +cfn=(5542) __rustc::__rust_realloc +calls=37037 41 +* 7260022 +fi=(27) +965 50050 +fe=(33) +1731 125125 + +fl=(74) +fn=(5582) ::check_root +343 200 ++1 50 ++14 25 ++1 200 + +fn=(5696) polyxml::parser::record_content_token +1123 525000 +fi=(14) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs +454 75000 +fi=(41) +634 75000 +fe=(74) +1128 75000 ++8 600000 + +fn=(5602) polyxml::parser::namespace_scope +174 525175 ++1 75025 +fi=(101) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs +0 75025 +fi=(100) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs +272 75025 +fe=(74) +-96 975325 +0 75025 +fi=(99) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs +403 225075 +cfi=(94) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs +cfn=(5604) ::next +calls=111037 601 +* 12009850 +* 75000 +cfi=(94) +cfn=(5604) +calls=37000 601 +* 1350000 +fi=(95) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs +855 300075 +fi=(41) +-90 50000 +fi=(95) ++90 200050 ++1 150000 +fi=(77) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs +21 50000 +fi=(76) +2635 25000 +fi=(18) +847 75000 +fi=(96) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/collections/hash/map.rs +0 75025 +fe=(74) +187 75025 +cfi=(18) +cfn=(5616) core::ptr::drop_glue::> +calls=111037 847 +* 2300450 ++1 75025 +fi=(41) +1162 150050 +fi=(13) +4029 75025 +fi=(59) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs +2434 75025 +fe=(74) +189 675225 + +fn=(5896) polyxml::parser::parse_field_scalar +137 150000 ++5 50000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(74) +151 150000 +cfi=(108) /home/bailey/github/PolyXML/crates/polyxml-core/src/converters.rs +cfn=(5794) ::parse_scalar +calls=74000 28 +* 21578803 ++1 150000 + +fn=(5622) polyxml::parser::resolve_record_schema +220 200200 +fi=(14) +454 25025 +fe=(74) +225 50050 +fi=(14) +454 25025 +fi=(13) +3994 25025 +fi=(97) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs +54 50050 ++45 25025 +fi=(13) +4149 25025 +fi=(97) +97 25025 +fi=(13) +3994 25025 +fi=(33) +3101 50050 +fi=(13) +4049 25025 +fi=(97) +111 25025 ++7 100100 +fi=(33) +3126 25025 +fe=(74) +225 25025 +fi=(13) +4029 25025 +fi=(59) +2434 25025 +fe=(74) +226 25025 +0 25025 +274 225225 + +fn=(5994) ::push_list_item +67 175000 +fi=(98) +1082 75000 +-30 25000 +-15 25000 +fe=(74) +68 25000 +-68 24975 +fi=(98) +1082 24975 +-17 24975 +fi=(44) +195 50000 +fi=(98) +1082 25000 +-17 25000 +fe=(74) +0 25 +68 50 +fi=(14) +454 25 +fi=(33) +3101 25 +fe=(74) +70 50 +cfi=(98) +cfn=(5998) +calls=37 1841 +* 1200 +-70 25 +fi=(98) +1082 100 +-17 50 +fe=(74) +72 25000 +fi=(44) +197 50000 +fe=(74) +73 75000 ++1 199800 +fi=(33) +1029 24975 ++3 49950 ++1 450 +cfi=(32) +cfn=(6014) >::grow_one +calls=333 186 +* 46350 +fi=(32) +611 24975 +fi=(20) +970 24975 +fi=(18) +1963 199800 +fi=(33) +1038 74925 +fi=(23) +128 25 +cfi=(6) +cfn=(5102) __rustc::__rust_no_alloc_shim_is_unstable_v2 +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5104) __rustc::__rust_alloc +calls=37 -89 +* 1050 +fi=(28) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/boxed.rs +251 50 +fe=(74) +75 225 +fi=(18) +847 50 +fe=(74) +75 75 ++3 175000 + +fn=(5592) ::parse_sub_tree::<&[u8]> +410 350 +cfi=(6) +cfn=(5102) +calls=37 0 +* 25 +fi=(23) +130 75 +cfi=(24) +cfn=(5104) +calls=37 -89 +* 3725 +fi=(32) +470 50 +fi=(33) +969 75 +fi=(23) +128 25 +cfi=(6) +cfn=(5102) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5104) +calls=37 -89 +* 950 +fi=(28) +251 50 +fe=(74) +418 100 +cfn=(5602) +calls=37 174 +* 3000 +* 25 +fi=(33) +1196 125 +fe=(74) +420 75 +cfn=(5622) +calls=37 220 +* 1050 +fi=(27) +2177 25 +0 25 +2177 50 +fi=(41) +634 25 +fi=(33) +3101 25 +fe=(74) +38 25 ++1 100 +cfi=(98) +cfn=(5636) +calls=37 2052 +* 3225 +-7 25 ++9 75 +-4 150 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 -37 +* 1925 +* 175 +422 75 +cfn=(5640) ::parse_attributes +calls=37 997 +* 3225 +fi=(27) +2177 50 +fe=(74) +0 75 +423 50 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fi=(33) +1029 25 ++3 50 +fi=(20) +-62 75 +fi=(18) +1963 50 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fi=(33) +1038 50 +462 725 +3082 200000 +fi=(85) +412 800000 +cfi=(75) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/mod.rs +cfn=(5472) >::read_event_impl::<&mut alloc::vec::Vec> +calls=296000 1006 +* 85032514 +* 100 +cfi=(75) +cfn=(5472) +calls=37 1006 +* 24575 +fe=(74) ++20 1000125 +0 200025 +432 600075 +fi=(33) +1865 75000 +fi=(76) +282 150000 +fi=(32) +611 75000 +fi=(76) +282 150000 +fe=(74) +434 150000 +cfn=(5602) +calls=111000 174 +* 19808500 +0 150000 +fi=(33) +1029 75000 ++3 150000 ++1 50 +cfi=(32) +cfn=(5688) >::grow_one +calls=37 186 +* 20993 +fi=(32) +611 75000 +fi=(18) +1963 75000 +fi=(33) +1038 150000 +fe=(74) +435 150000 +784 100000 +fi=(101) +350 100000 +fi=(54) +871 50000 +fi=(33) +3126 50000 +fi=(13) +3994 100000 +fe=(74) +787 50000 +fi=(33) +2873 225075 ++4 150050 +fi=(32) +611 75025 +fi=(18) +1755 75025 +fi=(33) +0 75025 +fi=(13) +4049 75025 +fi=(59) +2868 75025 +fe=(74) +878 150050 +fi=(33) +3101 75025 ++25 75025 +fe=(74) +882 75025 +0 75000 +fi=(41) +634 150000 +fi=(33) +3126 150000 +fi=(76) +282 150000 +fi=(33) +1904 75000 +fi=(76) +305 150000 +fi=(32) +611 150000 +fi=(76) +305 225000 +fi=(14) +454 75000 +fi=(59) +2454 75000 +fe=(74) +441 150000 +cfn=(5696) +calls=111000 1123 +* 1350000 +fi=(33) +3126 75000 +fe=(74) +447 75000 +fi=(78) +153 150000 +cfn=(5844) memchr::arch::x86_64::memchr::memchr_raw::find_avx2 +calls=73999 -75 +* 3000300 +fi=(41) +2869 100000 +fe=(74) +0 75025 +909 300100 ++42 50050 +fi=(33) +2877 50000 +fi=(54) +871 50000 +fi=(18) +1755 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fi=(101) +350 50000 +fi=(103) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs +210 75000 +cfi=(92) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs +cfn=(5706) ::find:: +calls=37000 1497 +* 1200000 ++62 175000 +cfi=(41) +cfn=(5714) +calls=37000 1222 +* 125000 +fe=(74) +0 50000 +fi=(11) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/mem/mod.rs +975 100000 ++1 25000 +fe=(74) +-21 125000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +* 75000 +cfn=(5928) ::finish +calls=37000 80 +* 27532831 +fi=(27) +2177 50000 +0 200000 +2177 50000 +fe=(74) +955 200000 +fi=(33) +1904 25000 +fi=(76) +305 50000 +fi=(32) +611 25000 +fi=(76) +305 75000 +fe=(74) +958 75000 +fi=(76) +305 100000 +fi=(32) +611 50000 +fi=(76) +305 150000 +fi=(14) +454 50000 +fe=(74) +911 100000 +fi=(41) +634 50000 +fe=(74) +802 50000 +975 50 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 50000 +-94 50000 +fi=(33) +2981 99950 +0 50000 +fi=(20) +970 50000 +fi=(18) +573 150000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=74000 0 +* 705000 +fi=(33) +2986 150000 +1865 100000 +fi=(44) +238 100000 +fi=(32) +611 50000 +fi=(44) +238 150000 +fe=(74) +915 350000 +fi=(33) +3101 75000 +fe=(74) +464 150000 +fi=(100) +211 150000 +cfi=(101) +cfn=(5700) ::name +calls=111000 0 +* 775000 +* 150000 +fi=(103) +-1 225000 +cfi=(92) +cfn=(5706) +calls=111000 1497 +* 3725000 ++62 525000 +cfi=(41) +cfn=(5714) +calls=111000 1222 +* 375000 +fe=(74) +0 150000 +471 150000 +cfn=(5716) polyxml::parser::is_nil_element +calls=111000 156 +* 20683500 +fi=(33) +1865 75000 +fi=(76) +282 150000 +fe=(74) +0 75000 +fi=(32) +611 75000 +fi=(76) +282 75000 +fi=(14) +454 75000 +fi=(13) +4029 75000 +fi=(59) +2434 75000 +fe=(74) +473 75000 +fi=(59) +2438 75000 +320 75000 +fi=(96) +1039 300000 +cfi=(55) /rust/deps/hashbrown-0.17.1/src/raw.rs +cfn=(5740) , usize, std::hash::random::RandomState>>::get::<[u8]> +calls=111000 1337 +* 19848000 +fe=(74) +474 150000 +0 75000 +474 75000 +fi=(33) +1865 75000 +fi=(44) +238 150000 +fi=(32) +611 75000 +fi=(44) +238 150000 +fe=(74) +479 525000 +0 25000 +479 50000 +fi=(28) +2415 25000 +fe=(74) +492 275000 ++16 50000 +915 100000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(74) +925 50000 +cfn=(5896) +calls=74000 137 +* 22178803 +fi=(27) +2177 100000 +0 400000 +2177 100000 +fe=(74) +925 400000 ++1 100000 +0 50000 +929 400000 +fi=(98) +1082 100000 +-17 50000 +fe=(74) +0 50000 +fi=(14) +454 25000 +fi=(96) +1039 100000 +cfi=(55) +cfn=(5740) +calls=37000 1337 +* 6550000 +fe=(74) +-76 75000 +fi=(33) +1865 25000 +fi=(44) +238 50000 +fi=(32) +611 25000 +fi=(44) +238 50000 +fe=(74) +969 100000 ++1 250000 +cfn=(5994) +calls=37000 67 +* 1474250 +* 25000 +fi=(98) +0 100000 +fi=(44) +245 200000 +fi=(18) +847 100000 +fe=(74) ++82 250000 +0 450000 +481 100000 +fi=(33) +3082 250000 +fe=(74) +0 75000 +fi=(14) +454 75000 +fi=(13) +4049 75000 +fi=(59) +2868 75000 +fi=(33) +1865 25000 +fi=(76) +282 50000 +fe=(74) +0 25000 +fi=(32) +611 25000 +fi=(76) +282 50000 +fe=(74) +516 75000 +cfn=(5622) +calls=37000 220 +* 1050000 +fi=(27) +2177 25000 +0 25000 +2177 50000 +fe=(74) +521 50000 +cfn=(5766) ::new +calls=37000 30 +* 6950000 +0 25000 +522 125000 +cfn=(5640) +calls=37000 997 +* 28271500 +fi=(27) +2177 50000 +fe=(74) +523 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fi=(33) +996 75000 +cfn=(5818) +calls=37000 +31 +* 2700000 +* 25000 +fi=(59) +0 125000 +fe=(74) +988 400000 +fi=(18) +847 600000 +0 200000 +847 1200000 +fi=(32) +672 150 +cfn=(5534) +calls=37 -14 +* 2875 +fi=(33) +3101 25 +2981 25 +fe=(74) +988 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs +cfn=(5686) __rustc::__rust_dealloc +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5686) +calls=37 65 +* 850 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5686) +calls=37 65 +* 850 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5686) +calls=37 65 +* 3250 +fi=(14) +454 25 +fi=(13) +4049 25 +fi=(59) +2868 25 +fe=(74) +995 200 +fi=(18) +847 75 +0 25 +847 150 +fi=(33) +2877 25 +fi=(32) +611 50 +fi=(18) +1755 75 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fe=(74) +977 75 +cfn=(5928) +calls=37 80 +* 29016 +* 25 + +fn=(5640) +997 200200 ++1 25025 +fi=(101) +0 25025 +fi=(100) +272 25025 +fe=(74) +999 500500 +fi=(99) +403 75075 +cfi=(94) +cfn=(5604) +calls=37037 601 +* 9309850 +* 75000 +cfi=(94) +cfn=(5604) +calls=37000 601 +* 1350000 +fi=(95) +855 150075 +fi=(41) +-90 50000 +fi=(95) ++90 100050 ++1 125000 +fe=(74) +999 25000 +fi=(103) +222 75000 +fi=(77) +21 75000 +fi=(76) +2635 25000 +fe=(74) +0 25000 +1004 50000 +cfi=(103) +cfn=(5722) ::local_name +calls=37000 141 +* 950000 +0 50000 +fi=(14) +454 25000 +fi=(55) +1337 25000 +fi=(51) /rust/deps/hashbrown-0.17.1/src/map.rs +-53 25000 +0 25000 +1287 25000 +241 50000 +cfi=(52) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/mod.rs +cfn=(5744) ::hash_one::<&[u8]> +calls=37000 694 +* 4625000 +fi=(104) /rust/deps/hashbrown-0.17.1/src/control/tag.rs +47 75000 +fi=(55) +2452 150000 +0 25000 +fi=(18) +573 25000 +fi=(57) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/sse2.rs +1569 75000 +fi=(105) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs +40 50000 +-40 200000 +fi=(58) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/nonzero.rs +628 25000 +fi=(55) +2032 50000 +fi=(20) +1054 75000 +fi=(77) +21 50000 +fi=(106) /rust/deps/hashbrown-0.17.1/src/lib.rs +157 100000 +cob=(2) +cfi=(2) +cfn=(5756) +calls=37000 0 +* 493000 +* 25000 +fi=(47) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs +455 25000 +fe=(74) +1005 25000 +fi=(33) +1865 25000 +fi=(44) +238 50000 +fi=(32) +611 25000 +fi=(44) +238 50000 +fe=(74) +1007 100000 +fi=(101) +350 50000 +fe=(74) +1008 50000 +cfi=(107) +cfn=(5782) +calls=37000 236 +* 2078000 +fi=(27) +2177 25000 +0 100000 +2177 50000 +fe=(74) +0 75000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fe=(74) +1009 75000 +cfi=(108) +cfn=(5794) +calls=37000 28 +* 2767000 +fi=(27) +2177 50000 +0 200000 +2177 75000 +fe=(74) +1009 225000 +fi=(98) ++73 75000 +-17 25000 +fi=(44) +245 50000 +0 25000 +fi=(98) +1082 25000 +-17 25000 +fi=(44) +245 50000 +fi=(18) +847 50000 +fe=(74) +1014 225000 +fi=(18) +847 100000 +fi=(23) +0 50000 +fi=(18) +847 50000 +fi=(11) +0 25025 +fe=(74) +1024 25025 +cfi=(18) +cfn=(5616) +calls=37037 847 +* 1400450 +* 25025 +fi=(14) +454 25025 +fe=(74) +1025 50050 ++3 25025 +fi=(18) +847 50050 +fe=(74) +1029 225225 + +fn=(5716) +156 525000 +fi=(101) +0 75000 +fi=(100) +272 75000 +fe=(74) +157 1125000 +0 75000 +fi=(99) +403 225000 +cfi=(94) +cfn=(5604) +calls=111000 601 +* 12008500 +* 75000 +cfi=(94) +cfn=(5604) +calls=37000 601 +* 1350000 +fi=(95) +855 300000 +fi=(41) +-90 50000 +fi=(95) ++90 200000 ++1 100000 +fe=(74) +157 25000 +fi=(103) ++65 50000 +fi=(77) +21 50000 +fi=(76) +2635 25000 +fe=(74) +162 50000 +cfi=(103) +cfn=(5722) +calls=37000 -21 +* 950000 +fi=(77) +21 100000 +fi=(18) +847 50000 +fi=(23) +0 150000 +fe=(74) +168 75000 +cfi=(18) +cfn=(5616) +calls=111000 847 +* 2300000 ++2 675000 + +fn=(5470) ::deserialize_with_limit +365 250 +fi=(75) +810 300 +fi=(33) +462 150 +0 50 +fi=(85) +412 100 +cfi=(75) +cfn=(5472) +calls=37 1006 +* 24750 +fe=(74) +-38 225 +fi=(14) ++80 25 +fi=(59) +2454 100 +fe=(74) +376 50 +cfn=(5582) +calls=37 -33 +* 475 +fi=(27) +2177 50 +fe=(74) +379 50 +fi=(142) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/thread_local/native/mod.rs +105 75 +fi=(143) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/thread_local/native/lazy.rs +-46 50 +fi=(60) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cell.rs +558 50 +fi=(10) +2652 25 +fi=(11) +976 25 +fi=(59) +440 200 +fi=(23) +128 25 +cfi=(6) +cfn=(5102) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5104) +calls=37 -89 +* 1050 +fi=(28) +251 50 +0 25 +293 200 +fi=(59) ++27 75 +fe=(74) ++57 125 +cfn=(5592) +calls=37 +33 +* 284098132 +fi=(13) +4049 25 +fi=(59) +2868 25 +0 50 +2911 25 +cfn=(6144) >>::drop_slow +calls=37 2138 +* 1725 +0 25 +fe=(74) +401 75 +fi=(18) +847 75 +0 25 +847 150 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5686) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5686) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5686) +calls=37 65 +* 3850 +fe=(74) +408 275 + +fn=(5928) +80 225225 +fi=(14) +454 50050 +fi=(59) +2454 25025 +fi=(32) +611 25025 +fi=(33) +1865 75075 +fe=(74) +81 25025 +cfi=(45) /home/bailey/github/PolyXML/crates/polyxml-core/src/schema.rs +cfn=(5930) polyxml::schema::validate_content +calls=37037 725 +* 550550 +fi=(27) +2177 50050 +fi=(18) +0 50050 +fi=(14) +454 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +fi=(50) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs +180 25025 +0 125125 +180 100100 +fi=(41) +634 25000 +fe=(74) +83 25000 +fi=(50) +-83 75025 +fi=(14) +1663 150050 +fi=(118) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs +82 75025 +fi=(14) +1663 75025 +fi=(50) +180 75025 +fi=(45) +4 75025 +fe=(74) ++79 75025 +fi=(98) +1082 75000 +-30 25000 +fi=(44) +238 50000 +0 25000 +fi=(98) +1082 25000 +-30 25000 ++30 75075 +-30 25025 +-15 50050 +fe=(74) +96 25025 +-96 50 +fi=(98) +1082 25 +fe=(74) +97 300 +fi=(98) +996 50 ++56 25 +-56 25 +fe=(74) +97 25 +fi=(118) +-73 125 +fe=(74) ++73 25 +fi=(98) +2493 50 +0 125 +fe=(74) +99 200 +fi=(98) +2493 50 +0 25 +2493 50 ++5 50 +1082 50 +-30 25 +fi=(54) +871 25 +fi=(18) +1755 25 +fi=(41) +2869 50 +fi=(118) +80 25 +fi=(41) +2870 50 +fi=(118) +81 25 ++1 50 +fe=(74) ++16 100 ++1 50 +fi=(98) +1082 75 +-17 25 +fi=(44) +245 50 +0 25 +fi=(98) +1082 25 +-17 25 +fi=(44) +245 50 +fi=(18) +847 50 +0 25 +847 25 +cfi=(98) +cfn=(6136) +calls=37 2483 +* 500 +0 75 +847 25 +cfi=(98) +cfn=(5988) +calls=37 2373 +* 550 +0 25 +fi=(14) +454 25 +fe=(74) +104 100 +0 50000 +fi=(14) +454 25000 +fe=(74) +104 75000 +fi=(14) +454 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +0 100100 +fi=(98) +1052 125125 +fi=(14) +1663 150050 +fi=(118) +82 75025 +fi=(14) +1663 75025 +fi=(50) +180 75025 +0 75025 +fi=(98) +1082 225075 +-30 75025 +fi=(44) +238 150050 +0 75025 +fi=(98) +1082 75025 +-30 75025 +fi=(41) +743 150050 +fi=(45) +-74 150050 +fi=(111) /home/bailey/github/PolyXML/crates/polyxml-core/src/lib.rs +0 25025 +fe=(74) +131 100100 ++1 75075 +fi=(98) +1082 25025 +1607 25025 +fe=(74) +132 25025 +fi=(98) +1615 100100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 0 +* 1926925 +2552 50050 +-1 150150 +fi=(33) +3996 25025 +cfi=(117) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter.rs +cfn=(5950) > as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter +calls=37037 32 +* 11517075 +0 25025 +fe=(74) +132 25025 +cfi=(33) +cfn=(5968) +calls=37037 1723 +* 7835597 +-2 125125 ++4 50050 +0 25000 +fi=(18) +847 25000 +cfi=(98) +cfn=(5988) +calls=37000 2373 +* 550000 +* 175175 +fi=(32) +425 50050 +631 25025 +fe=(74) +134 225225 + +fn=(5468) polyxml::deserialize +362 50 +cfn=(5470) +calls=37 +3 +* 284135282 + +fn=(5766) +30 150000 +fi=(41) +634 25000 +fi=(33) +3101 25000 +fe=(74) +38 25000 ++1 100000 +cfi=(98) +cfn=(5636) +calls=37000 2052 +* 4175000 +-7 25000 ++9 75000 +-4 125000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 -37 +* 1925000 +* 150000 ++8 150000 + +fl=(114) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/number.rs +fn=(5922) ::try_fast_path:: +45 75000 +-45 25000 +46 50000 +-46 50000 +46 100000 ++36 50000 +fi=(115) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs ++70 50000 +fe=(114) +-67 50000 ++22 25000 +fi=(116) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/table_decimal.rs +-30 75000 +fi=(144) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/arith.rs +515 50000 +fe=(114) +100 75000 + +fl=(101) +fn=(5700) +0 75000 +fi=(100) +202 75000 +fi=(92) +380 150000 +fi=(100) +202 75000 +fi=(92) +384 150000 +fi=(43) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs +1229 25000 +fi=(91) +424 75000 +fi=(100) +203 150000 +fe=(101) + +fl=(87) +fn=(5518) +57 1500500 +fi=(54) +473 450150 +fi=(13) +3994 300100 +fi=(78) +153 900300 +cfi=(84) +cfn=(5524) memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 +calls=222073 1042 +* 4203450 +fi=(41) +2869 300100 +fi=(88) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs +0 150050 +fi=(54) +623 300100 +fe=(87) +59 300100 +fi=(54) +871 150050 +fe=(87) +59 625200 +fi=(13) +3994 25000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5524) +calls=37000 1042 +* 700000 +fi=(41) +2869 50000 +fi=(88) +0 25000 +fi=(54) +623 50000 +fe=(87) +59 50000 +fi=(54) +871 25000 +fe=(87) +59 375100 +-59 150050 +59 600200 +-59 150050 +59 200050 ++14 1350450 +fi=(88) +-73 25000 +fi=(54) +623 50000 +fe=(87) +59 50000 +fi=(54) +871 25000 +fe=(87) +59 75000 +fi=(13) +3994 25000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5524) +calls=37000 1042 +* 700000 +fi=(41) +2869 50000 +fe=(87) + +fl=(90) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs +fn=(5868) ::emit_end +197 525175 +fi=(91) +-68 150050 +fi=(43) +1229 75025 +fi=(91) +145 75025 +fi=(43) +1229 75025 +fi=(91) +262 75025 +0 300100 +fe=(90) +214 225075 +fi=(93) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs +315 300100 +0 75025 +fi=(50) +402 150050 +fi=(93) +-87 75025 +fi=(33) +2873 225075 ++4 150050 +fi=(32) +611 75025 +fi=(18) +1755 75025 +fe=(90) +228 150050 +fi=(32) +611 75025 +fi=(33) +1865 75025 +fi=(92) +380 150050 ++4 150000 +fi=(43) +1229 75000 +fi=(91) +493 75000 +fi=(40) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs +1490 150050 +fi=(92) +380 450150 +fi=(32) +611 75000 +fi=(43) +1229 75000 +fi=(40) +1491 75000 +fi=(33) +1828 75025 +fe=(90) +257 375125 ++1 675225 +fi=(92) +384 225075 +fi=(91) +221 150050 +fi=(54) +871 75025 +fi=(77) +21 150050 +-21 75025 +157 600200 +cob=(2) +cfi=(2) +cfn=(5756) +calls=111037 0 +* 1617539 +* 450150 +fe=(90) ++73 75025 +fi=(92) +394 75025 +fi=(91) ++30 75025 +fe=(90) + +fn=(5556) ::emit_start +314 750250 +fi=(92) ++70 150050 +fi=(43) +1229 75025 +fi=(91) +493 75025 +0 75025 +221 150050 +fi=(76) +2736 150050 +fi=(77) +157 75025 +fi=(76) +2738 75025 +0 75025 +2738 75025 +fe=(90) +345 150050 +fi=(10) +1092 75025 +fi=(92) +380 150050 ++4 150050 +fi=(43) +1229 75025 +fi=(91) +424 75025 +0 225075 +fi=(93) +331 325175 +-4 650350 ++1 700350 +-13 350175 +0 50000 +fi=(33) +3101 25000 +1029 25000 ++3 50000 +fi=(32) +611 75025 +fi=(18) +1963 75025 +fi=(33) +1038 150050 +fi=(92) +380 150050 ++4 150050 +fi=(43) +1229 25000 +fi=(91) +424 25000 +fi=(33) +1033 100 +cfi=(32) +cfn=(5572) >::grow_one +calls=37 186 +* 2675 +* 75 +0 50025 +3101 50025 +1029 50025 ++3 100075 +fi=(91) +424 50025 +fi=(32) +616 75025 +fi=(33) +1461 75025 +fi=(10) +2689 75025 +fi=(32) +764 75025 +-94 75025 +0 75025 +fi=(20) +970 75025 +fi=(18) +573 300100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=111037 0 +* 1125375 +* 75025 +fi=(33) +2986 225075 +fe=(90) +0 450150 +356 675225 +fi=(32) +672 250 +cfn=(5534) +calls=74 -14 +* 5825 +* 50 +fi=(33) +3101 100 +fe=(90) + +fn=(5832) ::emit_text +63 50000 ++1 100000 ++11 200000 ++1 150000 + +fl=(6) +fn=(4126) (below main) +cob=(2) +cfi=(2) +cfn=(4128) +calls=1 0 +0 296585254 + +fn=(4176) +cfi=(8) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/rt.rs +cfn=(4178) std::rt::lang_start_internal +calls=1 152 +0 296585254 + +fn=(5102) +0 125250 + +fl=(117) +fn=(5950) +32 200200 +fi=(98) +2493 100100 +0 25025 +2498 50050 +1082 25025 +-30 25025 +fi=(37) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter_nested.rs +0 25025 +26 225225 +fi=(98) +2506 25025 +fi=(10) +-10 75075 +fi=(19) +1051 75075 +fi=(10) +3212 25025 +fi=(37) +0 25025 +fi=(47) +478 75075 +fi=(98) +1052 25025 +fi=(54) +871 25025 +fi=(18) +1755 25025 +fi=(37) +24 50050 +fe=(117) ++10 200200 +fi=(32) +461 50050 +0 25025 +cfi=(6) +cfn=(5102) +calls=37037 0 +0 25025 +0 25025 +fi=(23) +130 75075 +cfi=(24) +cfn=(5104) +calls=37037 -89 +* 4837200 +fi=(32) +470 50050 +0 50050 +fi=(18) +1963 200200 +fi=(37) +36 100100 ++5 100100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 -41 +* 1926925 +fi=(98) +2493 125125 +0 50 +2493 50 +0 100000 +fi=(33) +4100 225000 +fi=(18) +1963 400000 +fi=(33) +4111 50000 +2224 50000 +fi=(98) +2493 150000 ++5 100000 +fi=(18) +1755 50000 +fi=(33) +4100 550000 ++2 100000 +fi=(98) +0 75000 +2493 50000 +0 25025 +fi=(18) +847 25025 +cfi=(98) +cfn=(5962) +calls=37037 2373 +* 525525 +fi=(37) +42 150150 +fe=(117) + +fl=(84) +fn=(5494) +659 350100 +fi=(78) +0 700200 +fi=(54) +623 350100 +fe=(84) ++40 350100 ++1 50100 +fi=(88) +1161 50050 +0 25025 +1162 25025 +fe=(84) +668 50050 +fi=(88) +1162 47250 +fe=(84) +668 239000 +fi=(54) +389 72250 +fi=(88) +1161 144500 +0 25000 +fi=(78) +86 75000 +fi=(18) +573 150000 +fi=(145) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs +699 300000 +2315 150000 +2163 150000 +fi=(146) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/vector.rs +147 150000 +fi=(88) +679 150000 +fi=(18) +573 25 +fi=(57) +920 50 +-25 25 +1569 25 +fi=(146) +147 25 +fi=(88) +679 25 +fe=(84) +0 450075 +fi=(78) +86 300100 +fe=(84) + +fn=(5524) +1042 400100 +0 1400350 +fi=(54) +623 400100 +fe=(84) +1046 400100 ++1 150 +fi=(88) +1161 50 +0 25 +1162 50 +fe=(84) +1051 25 +fi=(88) +1162 400 +fe=(84) +1051 1050 +fi=(54) +389 200 +fi=(88) +1161 400 +fi=(18) +573 199975 +fi=(145) +699 399950 +2315 199975 +699 199975 +2315 199975 +2163 199975 +fi=(146) +147 199975 +fi=(88) +972 199975 +fi=(18) +573 50 +fi=(57) +920 100 +-25 50 ++25 50 +-25 50 +1569 50 +fi=(146) +147 50 +fi=(88) +972 50 +fe=(84) +0 800100 +fi=(78) +86 400050 +-86 25 +86 50 +fe=(84) + +fl=(75) +fn=(5472) +1006 2400600 +289 1400350 +fi=(76) +2635 50 +fi=(77) +157 125 +fi=(85) +24 25 +fe=(75) +306 25 ++45 300100 +fi=(33) +3101 150050 +fi=(76) +137 300100 +0 300100 +fi=(54) +871 150050 +fi=(13) +3994 300100 +fi=(78) +153 750250 +cfi=(84) +cfn=(5494) +calls=222073 659 +* 3301100 +fi=(41) +2869 300100 +fi=(85) +72 600200 ++7 100000 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 100000 +-94 50000 +fi=(20) +970 50000 +fi=(18) +573 200000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=74000 0 +* 705000 +* 100000 +fi=(33) +2986 100000 +fi=(85) +0 50000 +fi=(44) +549 100000 +fi=(141) +389 100000 +fi=(44) +544 50000 +fi=(85) +79 100000 +fi=(44) +544 150000 +90 100000 +fi=(85) +-4 150000 +cfi=(38) +cfn=(5184) +calls=74000 +3 +* 3700250 +* 100000 +-25 150000 ++14 100050 +fi=(141) +389 100050 +fe=(75) +-34 100050 +0 300150 +437 100050 +fi=(44) +544 200100 +fe=(75) +437 50000 +fi=(44) +544 100000 +fe=(75) +0 150050 +fi=(141) +389 300100 +fi=(44) +90 150050 +fi=(76) ++66 300100 +fi=(141) +389 300100 +fi=(76) +156 150050 +fi=(72) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/clone.rs +716 300100 +fe=(75) +440 600200 +0 75025 +464 225075 +cfi=(85) +cfn=(5506) +calls=111037 211 +* 19183725 +-1 150050 ++4 375125 +cfi=(90) +cfn=(5868) +calls=111037 197 +* 8894789 +* 75025 +0 75025 +488 225075 +cfi=(85) +cfn=(5506) +calls=111037 211 +* 22204750 +-1 150050 +0 250000 +cfi=(90) +cfn=(5832) +calls=74000 63 +0 500000 +fi=(27) +2177 50000 +0 200000 +2177 100000 +fe=(75) +0 300000 +323 50000 +491 375125 +cfi=(90) +cfn=(5556) +calls=111037 314 +* 9137500 +* 75025 +-91 750250 +1011 1800450 + +fl=(55) +fn=(5740) +1337 100000 +fi=(51) +-53 100000 +0 900000 +1287 200000 +241 200000 +cfi=(52) +cfn=(5744) +calls=148000 694 +* 18150000 +fi=(104) +47 300000 +fe=(55) +2452 800000 +0 100000 +fi=(18) +573 100000 +fi=(57) +1569 300000 +fi=(105) +40 200000 +-40 500000 +fi=(58) +628 100000 +fe=(55) +2032 200000 +fi=(20) +1054 300000 +fi=(77) +21 200000 +fi=(106) +157 400000 +cob=(2) +cfi=(2) +cfn=(5756) +calls=148000 0 +* 1948000 +* 100000 +fi=(47) +455 100000 +fe=(55) +1217 1000000 +fi=(51) ++76 100000 +fe=(55) + +fn=(6146) as core::ops::drop::Drop>::drop +3486 175 +2656 50 +2271 25 +3498 200 + +fl=(18) +fn=(6386) core::ptr::drop_glue:: +847 275 +fi=(14) +454 25 +fi=(13) +4049 25 +fi=(59) +2868 25 +fe=(18) +847 450 +cfn=(6387) core::ptr::drop_glue::'2 +calls=37 * +* 12447414 +* 200 +cob=(2) +cfi=(2) +cfn=(4880) +calls=37 0 +* 825 + +fn=(6387) +847 275 +fi=(32) +611 25 +fi=(33) +4358 25 +fe=(18) +847 125 +0 25 +847 50 +cfn=(6387) +calls=37 * +* 8314 +* 49950 +cfn=(6387) +calls=36963 * +* 12284032 +* 100000 +fi=(32) +631 50 +fe=(18) +847 175 +cob=(2) +cfi=(2) +cfn=(4880) +calls=37 0 +* 4368 +* 1700000 +fi=(32) +631 50000 +425 25000 +fi=(23) +312 25000 +fi=(14) +454 25000 +fi=(13) +4049 25000 +fi=(59) +2868 25000 +fe=(18) +847 900000 +cfn=(6387) +calls=111000 * +* 6176136 +* 525000 +cob=(2) +cfi=(2) +cfn=(4880) +calls=74000 0 +* 8992346 + +fn=(5616) +847 700200 +fi=(32) +425 350100 +631 175050 +425 75000 +fi=(10) +1401 75000 +fi=(23) +175 150000 +cfi=(26) +cfn=(5686) +calls=111000 65 +* 2550000 +fe=(18) +847 1925550 + +fl=(94) +fn=(5660) ::check_for_duplicates +1036 525000 ++5 150000 +0 150000 +fi=(33) +3101 75000 +fe=(94) +1042 150000 +0 300000 +fi=(32) +611 150000 +fi=(20) +970 300000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +fe=(94) +0 225000 +fi=(33) +1032 150000 ++1 75000 +cfi=(32) +cfn=(5664) >>::grow_one +calls=111000 186 +* 8025000 +fi=(32) +611 150000 +0 225000 +fi=(18) +1963 225000 +fi=(33) +1038 225000 +fe=(94) ++16 225000 ++1 600000 + +fn=(5604) +601 1500300 ++1 1000200 +cfn=(5606) ::next +calls=370074 1123 +* 28202100 +* 1250250 ++1 350100 ++1 450000 +fi=(91) +129 525000 +fe=(94) +777 225000 +fi=(91) +129 150000 ++4 150000 ++12 150000 +fi=(43) +1229 150000 +fi=(91) +146 150000 +fi=(43) +1229 75000 +fi=(91) +262 75000 +129 375000 ++4 150000 ++12 150000 +fi=(43) +1229 75000 +fi=(91) +145 75000 ++1 150000 +fi=(43) +1229 75000 +fi=(91) +262 75000 +fi=(54) +871 225000 +fe=(94) +604 375000 ++3 1250250 + +fn=(5606) +1123 1750350 ++1 750150 +955 750150 ++2 250050 +1124 250050 +fi=(44) +544 500100 +fi=(14) +1663 500100 +fi=(50) +180 250050 +fe=(94) +1125 75000 +fi=(44) +90 375000 +-90 75000 +fe=(94) +1130 75000 +fi=(14) +627 75000 +fe=(94) +1130 75000 +fi=(93) +315 75000 +fe=(94) +1130 75000 +fi=(14) +627 75000 +fe=(94) +1130 75000 +fi=(93) +315 75000 +0 225000 +fi=(50) +180 75000 +fe=(94) +0 75000 +fi=(50) +180 75000 +fe=(94) +1138 175050 ++1 175050 +0 75000 +fi=(50) +180 75000 +fe=(94) +1143 300000 +fi=(14) +1663 150000 +fi=(50) +180 75000 +fe=(94) +1143 450000 +0 375000 +1188 525000 +0 175050 +1261 2250450 +-73 450000 +cfn=(5660) +calls=111000 1036 +* 12075000 +* 150000 +fi=(14) +1663 300000 +fi=(50) +180 75000 +0 225000 +fe=(94) +1199 150000 +fi=(93) +315 75000 +0 150000 +fe=(94) +0 225000 +fi=(14) +1663 150000 +fi=(50) +180 300000 +fe=(94) +1243 75000 +fi=(147) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/traits/iterator.rs +2490 75000 +fe=(94) +1243 216750 +fi=(147) +2490 216750 +fi=(14) +627 216750 +1663 433500 +fi=(50) +180 216750 +fi=(93) +0 150000 +fe=(94) +1243 75000 +0 150000 +1243 150000 +1113 150000 +0 375000 + +fl=(8) +fn=(5138) std::rt::lang_start::<()>::{closure#0} +cfi=(30) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/backtrace.rs +cfn=(5140) std::sys::backtrace::__rust_begin_short_backtrace:: +calls=1 162 +206 296585254 + +fn=(4178) +fi=(148) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/function.rs +cfn=(5138) +calls=1 206 +287 296585254 +fe=(8) + +fl=(45) +fn=(5930) +725 200200 ++1 100100 +0 25025 +735 225225 + +fl=(30) +fn=(5140) +fi=(148) +cfi=(24) +cfn=(5142) xml_diagnostics::main +calls=1 43 +250 296585254 +fe=(30) + +fl=(53) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs +fn=(5294) as core::hash::Hasher>::write +256 250000 ++2 250000 ++4 750000 +0 500000 +278 250000 ++1 750000 ++3 500000 +0 625000 +fi=(18) +573 125000 +fe=(53) +288 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fe=(53) +78 125000 +fi=(47) +2215 125000 +fe=(53) +79 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fe=(53) +79 125000 +fi=(47) +2215 250000 +fe=(53) +78 125000 +290 125000 ++2 125000 +-10 250000 +0 500000 +126 500000 +fi=(18) +573 200000 +fe=(53) +132 400000 +0 300000 +132 450000 +fi=(54) +871 25000 +fi=(18) +573 25000 +fe=(53) +134 75000 ++1 25000 ++2 500000 ++2 150000 +298 25000 +0 25000 +300 50000 +-2 225000 +0 225000 +300 450000 + +fl=(78) +fn=(5844) +78 50000 +fi=(84) +184 100000 +0 150000 +fi=(54) +623 100000 +fi=(84) +188 100000 ++1 100000 +fi=(88) +1161 50000 +0 50000 +fi=(84) +193 1050150 +fi=(54) +389 350050 +fi=(88) +1161 700100 +0 100000 +fe=(78) +86 100000 + +fl=(52) +fn=(5744) +694 750000 ++5 125000 +fi=(53) +203 250000 +fi=(48) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/hash/random.rs +84 125000 +fi=(53) +204 250000 +fi=(48) +84 625000 +fi=(10) +4058 375000 +fi=(53) +233 375000 +cfn=(5294) +calls=185000 +23 +* 6875000 +* 500000 +cfn=(5294) +calls=185000 +23 +* 3650000 ++81 375000 +-2 250000 ++4 250000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(47) +2215 250000 +fi=(53) +78 125000 +318 125000 ++2 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 250000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 250000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 500000 +fi=(53) +323 375000 +fe=(52) +702 625000 + +fl=(108) +fn=(5794) +28 1275000 ++5 1275000 +fi=(111) +-33 25000 +fi=(76) +199 25000 +fi=(56) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/macros/mod.rs +434 50000 +0 25000 +434 75000 +fi=(76) +0 25000 +fe=(108) +132 75000 +cfi=(38) +cfn=(5184) +calls=37000 -43 +* 1961250 +fi=(27) +0 50000 +2177 50000 +0 25000 +fi=(76) +199 25000 +0 75000 +fi=(56) +434 75000 +fi=(111) +0 25000 +fi=(32) +435 125000 +cfn=(5902) ::try_allocate_in +calls=37000 +12 +* 11703953 +0 25000 +435 75000 ++1 25000 +fi=(36) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/slice.rs ++16 50000 +fi=(18) +573 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 330000 +fe=(108) +133 100000 +0 50000 +209 225000 +0 50000 +209 450000 +fi=(56) +434 150000 +fi=(76) +0 25000 +fi=(56) +434 175000 +fi=(112) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/parse.rs +175 100000 +fi=(56) +0 25000 +fi=(109) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-integer-1.0.6/src/algorithm.rs +199 150000 +fi=(44) +0 50000 +fi=(113) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/iterator.rs +252 100000 +0 50000 +252 25000 +fi=(109) +677 25000 ++10 25000 +0 75000 +411 50000 +fi=(10) +2689 25000 +fi=(124) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs +39 50000 +fi=(109) +411 94500 +fi=(10) +2689 47250 +fi=(124) +39 94500 +fi=(110) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/noskip.rs +270 72250 +fi=(149) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/int_macros.rs +2261 72250 +fi=(115) +132 72250 +fi=(149) +2189 72250 +fi=(44) +184 216750 +0 25000 +fe=(108) +154 75000 +fi=(44) ++30 50000 +fi=(112) +872 205600 +fi=(10) +2689 102800 +fi=(124) +39 205600 +fi=(10) +2728 155600 +fi=(112) +566 77800 +fi=(10) +2652 77800 +fi=(110) +144 77800 +fi=(44) ++40 155600 +fi=(19) +2105 25000 +fi=(112) +616 25000 +0 75000 +fi=(44) +380 50000 +fi=(113) +252 75000 +fi=(44) +-68 50000 +0 25000 +fi=(112) +872 50000 +fi=(10) +2689 25000 +fi=(124) +39 50000 +fi=(112) +872 50000 +fi=(10) +2689 25000 +fi=(124) +39 50000 +fi=(10) +2728 100000 +fi=(112) +623 50000 +fi=(10) +2652 50000 +fi=(110) +144 50000 +fi=(44) ++40 100000 +0 50000 +90 50000 +fi=(112) +616 250000 +-48 100000 +fi=(44) +184 50000 +fi=(110) +0 50000 +fi=(112) +666 50000 +fi=(44) +0 25000 +fi=(112) +747 50000 +0 50000 +855 50000 +216 300000 ++51 25000 +cfi=(114) +cfn=(5922) +calls=37000 45 +* 675000 +* 50000 +0 25000 +fe=(108) +164 75000 + +fl=(103) +fn=(5722) +141 250000 ++69 250000 +fi=(10) +1096 100000 +fi=(44) +90 50000 +fi=(102) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs +-62 100000 ++13 100000 +-41 100000 +42 200000 ++4 100000 +-5 250000 +fi=(54) +-41 50000 +fe=(103) +143 350000 + +fl=(32) +fn=(5232) ::finish_grow +544 2600 +fi=(10) +3212 2600 +fi=(47) +478 975 +0 325 +fe=(32) +631 325 +fi=(10) +1401 300 +fi=(23) +228 1500 +cfi=(24) +cfn=(5542) +calls=1451 41 +* 54143 +fi=(27) +965 600 +fi=(23) +298 50 ++4 25 +cfi=(6) +cfn=(5102) +calls=39 0 +* 25 +130 75 +cfi=(24) +cfn=(5104) +calls=39 -89 +* 950 +fi=(27) +965 50 ++1 975 +fe=(32) +0 650 +564 1950 +-20 600600 +fi=(10) +3212 600600 +fi=(47) +478 225225 +fe=(32) +631 150150 +fi=(10) +1401 25 +fi=(23) +228 125 +cfi=(24) +cfn=(5542) +calls=1037 41 +* 1400 +fi=(27) +965 50 +fi=(23) +298 150100 ++4 75050 +cfi=(6) +cfn=(5102) +calls=111074 0 +* 75050 +130 225150 +cfi=(24) +cfn=(5104) +calls=111074 -89 +* 3152000 +fi=(27) +965 150100 ++1 225225 +fe=(32) +0 150150 +564 450450 +-20 400 +fi=(86) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/layout.rs +75 50 ++38 50 +0 50 +fe=(32) +631 100 +fi=(23) +298 100 +128 50 +cfi=(6) +cfn=(5102) +calls=74 0 +* 50 ++2 150 +cfi=(24) +cfn=(5104) +calls=74 -89 +* 1900 +fi=(27) +965 100 ++1 150 +fe=(32) +0 100 +564 300 + +fn=(5902) +447 225000 +fi=(10) +3212 175000 +fi=(47) +478 50000 +fe=(32) +-17 50000 +0 50000 +cfi=(6) +cfn=(5102) +calls=37000 0 +0 25000 +0 50000 +465 50000 ++13 75000 +0 50000 +483 175000 +fi=(23) +130 25000 +cfi=(24) +cfn=(5104) +calls=37000 -89 +* 10653953 +fe=(32) +470 50000 + +fn=(5664) +186 300000 +493 75000 ++30 75000 +fi=(19) +1051 225000 +fe=(32) +529 450000 +cfn=(5232) +calls=111000 +15 +* 6225000 +fi=(27) +2177 150000 ++1 75000 +fe=(32) +773 75000 ++1 75000 +189 300000 + +fn=(6014) +186 900 +493 225 ++30 225 +fi=(19) +1051 675 +fe=(32) +529 1350 +cfn=(5232) +calls=333 +15 +* 40950 +fi=(27) +2177 450 ++1 225 +fe=(32) +773 225 ++1 225 +189 900 + +fn=(5510) +186 300 +493 50 ++30 50 +fi=(19) +1051 150 +fe=(32) +529 200 +cfn=(5232) +calls=74 +15 +* 3550 +fi=(27) +2177 100 ++1 50 +fe=(32) +773 50 ++1 50 +189 250 + +fn=(5534) +658 300 +512 150 +fi=(10) +938 75 +fi=(47) +478 75 +0 75 +fe=(32) +523 150 +fi=(19) +1051 150 +fe=(32) +159 525 +fi=(19) +1051 225 +fe=(32) +529 300 +cfn=(5232) +calls=1118 +15 +* 6775 +fi=(27) +2177 150 ++1 75 +fe=(32) +773 75 ++1 75 +668 300 +-10 150 +fi=(10) +938 50 +fi=(47) +478 50 +0 50 +fe=(32) +523 100 +fi=(19) +1051 250 +fe=(32) +529 350 +cfn=(5232) +calls=1074 +15 +* 4375 +fi=(27) +2177 100 ++1 50 +fe=(32) +773 50 ++1 50 +668 200 + +fn=(5688) +186 100 +493 25 ++30 25 +fi=(19) +1051 75 +fe=(32) +529 150 +cfn=(5232) +calls=37 +15 +* 20393 +fi=(27) +2177 50 ++1 25 +fe=(32) +773 25 ++1 25 +189 100 + +fn=(5572) +186 100 +493 25 ++30 25 +fi=(19) +1051 75 +fe=(32) +529 150 +cfn=(5232) +calls=37 +15 +* 2075 +fi=(27) +2177 50 ++1 25 +fe=(32) +773 25 ++1 25 +189 100 + +fl=(26) +fn=(5686) +65 75200 +cob=(2) +cfi=(2) +cfn=(4880) +calls=112323 -65 +* 2487000 + +fl=(59) +fn=(6144) +2138 75 ++6 25 +fi=(18) +842 25 ++5 25 +cfi=(55) +cfn=(6146) +calls=37 3486 +* 450 +fi=(119) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/rc.rs +3277 25 +fe=(59) +3392 25 +fi=(13) +4049 25 +fe=(59) +3544 25 +fi=(23) +175 175 +cfi=(26) +cfn=(5686) +calls=37 65 +* 850 +fe=(59) + +fl=(24) +fn=(5142) +cfn=(6440) measured_region +calls=1 79 +70 296585254 + +fn=(6440) +79 9 +fi=(19) +2144 1 +fi=(34) +1100 1 +0 10 +fi=(26) +0 5 +fi=(150) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hint.rs +491 4 +fi=(13) +4029 1 +fi=(59) +2434 1 +fi=(26) +0 24 +fi=(150) +491 96 +fi=(13) +4029 24 +fi=(59) +2434 24 +fe=(24) +89 125 +cfi=(74) +cfn=(5468) +calls=25 362 +* 284135332 +fi=(27) +1230 50 ++1 200 +fe=(24) +89 50 +cfi=(18) +cfn=(6386) +calls=25 847 +* 12449239 +fi=(19) +2144 25 +fi=(34) +1100 25 +fe=(24) +94 8 + +fn=(5104) +41 125250 +fi=(13) +3994 125250 +762 125250 +fe=(24) +16 125250 +fi=(25) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs +161 501000 +fi=(26) +30 250500 ++1 250500 +cob=(2) +cfi=(2) +cfn=(4226) +calls=186395 -31 +* 17149778 +fe=(24) + +fn=(5542) +41 25350 +fi=(13) +3994 25350 +762 25350 +fe=(24) +33 25350 +fi=(89) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs +-33 126750 +405 50700 +fi=(26) +70 50050 ++1 50050 +cob=(2) +cfi=(2) +cfn=(4458) +calls=37037 -71 +* 6884647 +-1 650 ++1 650 +cob=(2) +cfi=(2) +cfn=(4458) +calls=2488 -71 +* 50668 +fe=(24) + +fl=(92) +fn=(5706) +1497 1100000 +fi=(10) +1096 200000 +fi=(44) +90 100000 +fi=(102) +-62 200000 ++13 200000 +-41 200000 +42 850000 ++4 425000 +-5 950000 +fe=(92) +1499 700000 + +fl=(38) +fn=(5184) +89 1125250 +fi=(39) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs ++44 675150 ++12 450100 +0 1575350 +164 225050 ++1 450100 +fi=(10) +2689 450100 +3875 225050 +fi=(39) +222 225050 ++2 450100 ++17 450100 +0 225050 +241 3590050 ++1 1795025 +-1 3815100 +fe=(38) +94 900200 +-94 225050 +98 900200 + +ob=(1) /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 +fl=(1) ??? +fn=(0) 0x0000000000023340 +cob=(6) +cfi=(6) +cfn=(4126) +calls=1 0 +0 296585254 + +totals: 296585254 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000-annotated.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000-annotated.txt new file mode 100644 index 0000000..22bbb9f --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000-annotated.txt @@ -0,0 +1,92 @@ +-------------------------------------------------------------------------------- +Profile data file 'benchmarks/rust-runtime-investigation/target/evidence/candidate/write-1000.callgrind' (creator: callgrind-3.26.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 28034902 +Trigger: Program termination +Profiled target: benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics write 1000 25 instructions (PID 373380, part 1) +Events recorded: Ir +Events shown: Ir +Event sort order: Ir +Thresholds: 95 +Include dirs: +User annotated: +Auto-annotation: off + +-------------------------------------------------------------------------------- +Ir +-------------------------------------------------------------------------------- +73,143,030 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir file:function +-------------------------------------------------------------------------------- +7,925,000 (10.83%) crates/polyxml-core/src/serializer.rs:::write_model::<&mut alloc::vec::Vec>'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] +6,239,550 ( 8.53%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs:core::str::converts::from_utf8 +5,451,300 ( 7.45%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/writer.rs:>>::write_event:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] +4,801,200 ( 6.56%) ???:0x0000000000197a00 [/usr/lib/x86_64-linux-gnu/libc.so.6] +2,962,775 ( 4.05%) ???:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] +2,500,200 ( 3.42%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::_escape::::{closure#0}, &str> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] +2,240,625 ( 3.06%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/algorithm.rs:::format_scalar_to +2,100,350 ( 2.87%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs:core::str::converts::from_utf8 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] +2,100,000 ( 2.87%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::write_model::<&mut alloc::vec::Vec>'2 +2,050,200 ( 2.80%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:quick_xml::escape::_escape::::{closure#0}, &str> +2,012,750 ( 2.75%) crates/polyxml-core/src/serializer.rs:::format_scalar_to [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] +1,800,700 ( 2.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>>::write_event:: +1,726,575 ( 2.36%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>>::write_event:: +1,433,475 ( 1.96%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/jeaiii.rs:::format_scalar_to +1,325,400 ( 1.81%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:>>::write_event:: +1,187,750 ( 1.62%) ???:0x00000000000b4180 [/usr/lib/x86_64-linux-gnu/libc.so.6] +1,175,000 ( 1.61%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::write_model::<&mut alloc::vec::Vec>'2 +1,150,000 ( 1.57%) crates/polyxml-core/src/serializer.rs:::validate_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] +1,079,375 ( 1.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>::reserve::do_reserve_and_handle:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] +1,062,650 ( 1.45%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 916,750 ( 1.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::_escape::::{closure#0}, &str> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 900,000 ( 1.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::write_model::<&mut alloc::vec::Vec>'2 + 877,975 ( 1.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::finish_grow [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 825,925 ( 1.13%) ???:free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 775,225 ( 1.06%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>>::write_event:: + 651,125 ( 0.89%) ???:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 600,150 ( 0.82%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/convert/mod.rs:>>::write_event:: + 500,000 ( 0.68%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::push_attribute::<(&str, &str)> + 466,750 ( 0.64%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 451,575 ( 0.62%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::finish_grow + 450,450 ( 0.62%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:core::str::converts::from_utf8 + 450,000 ( 0.62%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::push_attribute::<(&str, &str)> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 450,000 ( 0.62%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::write_model::<&mut alloc::vec::Vec>'2 + 425,425 ( 0.58%) crates/polyxml-core/src/schema.rs:::matches_variant [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 425,125 ( 0.58%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:>>::write_event:: + 425,000 ( 0.58%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::push_attr [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 402,850 ( 0.55%) crates/polyxml-core/src/serializer.rs:::write_model::<&mut alloc::vec::Vec> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 400,000 ( 0.55%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::push_attr + 375,000 ( 0.51%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::write_model::<&mut alloc::vec::Vec>'2 + 351,225 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs:__rustc::__rust_realloc + 350,100 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:>>::write_event:: + 350,000 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::push_attr + 325,000 ( 0.44%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::write_model::<&mut alloc::vec::Vec>'2 + 314,000 ( 0.43%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 300,000 ( 0.41%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:>::from [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics] + 300,000 ( 0.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::write_model::<&mut alloc::vec::Vec>'2 + 280,300 ( 0.38%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::format_scalar_to + 262,500 ( 0.36%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/write.rs:::format_scalar_to + 250,875 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::finish_grow + 250,875 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs:>::reserve::do_reserve_and_handle:: + 250,875 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::finish_grow + 250,000 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::write_model::<&mut alloc::vec::Vec>'2 + 225,225 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs:::matches_variant + 225,000 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::push_attr + 224,825 ( 0.31%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs:::format_scalar_to + 200,700 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs:__rustc::__rust_realloc + 200,000 ( 0.27%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:::write_model::<&mut alloc::vec::Vec>'2 + 200,000 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::push_attribute::<(&str, &str)> + 192,225 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::format_scalar_to + 175,700 ( 0.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::finish_grow + 168,725 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs:::format_scalar_to + 150,525 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>::reserve::do_reserve_and_handle:: + 150,000 ( 0.21%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/shared.rs:::format_scalar_to + 150,000 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::write_model::<&mut alloc::vec::Vec>'2 + 150,000 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::push_attr + 150,000 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs:::write_model::<&mut alloc::vec::Vec>'2 + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000-valgrind.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000-valgrind.txt new file mode 100644 index 0000000..a780af2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000-valgrind.txt @@ -0,0 +1,12 @@ +==373380== Callgrind, a call-graph generating cache profiler +==373380== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al. +==373380== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info +==373380== Command: benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics write 1000 25 instructions +==373380== Parent PID: 365338 +==373380== +==373380== For interactive control, run 'callgrind_control -h'. +==373380== +==373380== Events : Ir +==373380== Collected : 73143030 +==373380== +==373380== I refs: 73,143,030 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000.callgrind b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000.callgrind new file mode 100644 index 0000000..a5286ce --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/fifo/write-1000.callgrind @@ -0,0 +1,1874 @@ +# callgrind format +version: 1 +creator: callgrind-3.26.0 +pid: 373380 +cmd: benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics write 1000 25 instructions +part: 1 + + +desc: I1 cache: +desc: D1 cache: +desc: LL cache: + +desc: Timerange: Basic block 0 - 28034902 +desc: Trigger: Program termination + +positions: line +events: Ir +summary: 73143030 + + +ob=(1) /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 +fl=(1) ??? +fn=(0) 0x0000000000023340 +cob=(6) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/target/release/xml-diagnostics +cfi=(6) ??? +cfn=(4126) (below main) +calls=1 0 +0 73143030 + +ob=(2) /usr/lib/x86_64-linux-gnu/libc.so.6 +fl=(2) ??? +fn=(4162) 0x000000000002a580 +cob=(6) +cfi=(6) +cfn=(4176) main +calls=1 0 +0 73143030 + +fn=(4232) 0x00000000000b2400 +0 20825 +cfn=(4954) 0x00000000000b0f70 +calls=36 0 +0 775 +0 15950 +cfn=(4954) +calls=749 0 +0 2800 +0 2075 + +fn=(4978) 0x0000000000198400 +0 103400 + +fn=(4226) malloc +0 400 +cfn=(4232) +calls=4089 0 +0 10525 +0 650725 + +fn=(4460) 0x00000000000b4180 +0 1182900 +cfn=(4232) +calls=163 0 +0 31900 +0 1675 +cfn=(4502) 0x00000000000b2300 +calls=2112 0 +0 8425 +0 1050 +cfn=(4954) +calls=109 0 +0 1650 +0 1325 +cob=(3) ??? +cfi=(3) ??? +cfn=(4486) 0x0000000004b296a0 +calls=162 0 +0 620850 +0 600 +cfn=(4502) +calls=162 0 +0 13900 +0 200 + +fn=(4954) +0 8275 + +fn=(4128) (below main) +cfn=(4162) +calls=1 0 +0 73143030 + +fn=(4458) realloc +0 2685850 +cfn=(4460) +calls=38275 0 +0 1864475 +0 276925 + +fn=(4880) free +0 300 +cfn=(4508) 0x00000000000b20e0 +calls=4021 0 +0 3175 +0 825625 + +fn=(4502) +0 2100 +cfn=(4508) +calls=2274 0 +0 19350 +0 875 + +fn=(4508) +0 18350 +cfn=(4954) +calls=721 0 +0 3050 +0 1125 + +fn=(4488) 0x0000000000197a00 +0 4801200 + +ob=(3) +fl=(3) +fn=(4486) +0 200 +cob=(2) +cfi=(2) +cfn=(4488) +calls=213 0 +0 620650 + +ob=(6) +fl=(38) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs +fn=(5184) core::str::converts::from_utf8 +89 750125 +fi=(39) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs ++44 450075 ++12 300050 +0 1050175 +145 250 ++19 150150 ++1 300300 +fi=(10) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs +2689 300300 +3875 150150 +fi=(39) +222 150150 ++23 250 +-21 300050 ++17 300050 +0 150025 +241 1175200 ++1 587600 +-1 1325225 +fe=(38) +94 600100 +-94 150025 +98 600100 + +fl=(107) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs +fn=(6262) quick_xml::escape::_escape::::{closure#0}, &str> +201 225000 ++3 50000 +fi=(20) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs +970 25000 +fi=(14) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs +1663 25000 +fi=(50) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs +180 25000 +0 225000 +fi=(14) +1663 144500 +fi=(50) +385 72250 +fi=(14) +1663 144500 +fi=(50) +379 144500 +fe=(107) +169 72250 +0 144500 +218 75000 ++7 125000 ++2 225000 + +fn=(6294) quick_xml::escape::_escape::::{closure#0}, &str> +201 500000 ++3 50000 +fi=(14) +1663 50000 +fi=(50) +180 50000 +0 250000 +180 250000 +0 150000 +fi=(14) +1663 675100 +fi=(50) +385 337550 +fi=(14) +1663 337550 +fi=(50) +180 337550 +379 675100 +fe=(107) +109 337550 +0 712650 +218 250000 ++7 200000 ++2 450000 + +fl=(100) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs +fn=(6248) ::push_attribute::<(&str, &str)> +256 175000 +fi=(101) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs ++28 75000 +fi=(32) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs +611 25000 +fi=(126) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/char/methods.rs +2558 25000 +fi=(40) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs +1440 25000 +fi=(33) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs +2224 75000 +fi=(142) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/convert/mod.rs +781 50000 +cfi=(94) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs +cfn=(6260) >::from +calls=36000 376 +* 2097500 +fe=(100) +261 75000 +cfn=(6270) ::push_attr +calls=36000 +41 +* 5899500 ++1 200000 +fi=(101) ++23 50000 +fi=(47) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs +478 25000 +fi=(32) +0 25000 +461 25000 +0 100000 +cfi=(6) +cfn=(5102) __rustc::__rust_no_alloc_shim_is_unstable_v2 +calls=36000 0 +0 25000 +0 25000 +fi=(23) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs +130 75000 +cfi=(24) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/candidate/src/main.rs +cfn=(5104) __rustc::__rust_alloc +calls=36000 -89 +* 950000 +fi=(32) +470 50000 +fi=(36) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/slice.rs +0 25000 +fi=(18) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs +573 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 375000 +* 50000 +fi=(101) +286 75000 +fi=(32) +672 175000 +cfn=(5534) >::reserve::do_reserve_and_handle:: +calls=36000 -14 +* 5375000 +* 75000 +fe=(100) + +fn=(6270) +302 225000 +fi=(101) +-18 75000 +fi=(33) +1461 50000 +fi=(103) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs +222 50000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +fi=(33) +2981 50000 +0 25000 +fi=(20) +970 25000 +fi=(18) +573 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 450000 +fi=(33) +2986 50000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +-59 25000 +fi=(18) +-38 25000 +fi=(33) +2986 50000 +fi=(101) +0 75000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +fi=(33) +2981 50000 +fi=(20) +970 50000 +fi=(18) +573 50000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 449500 +fi=(33) +2986 50000 +fi=(32) +764 25000 +-94 25000 +fi=(126) +2558 25000 +fi=(40) +1440 25000 +fi=(33) +2224 25000 +fi=(18) +847 75000 +fe=(100) +309 200000 +fi=(32) +672 100000 +cfn=(5534) +calls=36000 -14 +* 3125000 +-56 25000 +fi=(33) +3101 50000 +fe=(100) + +fl=(111) /home/bailey/github/PolyXML/crates/polyxml-core/src/lib.rs +fn=(6158) polyxml::serialize +40 50 +fi=(120) /home/bailey/github/PolyXML/crates/polyxml-core/src/serializer.rs +180 125 +cfn=(6160) ::serialize_with_options +calls=36 +3 +* 73138025 +* 25 +fe=(111) +47 75 + +fl=(6) +fn=(4126) +cob=(2) +cfi=(2) +cfn=(4128) +calls=1 0 +0 73143030 + +fn=(4176) +cfi=(8) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/rt.rs +cfn=(4178) std::rt::lang_start_internal +calls=1 152 +0 73143030 + +fn=(5102) +0 25025 + +fl=(120) +fn=(6160) +183 350 +cfi=(6) +cfn=(5102) +calls=36 0 +* 25 +fi=(23) +-53 75 +cfi=(24) +cfn=(5104) +calls=36 -89 +* 11950 +fi=(32) +470 50 +fi=(33) +969 75 +fe=(120) +192 50 +fi=(41) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs +0 25 +743 25 +0 25 +fi=(122) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/writer.rs +124 75 +fe=(120) ++73 50 +0 50 +199 75 +cfn=(6170) ::build +calls=36 22 +* 7000 +fi=(41) +743 75 +0 25 +743 75 +0 50 +fe=(120) +202 225 +cfn=(6198) ::write_model::<&mut alloc::vec::Vec> +calls=36 302 +* 73117100 +* 25 +fi=(27) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs +2177 50 +fe=(120) +212 150 +fi=(18) +847 125 +fe=(120) +0 25 +213 200 + +fn=(6288) ::validate_scalar +285 200000 ++10 50000 +-9 150000 ++9 200000 +-9 350000 ++13 50000 ++1 150000 + +fn=(6170) +22 250 +fi=(33) +462 100 +fe=(120) +27 50 +cfn=(6172) ::collect_namespaces +calls=36 +60 +* 6150 +fi=(33) +3126 25 +fe=(120) +29 25 +fi=(41) +709 50 +fe=(120) +0 25 +30 25 +fi=(32) +425 50 +631 25 +fe=(120) +85 225 + +fn=(6198) +302 250 ++9 125 +0 50 +324 75 +0 25 +fi=(14) +454 25 +fi=(59) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs +2454 75 +fe=(120) +325 75 +cfi=(45) /home/bailey/github/PolyXML/crates/polyxml-core/src/schema.rs +cfn=(6200) ::matches_variant +calls=36 182 +* 950 +* 50 +fi=(50) +0 75 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 575 +fi=(41) +634 50 +fe=(120) +353 50 +0 25 +251 350 ++2 50 +-2 50 +fi=(27) +0 50 +fi=(14) +1663 25 +fi=(50) +180 25 +0 25 +fi=(41) +634 50 +fe=(120) +361 25 +fi=(23) +0 75 +fe=(120) +409 25 +cfi=(38) +cfn=(5184) +calls=36 89 +* 2600 +fi=(27) +0 50 +2177 50 +fi=(111) +0 25 +fe=(120) +410 50 ++3 75 +fi=(100) +124 100 +0 25 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 500 +fi=(14) +1663 25 +fi=(50) +180 25 +fe=(120) +434 125 ++33 50 ++21 200 +cfi=(122) +cfn=(6218) >>::write_event:: +calls=36 262 +* 2050 +* 25 +0 25 +fi=(27) +965 50 +fi=(111) +0 25 +fe=(120) +492 50 ++30 50 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 475 +fe=(120) +616 125 +345 50 +fi=(44) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs +184 50 ++2 50 +fi=(41) +743 50 +0 50 +fi=(129) /home/bailey/github/PolyXML/crates/polyxml-core/src/value.rs +59 25 +fe=(120) +618 25 +fi=(41) +743 75 +fi=(27) +0 25 +fi=(41) +743 50 +fe=(120) +624 225 +0 25 +656 50 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 25075 +fi=(14) +1663 25000 +fi=(50) +180 25000 +fi=(28) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/boxed.rs +2415 25000 +fe=(120) +658 175000 +fi=(41) ++85 50000 +fi=(14) +454 25000 +fi=(41) +743 50000 +fi=(23) +0 25000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fi=(59) +2454 25000 +fe=(120) +714 200000 +cfn=(6199) ::write_model::<&mut alloc::vec::Vec>'2 +calls=36000 302 +* 72328100 +* 25000 +fi=(27) +2177 50000 +fe=(120) +0 25 +fi=(41) +743 25 +fi=(118) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs +0 50 +fi=(14) +1663 25 +fi=(50) +180 25 +fi=(101) +350 50 +fe=(120) +756 175 +cfi=(122) +cfn=(6218) +calls=36 262 +* 2025 +fi=(27) +965 50 +fe=(120) +760 200 +0 25 +759 25 ++1 25 +fi=(18) ++87 50 +fi=(23) +0 25 +fi=(18) +847 75 +fe=(120) + +fn=(6199) +302 250000 ++9 125000 +0 50000 +324 75000 +0 25000 +fi=(14) +454 25000 +fi=(59) +2454 75000 +fe=(120) +325 75000 +cfi=(45) +cfn=(6200) +calls=36000 182 +* 950000 +* 50000 +fi=(50) +0 75000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 575000 +fi=(41) +634 150000 +fe=(120) +353 150000 +0 75000 +251 750000 +353 150000 +fi=(27) +0 150000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +0 25000 +fi=(41) +634 50000 +fe=(120) +361 25000 +fi=(23) +0 75000 +fe=(120) +409 25000 +cfi=(38) +cfn=(5184) +calls=36000 89 +* 1475000 +fi=(27) +0 50000 +2177 50000 +fi=(111) +0 25000 +fe=(120) +410 50000 ++3 75000 +fi=(100) +124 100000 +0 25000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 550000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 100000 +fi=(14) +1663 50000 +fi=(50) +180 50000 +fe=(120) +434 375000 +0 25000 +345 50000 +fi=(44) +184 50000 ++2 50000 +fi=(41) +743 50000 +0 50000 +fi=(129) +59 25000 +fe=(120) +436 25000 +0 25000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fe=(120) +437 50000 +cfi=(38) +cfn=(5184) +calls=36000 89 +* 1225000 +fi=(27) +0 50000 +2177 50000 +0 25000 +fe=(120) +410 25000 ++28 25000 ++3 75000 +-3 25000 +0 25000 +443 100000 ++1 100000 +cfn=(6236) ::format_scalar_to +calls=36000 216 +* 2805750 +* 125000 +295 25000 +-9 100000 +445 50000 +295 150000 +-9 75000 +fi=(101) ++64 25000 +fe=(120) ++96 175000 +cfi=(100) +cfn=(6248) +calls=36000 256 +* 16322000 +fi=(18) +847 125000 +fe=(120) +286 125000 +467 50000 ++21 200000 +cfi=(122) +cfn=(6218) +calls=36000 262 +* 2944050 +* 25000 +0 25000 +fi=(27) +965 50000 +fi=(111) +0 25000 +fe=(120) +492 50000 ++30 50000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 475000 +fe=(120) +616 375000 +345 100000 +fi=(44) +184 100000 ++2 100000 +fi=(41) +743 100000 +0 100000 +fi=(129) +59 50000 +fe=(120) +618 50000 +fi=(41) +743 150000 +fi=(27) +0 50000 +fi=(41) +743 100000 +fe=(120) +624 450000 +fi=(41) +0 100000 +fe=(120) +626 200000 ++1 200000 +cfn=(6236) +calls=72000 216 +* 8087575 +* 150000 +0 100000 +627 100000 +fi=(32) +-16 50000 +fi=(33) +1865 50000 +fe=(120) +628 250000 +cfn=(6288) +calls=72000 285 +* 1150000 +fi=(27) +2177 100000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(120) +629 100000 +cfi=(38) +cfn=(5184) +calls=72000 89 +* 3075000 +fi=(27) +0 100000 +2177 100000 +0 50000 +fe=(120) +410 50000 +630 50000 +0 50000 +fi=(41) +743 50000 +fi=(33) +0 50000 +fe=(120) +633 150000 ++4 400000 +cfi=(122) +cfn=(6218) +calls=72000 262 +* 4121050 +fi=(27) +965 100000 +fi=(107) +108 200000 +cfn=(6294) +calls=72000 +93 +* 5613050 +fi=(100) +564 250000 +fe=(120) ++80 200000 +cfi=(122) +cfn=(6218) +calls=72000 262 +* 3765775 +fi=(27) +965 100000 +fe=(120) +649 350000 +cfi=(122) +cfn=(6218) +calls=72000 262 +* 4068850 +fi=(27) +965 100000 +fe=(120) +653 50000 +fi=(18) +847 100000 +fi=(23) +0 50000 +fi=(18) +847 100000 +fi=(118) +0 150000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +fi=(101) +350 50000 +fe=(120) +756 175000 +cfi=(122) +cfn=(6218) +calls=36000 262 +* 2025000 +fi=(27) +965 50000 +fe=(120) +760 200000 +0 25000 +759 25000 ++1 25000 +fi=(18) ++87 50000 +fi=(23) +0 25000 +fi=(18) +847 75000 +fe=(120) + +fn=(6236) +216 600000 ++4 300000 +0 75000 +220 225000 ++7 25000 +fi=(143) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/f64.rs +1264 25000 +886 100000 +fi=(115) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs +1037 50000 +fi=(32) +611 50000 +fe=(120) +223 25000 +fi=(19) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs +2144 25000 +fi=(144) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/api.rs +50 25000 +fi=(123) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/jeaiii.rs +310 50000 ++2 50000 +118 22500 ++2 45000 ++1 45000 +fi=(124) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs +-60 22500 +fi=(123) ++16 22500 +-39 45000 ++76 67500 +fi=(44) +219 22500 +fi=(123) +68 22500 ++20 22500 ++1 22500 +-21 22500 ++21 45000 +314 22500 +0 125000 +fi=(128) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/bit.rs +178 50000 +fi=(19) +2105 25000 +fi=(125) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/write.rs +121 25000 +fi=(10) +0 25000 +fi=(127) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/algorithm.rs +292 50025 +0 50 +fi=(128) +282 50 +fi=(10) +154 25 +fi=(145) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/decimal.rs +32 50 +fi=(44) +186 25 +fi=(19) +2150 25 +fi=(145) +108 25 +fi=(127) +-54 25 +fi=(146) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/shared.rs +181 100 +fi=(128) +282 49950 +fi=(10) +154 24975 +fi=(145) +32 49950 +fi=(44) +186 24975 +fi=(19) +2150 24975 +fi=(145) +108 24975 +fi=(127) +-54 24975 +fi=(146) +181 99900 +fi=(123) +0 25000 +fi=(146) +186 50000 +fi=(127) +53 50000 +fi=(123) +310 50000 ++2 24500 +118 9375 ++2 18750 ++1 28125 +fi=(124) +-60 3350 +fi=(123) ++16 3350 +-39 6700 ++76 10050 +fi=(44) +219 3350 +fi=(123) +68 3350 ++20 3350 ++1 3350 +-21 3350 ++21 6700 +fi=(127) +225 3350 ++3 9500 +fi=(44) +0 99900 +fi=(127) +352 24975 +0 49950 +fi=(128) +178 24975 +fi=(115) +1057 74925 +fi=(19) +2105 24975 +fi=(115) +1057 99900 +fi=(147) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/int_macros.rs +2261 24975 +fi=(127) +875 24975 +456 49950 +fi=(44) +219 24975 +fi=(147) +2261 24975 +fi=(44) +219 49950 +fi=(148) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/index.rs +13 24975 +fi=(127) +883 24975 +457 24975 +1381 149850 +fi=(148) +13 24975 +fi=(127) +461 49950 ++12 74925 +836 99900 +-6 74925 ++7 49950 +-7 99900 +968 24975 +fi=(10) +2728 24975 +fi=(127) +484 24975 ++13 49950 +-51 24975 ++54 24975 +fi=(123) +314 5000 +fi=(44) +-95 2250 +fi=(123) +68 2250 ++20 4500 +fe=(120) +-88 12750 +fi=(123) +319 38250 ++2 25500 +fi=(124) +61 250 +fi=(123) ++16 500 +314 250 +0 4500 +314 8625 +fi=(44) +-95 2350 +fi=(123) +68 4700 ++20 2350 ++1 4700 +fi=(127) +225 2350 ++3 7000 +fi=(44) +-9 6025 +fi=(123) +68 12050 ++20 6025 ++1 6025 +-51 12050 ++76 18075 +-46 6025 ++20 6025 ++1 6025 +-21 6025 ++21 12050 +fi=(127) +225 6025 ++3 12675 +fi=(123) ++98 25500 +fi=(124) +61 525 +fi=(123) ++16 525 +fi=(127) +225 1575 +0 24975 +1398 74925 +535 24975 +1404 149850 ++2 124875 +0 24975 +fi=(10) +2728 24975 +fi=(127) +1088 24975 +1412 74925 +0 36050 +fi=(10) +2728 36050 +fi=(127) +1088 36050 +1412 108150 +fi=(10) +2728 24975 +fi=(127) +1088 24975 +1421 124875 +-32 49950 +fi=(123) +328 38250 +118 12750 ++2 25500 ++1 25500 +fi=(124) +-60 10250 +fi=(123) ++16 10250 +-39 30750 ++76 30750 +fi=(44) +219 10250 +fi=(123) +68 10250 ++20 10250 ++1 10250 +-21 10250 ++21 10250 +-51 10250 ++76 30750 +-46 10250 ++20 10250 ++1 10250 +-21 10250 ++21 20500 +fi=(127) +225 10250 ++3 20500 ++19 37500 +fi=(44) +102 18750 +fi=(34) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/range.rs +1142 37500 +0 18750 +1142 18750 +fi=(19) +2144 18750 +0 18750 +2144 18750 +fi=(127) +251 56250 +fi=(34) +1142 18750 +fi=(19) +2144 12500 +fi=(127) +251 37500 +fi=(34) +1142 12500 +fi=(127) +248 18750 ++7 18750 +fi=(125) +154 18750 +fi=(10) +1092 18750 +fi=(44) +219 2500 +fi=(123) +68 5000 ++20 2500 ++1 2500 +-51 7500 ++76 7500 +-46 2500 ++20 2500 ++1 2500 +-21 2500 ++21 2500 +-51 2500 ++76 7500 +-46 2500 ++20 2500 ++1 2500 +-21 2500 ++21 5000 +fi=(127) +225 2500 ++3 5000 +fi=(10) +1096 12500 +fi=(44) +102 12500 +fi=(149) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/specialize.rs +-68 18750 +cob=(2) +cfi=(2) +cfn=(4978) +calls=9000 -34 +* 103400 +fi=(127) +236 6250 ++3 6250 +fi=(125) +-85 12500 +0 31250 +cfi=(38) +cfn=(5184) +calls=9000 89 +0 403500 +0 175000 +cfi=(38) +cfn=(5184) +calls=63000 89 +0 2609250 +fi=(27) +714 100000 ++1 50000 +fe=(120) +0 100000 +234 400000 +0 50000 +234 200000 + +fn=(6172) +87 225 ++1 100 +fi=(33) +-88 25 +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 150 +180 25 +fi=(14) +454 25 +fi=(59) +2454 50 +fe=(120) +0 25 +cfn=(6173) ::collect_namespaces'2 +calls=36 87 +0 3225 +0 25 +fi=(14) +1663 25 +fi=(50) +180 25 +fe=(120) +-86 50 ++5 225 +fi=(28) +2415 25 +fe=(120) +102 75 +fi=(14) +454 25 +fe=(120) +102 25 +0 25 +109 50 +0 50 +125 25 +cfi=(45) +cfn=(6182) ::variants +calls=36 +18 +* 1200 +fi=(33) +3101 25 ++25 50 +fe=(120) +126 25 +fi=(32) +425 50 +631 25 +fe=(120) +134 200 + +fn=(6173) +87 225 ++1 100 +fi=(33) +-88 25 +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 150 +180 25 +fe=(120) +0 75 +fi=(14) +1663 75 +fi=(50) +180 75 +fe=(120) +-86 150 ++5 525 +-99 25 +109 50 +0 50 +125 25 +cfi=(45) +cfn=(6182) +calls=36 +18 +* 1200 +fi=(33) +3101 25 ++25 50 +fe=(120) +126 25 +fi=(32) +425 50 +631 25 +fe=(120) +134 200 + +fl=(94) +fn=(6260) +376 75000 ++2 50000 ++1 50000 +fi=(107) +168 50000 +cfn=(6262) +calls=36000 +33 +* 1722500 +* 25000 +fe=(94) +377 25000 ++4 100000 + +fl=(8) +fn=(5138) std::rt::lang_start::<()>::{closure#0} +cfi=(30) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/backtrace.rs +cfn=(5140) std::sys::backtrace::__rust_begin_short_backtrace:: +calls=1 162 +206 73143030 + +fn=(4178) +fi=(150) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/function.rs +cfn=(5138) +calls=1 206 +287 73143030 +fe=(8) + +fl=(45) +fn=(6200) +182 200200 +fi=(14) +454 25025 +fi=(13) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs +3994 25025 +fi=(97) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs +54 50050 ++45 25025 +fi=(13) +4149 25025 +fi=(97) +97 25025 +fi=(13) +3994 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +fi=(50) +180 25025 +0 75075 +fi=(13) +4049 25025 +fi=(97) +111 25025 ++7 100100 +fe=(45) ++73 225225 + +fn=(6182) +143 350 +fi=(14) +454 50 +fi=(59) +2454 50 +fi=(13) +3994 50 +fi=(97) +54 100 ++45 50 +fi=(13) +4149 50 +fi=(97) +97 50 +fi=(13) +3994 50 +fi=(33) +1865 50 +fi=(10) +3212 350 +fi=(47) +478 100 +fi=(32) +-17 100 +fi=(121) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/take.rs +0 50 +fi=(36) +440 200 +fi=(13) +4049 50 +fi=(97) +111 50 ++7 200 +fe=(45) ++30 450 + +fl=(30) +fn=(5140) +fi=(150) +cfi=(24) +cfn=(5142) xml_diagnostics::main +calls=1 43 +250 73143030 +fe=(30) + +fl=(122) +fn=(6218) +262 1600400 +fi=(142) +792 600150 +fe=(122) +264 600150 ++1 300100 ++53 75025 +0 75025 +318 75025 +-31 150000 ++26 50000 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 50000 +-94 50000 +fi=(33) +2981 99850 +0 50000 +fi=(20) +970 50000 +fi=(18) +573 150000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=72000 0 +* 705300 +fi=(33) +2986 100000 +fe=(122) +0 250000 +272 300100 +fi=(41) +765 150050 +fi=(33) +1461 75025 +fi=(32) +764 75025 +-94 75025 +-59 75025 +fi=(18) +-38 75025 +fi=(33) +2986 150050 +fi=(32) +616 75025 +fi=(10) +2689 150050 +fi=(32) +764 75025 +-94 75025 +fi=(33) +2981 149900 +0 75025 +fi=(20) +970 150050 +fi=(18) +573 150050 +cob=(2) +cfi=(2) +cfn=(4488) +calls=108036 0 +* 1075375 +fi=(32) ++43 75025 +fi=(33) +2986 150050 +fi=(32) +764 75025 +-94 75025 +-59 75025 +fi=(18) +-38 75025 +fi=(33) +2986 150050 +fi=(41) +765 225075 +fi=(18) ++82 275100 +fe=(122) +0 75025 +fi=(32) +616 75025 +fi=(33) +1461 75025 +fi=(10) +2689 75025 +fi=(32) +764 75025 +-94 75025 +-59 75025 +fi=(18) +-38 75025 +fi=(33) +2986 150050 +fi=(32) +616 75025 +fi=(10) +2689 150050 +fi=(32) +764 75025 +-94 75025 +fi=(33) +2981 150050 +0 75025 +fi=(20) +970 150050 +fi=(18) +573 150050 +cob=(2) +cfi=(2) +cfn=(4488) +calls=108036 0 +* 1125375 +fi=(32) ++43 75025 +fi=(33) +2986 150050 +fi=(32) +764 75025 +-94 75025 +-59 75025 +fi=(18) +-38 75025 +fi=(33) +2986 150050 +fi=(18) +847 300100 +fe=(122) +0 100000 +cfi=(26) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs +cfn=(5686) __rustc::__rust_dealloc +calls=36000 65 +0 850000 +fi=(41) +765 400100 +fe=(122) +308 1800450 +fi=(32) +672 450 +cfn=(5534) +calls=108 -14 +* 660025 +fi=(33) +3101 75 +2981 75 +fi=(32) +672 150 +cfn=(5534) +calls=36 -14 +* 18650 +fi=(33) +3101 50 +0 75 +fi=(32) +672 450 +cfn=(5534) +calls=108 -14 +* 39500 +fi=(33) +3101 150 +2981 75 +fe=(122) + +fl=(32) +fn=(5232) ::finish_grow +544 201400 +fi=(10) +3212 201400 +fi=(47) +478 75525 +0 25175 +fe=(32) +631 25175 +fi=(10) +1401 25175 +fi=(23) +228 125875 +cfi=(24) +cfn=(5542) __rustc::__rust_realloc +calls=36276 41 +* 4179875 +fi=(27) +965 50350 ++1 75525 +fe=(32) +0 50350 +564 151050 +-20 200000 +fi=(10) +3212 200000 +fi=(47) +478 75000 +fe=(32) +631 50000 +fi=(10) +1401 25000 +fi=(23) +228 125000 +cfi=(24) +cfn=(5542) +calls=36002 41 +* 1400000 +fi=(27) +965 50000 ++1 75000 +fe=(32) +0 50000 +564 150000 + +fn=(5534) +658 100700 +512 50350 +fi=(10) +938 25175 +fi=(47) +478 25175 +0 25175 +fe=(32) +523 50350 +fi=(19) +1051 50350 +fe=(32) +159 176225 +fi=(19) +1051 75525 +fe=(32) +529 100700 +cfn=(5232) +calls=36258 +15 +* 5186875 +fi=(27) +2177 50350 ++1 25175 +fe=(32) +773 25175 ++1 25175 +668 100700 +-10 75000 +fi=(10) +938 25000 +fi=(47) +478 25000 +0 25000 +fe=(32) +523 50000 +fi=(19) +1051 125000 +fe=(32) +529 175000 +cfn=(5232) +calls=36004 +15 +* 2400000 +fi=(27) +2177 50000 ++1 25000 +fe=(32) +773 25000 ++1 25000 +668 100000 + +fl=(26) +fn=(5686) +65 25000 +cob=(2) +cfi=(2) +cfn=(4880) +calls=42043 -65 +* 825000 + +fl=(24) +fn=(5142) +cfn=(6416) measured_region +calls=1 79 +70 73143030 + +fn=(6416) +79 9 +fi=(19) +2144 1 +fi=(34) +1100 1 +0 8 +fi=(26) +0 3 +fi=(19) +2144 25 +fi=(34) +1100 25 +fi=(131) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hint.rs +491 50 +fe=(24) +91 175 +cfi=(111) +cfn=(6158) +calls=25 -51 +* 73138300 +fi=(27) +1230 50 ++1 100 +fi=(131) +491 50 +fi=(32) +631 50 +425 25 +fi=(26) +65 25 +cob=(2) +cfi=(2) +cfn=(4880) +calls=25 -65 +* 4100 +* 25 +fe=(24) ++29 8 + +fn=(5104) +41 25025 +fi=(13) +3994 25025 +762 25025 +fe=(24) +16 25025 +fi=(25) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs +161 100100 +fi=(26) +30 50050 ++1 50050 +cob=(2) +cfi=(2) +cfn=(4226) +calls=46080 -31 +* 661650 +fe=(24) + +fn=(5542) +41 50175 +fi=(13) +3994 50175 +762 50175 +fe=(24) +33 50175 +fi=(89) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs +-33 250875 +405 100350 +fi=(26) +70 100350 ++1 100350 +cob=(2) +cfi=(2) +cfn=(4458) +calls=72278 -71 +* 4827250 +fe=(24) + +totals: 73143030 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-Cargo.toml b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-Cargo.toml new file mode 100644 index 0000000..90ec6de --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-Cargo.toml @@ -0,0 +1,9 @@ +[package] +name="xml-diagnostics" +version="0.0.0" +edition="2021" +[workspace] +[dependencies] +polyxml={path="/home/bailey/github/polyxml-perf-old/crates/polyxml-core"} +[profile.release] +debug=1 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-allocations.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-allocations.txt new file mode 100644 index 0000000..8c48158 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-allocations.txt @@ -0,0 +1,12 @@ +memcap: <=7726 MiB (60% of 12877 MiB available) [systemd MemoryMax, swap off] +operation=read,count=0,iterations=1,allocations=12,reallocations=5,requested_bytes=10325,input_bytes=94,output_bytes=94,field_schema_bytes=96,scalar_type_bytes=1,value_type_bytes=16,poly_value_bytes=56 +memcap: <=7738 MiB (60% of 12897 MiB available) [systemd MemoryMax, swap off] +operation=write,count=0,iterations=1,allocations=2,reallocations=2,requested_bytes=554,input_bytes=94,output_bytes=94,field_schema_bytes=96,scalar_type_bytes=1,value_type_bytes=16,poly_value_bytes=56 +memcap: <=7738 MiB (60% of 12897 MiB available) [systemd MemoryMax, swap off] +operation=read,count=1000,iterations=1,allocations=5010,reallocations=1014,requested_bytes=716634,input_bytes=63911,output_bytes=63411,field_schema_bytes=96,scalar_type_bytes=1,value_type_bytes=16,poly_value_bytes=56 +memcap: <=7738 MiB (60% of 12897 MiB available) [systemd MemoryMax, swap off] +operation=write,count=1000,iterations=1,allocations=1001,reallocations=2007,requested_bytes=158560,input_bytes=63911,output_bytes=63411,field_schema_bytes=96,scalar_type_bytes=1,value_type_bytes=16,poly_value_bytes=56 +memcap: <=7738 MiB (60% of 12897 MiB available) [systemd MemoryMax, swap off] +operation=read,count=10000,iterations=1,allocations=50010,reallocations=10019,requested_bytes=7773970,input_bytes=668911,output_bytes=663911,field_schema_bytes=96,scalar_type_bytes=1,value_type_bytes=16,poly_value_bytes=56 +memcap: <=7735 MiB (60% of 12892 MiB available) [systemd MemoryMax, swap off] +operation=write,count=10000,iterations=1,allocations=10001,reallocations=20011,requested_bytes=2376640,input_bytes=668911,output_bytes=663911,field_schema_bytes=96,scalar_type_bytes=1,value_type_bytes=16,poly_value_bytes=56 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-build.txt new file mode 100644 index 0000000..d786899 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-build.txt @@ -0,0 +1,35 @@ +memcap: <=7793 MiB (60% of 12989 MiB available) [systemd MemoryMax, swap off] + Locking 1 package to highest compatible version + Downgrading polyxml v0.34.6 (/home/bailey/github/polyxml-perf-old/crates/polyxml-core) -> v0.27.0 + Compiling proc-macro2 v1.0.107 + Compiling unicode-ident v1.0.26 + Compiling quote v1.0.47 + Compiling syn v3.0.6 + Compiling serde_core v1.0.229 + Compiling lexical-util v1.0.7 + Compiling serde v1.0.229 + Compiling serde_derive v1.0.229 + Compiling siphasher v1.0.4 + Compiling zmij v1.0.23 + Compiling phf_shared v0.14.0 + Compiling lexical-parse-integer v1.0.6 + Compiling lexical-write-integer v1.0.6 + Compiling memchr v2.8.3 + Compiling serde_json v1.0.151 + Compiling fastrand v2.5.0 + Compiling thiserror v2.0.21 + Compiling phf_generator v0.14.0 + Compiling lexical-write-float v1.0.6 + Compiling lexical-parse-float v1.0.6 + Compiling thiserror-impl v2.0.21 + Compiling memo-map v0.3.4 + Compiling itoa v1.0.18 + Compiling minijinja v2.24.0 + Compiling lexical-core v1.0.6 + Compiling phf_codegen v0.14.0 + Compiling quick-xml v0.42.0 + Compiling heck v0.5.0 + Compiling smallvec v1.16.2 + Compiling polyxml v0.27.0 (/home/bailey/github/polyxml-perf-old/crates/polyxml-core) + Compiling xml-diagnostics v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old) + Finished `release` profile [optimized + debuginfo] target(s) in 44.28s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-fixtures.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-fixtures.rs new file mode 100644 index 0000000..f231439 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-fixtures.rs @@ -0,0 +1,85 @@ +use std::hint::black_box; + +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize}; +use std::sync::Arc; + +fn build_sensor_fixture() -> (Arc, Vec) { + let schema = ModelSchema::builder("Sensor") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "temp", + b"temp", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .field(FieldSchema::new( + "status", + b"status", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "active", + b"active", + FieldKind::Element, + ValueType::Scalar(ScalarType::Bool), + )) + .build(); + + let xml = br#"23.75OPERATIONALtrue"#.to_vec(); + (schema, xml) +} + +fn build_catalog_fixture(count: usize) -> (Arc, Vec) { + let item_schema = ModelSchema::builder("Item") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "name", + b"name", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "price", + b"price", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .build(); + + let catalog_schema = ModelSchema::builder("Catalog") + .field(FieldSchema::new( + "items", + b"item", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Nested(item_schema))), + )) + .build(); + + let mut xml = String::with_capacity(count * 64 + 32); + xml.push_str(""); + for i in 0..count { + use std::fmt::Write; + write!( + xml, + r#"Part-{i}{:.2}"#, + (i as f64) * 1.25 + ) + .unwrap(); + } + xml.push_str(""); + + (catalog_schema, xml.into_bytes()) +} + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-harness.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-harness.rs new file mode 100644 index 0000000..1fbe95d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-harness.rs @@ -0,0 +1,94 @@ +// Fixture definitions are extracted verbatim from core_benchmarks.rs by run.py. +include!("fixtures.rs"); + +use std::alloc::{GlobalAlloc, Layout, System}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; + +struct CountingAllocator; +static COUNTING: AtomicBool = AtomicBool::new(false); +static ALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static REALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static BYTES: AtomicUsize = AtomicUsize::new(0); + +// Diagnostic instrumentation only. The benchmark consumers use System directly. +unsafe impl GlobalAlloc for CountingAllocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc(layout) } + } + unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc_zeroed(layout) } + } + unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { + unsafe { System.dealloc(ptr, layout) } + } + unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + REALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(new_size, Ordering::Relaxed); + } + unsafe { System.realloc(ptr, layout, new_size) } + } +} +#[global_allocator] +static ALLOCATOR: CountingAllocator = CountingAllocator; + +fn main() { + let args: Vec = std::env::args().collect(); + let operation = args.get(1).expect("read or write"); + let count: usize = args + .get(2) + .expect("0 for sensor, or catalog count") + .parse() + .unwrap(); + let iterations: usize = args.get(3).expect("iteration count").parse().unwrap(); + let mode = args.get(4).map(String::as_str).unwrap_or("allocations"); + let (schema, xml) = if count == 0 { + build_sensor_fixture() + } else { + build_catalog_fixture(count) + }; + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let root = if count == 0 { "Sensor" } else { "Catalog" }; + let output = serialize(root, &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + for _ in 0..10 { + if operation == "read" { + black_box(deserialize(&xml, Arc::clone(&schema)).unwrap()); + } else { + black_box(serialize(root, &value, &schema, None).unwrap()); + } + } + COUNTING.store(mode == "allocations", Ordering::Relaxed); + measured_region(operation, iterations, &xml, &value, root, &schema); + COUNTING.store(false, Ordering::Relaxed); + println!("operation={operation},count={count},iterations={iterations},allocations={},reallocations={},requested_bytes={},input_bytes={},output_bytes={},field_schema_bytes={},scalar_type_bytes={},value_type_bytes={},poly_value_bytes={}", + ALLOCATIONS.load(Ordering::Relaxed), REALLOCATIONS.load(Ordering::Relaxed), BYTES.load(Ordering::Relaxed), xml.len(), output.len(), + std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::()); +} + +#[inline(never)] +#[no_mangle] +fn measured_region( + operation: &str, + iterations: usize, + xml: &[u8], + value: &polyxml::PolyValue, + root: &str, + schema: &Arc, +) { + for _ in 0..iterations { + if operation == "read" { + black_box(deserialize(black_box(xml), Arc::clone(schema)).unwrap()); + } else { + black_box(serialize(root, black_box(value), schema, None).unwrap()); + } + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-metadata.json new file mode 100644 index 0000000..8f886bf --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old-metadata.json @@ -0,0 +1,5 @@ +{ + "revision": "cef575c11cc4f05e877ced157036f7ff53b8687b", + "executable": "/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics", + "profile": "release debug=1; allocation instrumentation; not used for latency numbers" +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old.lock new file mode 100644 index 0000000..f67463f --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/old.lock @@ -0,0 +1,278 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.27.0" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "xml-diagnostics" +version = "0.0.0" +dependencies = [ + "polyxml", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-annotated.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-annotated.txt new file mode 100644 index 0000000..c35febb --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-annotated.txt @@ -0,0 +1,191 @@ +-------------------------------------------------------------------------------- +Profile data file 'benchmarks/rust-runtime-investigation/target/evidence/old/read-1000.callgrind' (creator: callgrind-3.26.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 86391197 +Trigger: Program termination +Profiled target: benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics read 1000 25 instructions (PID 341913, part 1) +Events recorded: Ir +Events shown: Ir +Event sort order: Ir +Thresholds: 95 +Include dirs: +User annotated: +Auto-annotation: off + +-------------------------------------------------------------------------------- +Ir +-------------------------------------------------------------------------------- +283,054,621 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir file:function +-------------------------------------------------------------------------------- +21,680,675 ( 7.66%) ???:0x0000000000197a00 [/usr/lib/x86_64-linux-gnu/libc.so.6] +13,926,225 ( 4.92%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs:core::str::converts::from_utf8 +11,866,582 ( 4.19%) ???:0x00000000000b2400 [/usr/lib/x86_64-linux-gnu/libc.so.6] +10,868,100 ( 3.84%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::next [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] +10,402,925 ( 3.68%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 8,900,000 ( 3.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs: as core::hash::Hasher>::write [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 7,927,350 ( 2.80%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs:::deserialize_with_limit [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 7,802,014 ( 2.76%) ???:0x00000000000b20e0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 6,602,200 ( 2.33%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 5,426,700 ( 1.92%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/parser/element.rs:::feed [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 5,127,950 ( 1.81%) ???:free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 4,625,000 ( 1.63%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs:::hash_one::<&[u8]> + 4,403,350 ( 1.56%) ???:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 4,225,800 ( 1.49%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:> as core::iter::traits::iterator::Iterator>::next [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 4,001,000 ( 1.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 3,800,475 ( 1.34%) ???:0x00000000001972a0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 3,200,000 ( 1.13%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs:polyxml::parser::is_nil_element [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 3,176,250 ( 1.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::deserialize_with_limit + 3,175,500 ( 1.12%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:> as core::iter::traits::iterator::Iterator>::next + 3,150,700 ( 1.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs:core::str::converts::from_utf8 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 3,001,875 ( 1.06%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 3,000,000 ( 1.06%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::hash_one::<&[u8]> + 2,875,600 ( 1.02%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 2,825,875 ( 1.00%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs:polyxml::parser::namespace_scope [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 2,800,000 ( 0.99%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::deserialize_with_limit + 2,625,750 ( 0.93%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 2,425,000 ( 0.86%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/converters.rs:::parse_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 2,415,742 ( 0.85%) ???:0x00000000000b0f70 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,375,000 ( 0.84%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::hash_one::<&[u8]> + 2,325,000 ( 0.82%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::check_for_duplicates [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 2,250,000 ( 0.79%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:> as core::iter::traits::iterator::Iterator>::next + 2,076,050 ( 0.73%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::emit_start + 2,025,675 ( 0.72%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_end [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 2,025,675 ( 0.72%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_start [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 1,950,800 ( 0.69%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 1,948,250 ( 0.69%) ???:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,900,350 ( 0.67%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::next + 1,850,875 ( 0.65%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs:::parse_attributes [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 1,558,400 ( 0.55%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/parse.rs:::parse_scalar + 1,500,300 ( 0.53%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:> as core::iter::traits::iterator::Iterator>::next + 1,500,150 ( 0.53%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 1,500,000 ( 0.53%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/mod.rs:::hash_one::<&[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 1,489,425 ( 0.53%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 1,465,250 ( 0.52%) ???:0x00000000000b4180 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,366,800 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::next + 1,357,775 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::finish_grow [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 1,350,000 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>>::grow_one [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 1,300,275 ( 0.46%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 1,275,425 ( 0.45%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs:::emit_end + 1,250,450 ( 0.44%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:; 8]>>::from_elem + 1,200,400 ( 0.42%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 1,199,850 ( 0.42%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 1,175,000 ( 0.42%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::deserialize_with_limit + 1,150,300 ( 0.41%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:::feed + 1,075,300 ( 0.38%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 1,050,400 ( 0.37%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 1,050,300 ( 0.37%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:::feed + 1,050,300 ( 0.37%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::emit_end + 1,050,150 ( 0.37%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::deserialize_with_limit + 1,000,000 ( 0.35%) /rust/deps/hashbrown-0.17.1/src/raw.rs:::deserialize_with_limit + 1,000,000 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::deserialize_with_limit + 975,000 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 950,450 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs:::deserialize_with_limit + 950,100 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::next + 901,650 ( 0.32%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs:::finish [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 900,525 ( 0.32%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 900,300 ( 0.32%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 900,275 ( 0.32%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::emit_end + 900,100 ( 0.32%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 850,150 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 850,000 ( 0.30%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs:::local_name [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 850,000 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::local_name + 801,000 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::deserialize_with_limit + 800,575 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::emit_start + 800,200 ( 0.28%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:::deserialize_with_limit + 750,250 ( 0.27%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 750,250 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::emit_start + 750,000 ( 0.26%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::next + 750,000 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs: as core::hash::Hasher>::write + 750,000 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/hash/random.rs:::hash_one::<&[u8]> + 725,725 ( 0.26%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:; 8]>>::from_elem [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 725,000 ( 0.26%) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs:::deserialize_with_limit + 700,250 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 700,100 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::parse_scalar + 700,000 ( 0.25%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs:::new [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 675,675 ( 0.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter_nested.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 675,225 ( 0.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::emit_start + 675,150 ( 0.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:core::str::converts::from_utf8 + 675,000 ( 0.24%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::unescape [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 675,000 ( 0.24%) /rust/deps/hashbrown-0.17.1/src/map.rs:::deserialize_with_limit + 625,000 ( 0.22%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/macros/mod.rs:::parse_scalar + 603,525 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::finish_grow + 600,600 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 600,200 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 600,150 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:core::ptr::drop_glue::> + 600,000 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 575,250 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::deserialize_with_limit + 550,550 ( 0.19%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs:polyxml::parser::resolve_record_schema [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 525,200 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/mem/mod.rs:::deserialize_with_limit + 525,175 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::emit_end + 525,000 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::check_for_duplicates + 525,000 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::check_for_duplicates + 501,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs:__rustc::__rust_alloc + 501,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs:__rustc::__rust_alloc + 500,000 ( 0.18%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/number.rs:::try_fast_path:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 500,000 ( 0.18%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_text [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 500,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs: as core::hash::Hasher>::write + 480,650 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::parse_scalar + 475,475 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:>; 4]> as core::ops::drop::Drop>::drop [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 475,475 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:; 8]> as core::ops::drop::Drop>::drop [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 466,875 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 452,375 ( 0.16%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::finish_grow + 451,150 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::finish + 450,425 ( 0.16%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs:::push_list_item [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 450,150 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::emit_end + 450,150 ( 0.16%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 450,150 ( 0.16%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/clone.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 450,150 ( 0.16%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::emit_start + 450,100 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs:::parse_scalar + 450,050 ( 0.16%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 450,000 ( 0.16%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::parse_attributes + 425,850 ( 0.15%) ???:0x00000000000b2300 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 425,000 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::parse_scalar + 422,350 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 419,500 ( 0.15%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-integer-1.0.6/src/algorithm.rs:::parse_scalar + 400,400 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 400,300 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 400,125 ( 0.14%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 400,100 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 400,100 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::feed + 400,000 ( 0.14%) /rust/deps/hashbrown-0.17.1/src/lib.rs:::deserialize_with_limit + 377,250 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::finish_grow + 375,425 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::emit_start + 375,125 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::emit_start + 375,075 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:::deserialize_with_limit + 350,100 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:::feed + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>::push_mut [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs: as core::hash::Hasher>::write + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 325,075 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:::deserialize_with_limit + 300,300 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>>::into_boxed_slice [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 300,100 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 300,100 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,100 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,075 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:polyxml::parser::namespace_scope + 300,050 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,050 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs:::emit_end + 300,000 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/sse2.rs:::deserialize_with_limit + 300,000 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:polyxml::parser::is_nil_element + 300,000 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs:> as core::iter::traits::iterator::Iterator>::next + 300,000 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,000 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:::check_for_duplicates + 300,000 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::deserialize_with_limit + 291,750 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/traits/iterator.rs:::next + 275,000 ( 0.10%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/iterator.rs:::parse_scalar + 275,000 ( 0.10%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::deserialize_with_limit + 275,000 ( 0.10%) /rust/deps/hashbrown-0.17.1/src/control/tag.rs:::deserialize_with_limit + 275,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::deserialize_with_limit + 275,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs:::deserialize_with_limit + 250,500 ( 0.09%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:__rustc::__rust_alloc + 250,500 ( 0.09%) benchmarks/rust-runtime-investigation/target/old/src/main.rs:__rustc::__rust_alloc [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 250,100 ( 0.09%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::deserialize_with_limit + 250,000 ( 0.09%) /rust/deps/hashbrown-0.17.1/src/raw.rs:::parse_attributes + 226,525 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::finish_grow + 225,225 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs:polyxml::parser::resolve_record_schema + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-valgrind.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-valgrind.txt new file mode 100644 index 0000000..ad5cc3e --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-valgrind.txt @@ -0,0 +1,12 @@ +==341913== Callgrind, a call-graph generating cache profiler +==341913== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al. +==341913== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info +==341913== Command: benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics read 1000 25 instructions +==341913== Parent PID: 341905 +==341913== +==341913== For interactive control, run 'callgrind_control -h'. +==341913== +==341913== Events : Ir +==341913== Collected : 283054621 +==341913== +==341913== I refs: 283,054,621 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000.callgrind b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000.callgrind new file mode 100644 index 0000000..0e6f629 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/read-1000.callgrind @@ -0,0 +1,3453 @@ +# callgrind format +version: 1 +creator: callgrind-3.26.0 +pid: 341913 +cmd: benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics read 1000 25 instructions +part: 1 + + +desc: I1 cache: +desc: D1 cache: +desc: LL cache: + +desc: Timerange: Basic block 0 - 86391197 +desc: Trigger: Program termination + +positions: line +events: Ir +summary: 283054621 + + +ob=(3) ??? +fl=(3) ??? +fn=(4488) 0x000000000495a6a0 +0 50 +cob=(2) /usr/lib/x86_64-linux-gnu/libc.so.6 +cfi=(2) ??? +cfn=(4490) 0x0000000000197a00 +calls=110 0 +0 275 + +ob=(2) +fl=(2) +fn=(4130) (below main) +cfn=(4164) 0x000000000002a580 +calls=1 0 +0 283054621 + +fn=(4510) 0x00000000000b20e0 +0 4946901 +cfn=(4952) 0x00000000000b0f70 +calls=73348 0 +0 1088042 +0 2455988 +cfn=(4952) +calls=34982 0 +0 548077 +0 399125 + +fn=(4332) 0x00000000000b08d0 +0 120375 + +fn=(4490) +0 21680675 + +fn=(4234) 0x00000000000b2400 +0 10560889 +cfn=(4952) +calls=35804 0 +0 779623 +0 1275170 +cfn=(4332) +calls=33010 0 +0 118360 +0 6448 +cfn=(4332) +calls=649 0 +0 2015 +0 24075 + +fn=(4952) +0 2415742 + +fn=(4228) malloc +0 796400 +cfn=(4234) +calls=73729 0 +0 12754463 +0 3606950 + +fn=(4462) 0x00000000000b4180 +0 1109825 +cfn=(4234) +calls=63 0 +0 12117 +0 325500 +cfn=(4504) 0x00000000000b2300 +calls=37042 0 +0 3504972 +0 25225 +cob=(3) +cfi=(3) +cfn=(4488) +calls=62 0 +0 325 +0 150 +cfn=(4504) +calls=62 0 +0 2925 +0 4550 + +fn=(4878) free +0 597300 +cfn=(4510) +calls=73671 0 +0 6356086 +0 4530650 + +fn=(4164) +cob=(6) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics +cfi=(6) ??? +cfn=(4178) main +calls=1 0 +0 283054621 + +fn=(4460) realloc +0 1670225 +cfn=(4462) +calls=38415 0 +0 4985589 +0 278025 + +fn=(5714) 0x00000000001972a0 +0 3800475 + +fn=(4504) +0 300600 +cfn=(4510) +calls=37104 0 +0 3082047 +0 125250 + +ob=(6) +fl=(33) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs +fn=(5772) >::push_mut +1027 125000 ++2 25000 ++3 50000 +fi=(20) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs +-62 50000 +fi=(18) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs +1963 75000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37000 0 +* 2225000 +fe=(33) +1038 50000 ++4 100000 + +fn=(5888) >>::into_boxed_slice +1723 100100 +fi=(32) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs +616 25025 +fe=(33) +1598 75075 +fi=(32) +832 25025 +fi=(10) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs +1401 25025 +fi=(32) +839 50050 +fi=(10) +1401 25025 +fi=(23) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs +228 75075 +cfi=(24) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/src/main.rs +cfn=(5522) __rustc::__rust_realloc +calls=37037 41 +* 7258722 +fi=(27) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs +965 50050 +fe=(33) +1731 125125 + +fl=(55) /rust/deps/hashbrown-0.17.1/src/raw.rs +fn=(6070) as core::ops::drop::Drop>::drop +3486 175 +2656 50 +2271 25 +3498 200 + +fl=(94) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs +fn=(5572) > as core::iter::traits::iterator::Iterator>::next +854 1750350 +fi=(40) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs +-89 500100 +0 1000200 +fi=(95) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs +602 1250250 +cfn=(5576) ::next +calls=370074 1123 +* 28202100 +* 1250250 +fe=(94) +860 175050 ++1 175050 +fi=(95) +604 450000 +fi=(91) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs +129 525000 +fi=(95) +777 225000 +fi=(91) +129 150000 ++4 150000 ++12 150000 +fi=(44) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs +1229 75000 +fi=(91) +145 75000 ++1 150000 +fi=(44) +1229 75000 +fi=(91) +262 75000 +129 375000 ++4 150000 ++12 150000 +fi=(44) +1229 75000 +fi=(91) +145 75000 ++1 150000 +fi=(44) +1229 75000 +fi=(91) +262 75000 +fi=(54) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs +871 225000 +fe=(94) +-15 375000 ++5 1750350 + +fl=(53) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs +fn=(5288) as core::hash::Hasher>::write +256 250000 ++2 250000 ++4 750000 +0 500000 +278 250000 ++1 750000 ++3 500000 +0 625000 +fi=(18) +573 125000 +fe=(53) +288 125000 +fi=(10) +2652 125000 +fi=(47) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs +2215 125000 +fi=(10) +2652 125000 +fe=(53) +78 125000 +fi=(47) +2215 125000 +fe=(53) +79 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fe=(53) +79 125000 +fi=(47) +2215 250000 +fe=(53) +78 125000 +290 125000 ++2 125000 +-10 250000 +0 500000 +126 500000 +fi=(18) +573 200000 +fe=(53) +132 400000 +0 300000 +132 450000 +fi=(54) +871 25000 +fi=(18) +573 25000 +fe=(53) +134 75000 ++1 25000 ++2 500000 ++2 150000 +298 25000 +0 25000 +300 50000 +-2 225000 +0 225000 +300 450000 + +fl=(52) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/mod.rs +fn=(5702) ::hash_one::<&[u8]> +694 750000 ++5 125000 +fi=(53) +203 250000 +fi=(48) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/hash/random.rs +84 125000 +fi=(53) +204 250000 +fi=(48) +84 625000 +fi=(10) +4058 375000 +fi=(53) +233 375000 +cfn=(5288) +calls=185000 +23 +* 6875000 +* 500000 +cfn=(5288) +calls=185000 +23 +* 3650000 ++81 375000 +-2 250000 ++4 250000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(47) +2215 250000 +fi=(53) +78 125000 +318 125000 ++2 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 250000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 250000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 500000 +fi=(53) +323 375000 +fe=(52) +702 625000 + +fl=(105) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs +fn=(5744) quick_xml::escape::unescape +236 250000 ++52 25000 +fi=(54) +473 75000 +0 25000 +fi=(13) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs +3994 50000 +fi=(78) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs +153 125000 +cfi=(84) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs +cfn=(5474) memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 +calls=37000 659 +* 1053000 +fi=(40) +2869 50000 +fe=(105) +321 50000 +fi=(91) +0 25000 +fe=(105) +327 100000 +0 25000 +238 225000 + +fl=(8) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/rt.rs +fn=(4180) std::rt::lang_start_internal +fi=(141) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/function.rs +cfn=(5136) std::rt::lang_start::<()>::{closure#0} +calls=1 206 +287 283054621 +fe=(8) + +fn=(5136) +cfi=(30) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/backtrace.rs +cfn=(5138) std::sys::backtrace::__rust_begin_short_backtrace:: +calls=1 162 +206 283054621 + +fl=(85) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs +fn=(5486) <&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: +211 1800600 +fi=(33) +3101 150050 +1032 300100 ++1 100 +cfi=(32) +cfn=(5490) >::grow_one +calls=74 186 +* 4800 +fi=(32) +611 150050 +fi=(18) +1963 150050 +fi=(33) +1038 450150 +fi=(76) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs +137 150050 +fe=(85) ++86 150050 +0 450150 +232 450150 +cfi=(87) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/parser/element.rs +cfn=(5498) ::feed +calls=222074 57 +* 14181000 +* 300100 +0 150050 +233 450150 +fi=(10) +1092 150050 +fi=(32) +616 150050 +fi=(33) +1461 150050 +fi=(10) +2689 150050 +fi=(32) +764 150050 +-94 150050 +fi=(33) +2981 300000 +0 150050 +fi=(20) +970 150050 +fi=(18) +573 750250 +cob=(2) +cfi=(2) +cfn=(4490) +calls=222074 0 +* 2200650 +* 300100 +fi=(33) +2986 450150 +fi=(43) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs +90 150050 +fi=(142) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs +389 450150 +fe=(85) +239 600200 +fi=(43) +544 450150 +90 300100 +fe=(85) +240 300100 +cfi=(37) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs +cfn=(5186) core::str::converts::from_utf8 +calls=222074 89 +* 12090575 +fi=(27) +0 300100 +2177 300100 +fe=(85) +253 1200400 +0 150050 +240 600200 +fi=(33) +0 50 +fi=(32) +672 300 +cfn=(5514) >::reserve::do_reserve_and_handle:: +calls=74 -14 +* 6600 +* 100 +fi=(33) +3101 50 +2981 50 +fe=(85) + +fl=(18) +fn=(5586) core::ptr::drop_glue::> +847 700200 +fi=(32) +425 350100 +631 175050 +425 75000 +fi=(10) +1401 75000 +fi=(23) +175 150000 +cfi=(26) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs +cfn=(5662) __rustc::__rust_dealloc +calls=111000 65 +* 2550000 +fe=(18) +847 1925550 + +fn=(6326) core::ptr::drop_glue:: +847 275 +fi=(14) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs +454 25 +fi=(13) +4049 25 +fi=(73) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs +2868 25 +fe=(18) +847 450 +cfn=(6327) core::ptr::drop_glue::'2 +calls=37 * +* 12021911 +* 200 +cob=(2) +cfi=(2) +cfn=(4878) +calls=37 0 +* 825 + +fn=(6327) +847 1400275 +fi=(32) +631 50000 +fe=(18) +847 25000 +fi=(26) +65 25000 +fi=(14) +454 25000 +fi=(13) +4049 25000 +fi=(73) +2868 25000 +fe=(18) +847 900000 +cfn=(6327) +calls=111000 * +* 5850511 +* 75000 +fi=(32) +611 25 +fi=(33) +4358 25 +fe=(18) +847 125 +0 25 +847 50 +cfn=(6327) +calls=37 * +* 7861 +* 49950 +cfn=(6327) +calls=36963 * +* 11858982 +* 100000 +fi=(32) +631 50 +fe=(18) +847 175175 +cob=(2) +cfi=(2) +cfn=(4878) +calls=37037 0 +* 4520700 +* 150000 +cob=(2) +cfi=(2) +cfn=(4878) +calls=37000 0 +* 4475511 + +fn=(5778) core::ptr::drop_glue::> +847 1800450 +0 200050 +847 2000500 + +fl=(30) +fn=(5138) +fi=(141) +cfi=(24) +cfn=(5140) xml_diagnostics::main +calls=1 43 +250 283054621 +fe=(30) + +fl=(74) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/parser.rs +fn=(5592) polyxml::parser::resolve_record_schema +155 200200 +fi=(14) +454 25025 +fe=(74) +160 50050 +fi=(14) +454 25025 +fi=(13) +3994 25025 +fi=(96) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs +54 50050 ++45 25025 +fi=(13) +4149 25025 +fi=(96) +97 25025 +fi=(13) +3994 25025 +fi=(33) +3101 50050 +fi=(13) +4049 25025 +fi=(96) +111 25025 ++7 100100 +fi=(33) +3126 25025 +fe=(74) +160 25025 +fi=(13) +4029 25025 +fi=(73) +2434 25025 +fe=(74) +161 25025 +0 25025 +209 225225 + +fn=(5682) polyxml::parser::is_nil_element +91 525000 +fi=(98) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs +-91 75000 +fi=(99) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs +272 75000 +fe=(74) +92 1125000 +-92 75000 +fi=(94) +227 225000 +cfn=(5572) +calls=111000 854 +* 12758500 +* 75000 +cfn=(5572) +calls=37000 854 +* 1600000 +fe=(74) +92 450000 +fi=(101) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs +222 25000 +fi=(77) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs +21 50000 +fi=(76) +2635 25000 +fe=(74) +97 50000 +cfi=(101) +cfn=(5686) ::local_name +calls=37000 +44 +* 950000 +fi=(77) +-76 100000 +fi=(18) +847 75000 +fe=(74) +92 225000 ++11 75000 +cfi=(18) +cfn=(5586) +calls=111000 847 +* 2300000 ++2 675000 + +fn=(5866) ::finish +52 225225 +fi=(97) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs +1082 75075 +-30 25025 +-15 25025 +fe=(74) +53 25025 +-53 50 +fi=(97) +1082 25 +fe=(74) +54 300 +fi=(97) +996 50 ++56 25 +-56 25 +fe=(74) +54 25 +fi=(116) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs +-30 125 +fe=(74) ++30 25 +fi=(97) +2493 50 +0 125 +fe=(74) +56 200 +fi=(97) +2493 50 +0 25 +2493 50 ++5 50 +1082 50 +-30 25 +fi=(54) +871 25 +fi=(18) +1755 25 +fi=(40) +2869 50 +fi=(116) +80 25 +fi=(40) +2870 50 +fi=(116) +81 25 ++1 50 +fe=(74) +-27 100 ++1 50 +fi=(97) +1082 75 +-17 25 +fi=(43) +245 50 +0 25 +fi=(97) +1082 25 +-17 25 +fi=(43) +245 50 +fi=(18) +847 50 +0 25 +847 25 +cfi=(97) +cfn=(6064) >; 4]> as core::ops::drop::Drop>::drop +calls=37 2483 +* 500 +0 50 +847 25 +cfi=(97) +cfn=(5910) >; 4]> as core::ops::drop::Drop>::drop +calls=37 2373 +* 550 +0 25 +fi=(14) +454 25 +fe=(74) +61 75 +-61 25000 +fi=(14) +454 25000 +fe=(74) +61 50000 ++22 50050 ++1 75075 +fi=(97) +1082 25025 +1607 25025 +fe=(74) +84 25025 +fi=(97) +1615 100100 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37037 0 +* 1926925 +2552 50050 +-1 125125 +fi=(33) +3996 25025 +cfi=(115) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter.rs +cfn=(5870) > as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter +calls=37037 32 +* 11513714 +0 25025 +fe=(74) +84 25025 +cfi=(33) +cfn=(5888) +calls=37037 1723 +* 7834297 +-2 125125 ++4 50050 +fi=(18) +847 50000 +cfi=(97) +cfn=(5910) +calls=37000 2373 +* 550000 +* 75075 +fe=(74) +86 225225 + +fn=(5450) ::deserialize_with_limit +245 275 +fi=(75) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/mod.rs +810 300 +fi=(33) +462 125 +0 50 +fi=(85) +412 100 +cfi=(75) +cfn=(5452) >::read_event_impl::<&mut alloc::vec::Vec> +calls=37 1006 +* 24725 +fe=(74) +254 225 +fi=(23) +0 25 +fe=(74) +258 25 +fi=(143) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/thread_local/native/mod.rs +105 75 +fi=(144) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/thread_local/native/lazy.rs +-46 50 +fi=(59) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cell.rs +558 50 +fi=(10) +2652 25 +fi=(11) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/mem/mod.rs +976 25 +fi=(73) +440 200 +fi=(23) +128 25 +cfi=(6) +cfn=(5100) __rustc::__rust_no_alloc_shim_is_unstable_v2 +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5102) __rustc::__rust_alloc +calls=37 -89 +* 1050 +fi=(28) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/boxed.rs +251 50 +0 25 +293 200 +fi=(73) ++27 75 +fi=(32) +0 25 +cfi=(6) +cfn=(5100) +calls=37 0 +0 25 +fi=(23) +130 75 +cfi=(24) +cfn=(5102) +calls=37 -89 +* 3725 +fi=(32) +470 50 +fi=(33) +969 75 +fi=(23) +128 25 +cfi=(6) +cfn=(5100) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5102) +calls=37 -89 +* 950 +fi=(28) +251 50 +fe=(74) +0 75 +296 50 +cfn=(5570) polyxml::parser::namespace_scope +calls=37 109 +* 3175 +* 25 +fi=(33) +1196 125 +fe=(74) +298 75 +cfn=(5592) +calls=37 155 +* 1050 +fi=(27) +2177 25 +0 25 +2177 50 +fi=(40) +634 25 +fi=(33) +3101 25 +fe=(74) +31 25 ++1 100 +cfi=(97) +cfn=(5606) ; 8]>>::from_elem +calls=37 2052 +* 3300 +-7 25 ++9 75 +-4 150 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37 -30 +* 1925 +* 75 +300 75 +cfn=(5626) ::parse_attributes +calls=37 566 +* 3075 +fi=(27) +2177 50 +fe=(74) +0 50 +301 50 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37 0 +* 2225 +fi=(33) +1029 25 ++3 50 +fi=(20) +-62 75 +fi=(18) +1963 50 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37 0 +* 2225 +fi=(33) +1038 50 +462 425 +fi=(85) +-50 800100 +cfi=(75) +cfn=(5452) +calls=296037 1006 +* 84615000 +fe=(74) +309 1000125 +0 200025 +309 600075 +fi=(33) +1865 75000 +fi=(76) +282 150000 +fi=(32) +611 75000 +fi=(76) +282 150000 +fe=(74) ++29 150000 +cfn=(5570) +calls=111000 109 +* 20433500 +0 150000 +fi=(33) +1029 75000 ++3 150000 ++1 50 +cfi=(32) +cfn=(5664) >::grow_one +calls=37 186 +* 20817 +fi=(32) +611 75000 +fi=(18) +1963 75000 +fi=(33) +1038 150000 +fe=(74) +312 225000 +fi=(33) +2873 225075 ++4 150050 +fi=(32) +611 75025 +fi=(18) +1755 75025 +fi=(33) +0 75025 +fi=(13) +4049 75025 +fi=(73) +2868 75025 +fe=(74) +511 150050 +-45 100000 +fi=(98) +350 100000 +fi=(54) +871 50000 +fi=(13) +3994 100000 +fi=(78) +153 150000 +cfn=(5796) memchr::arch::x86_64::memchr::memchr_raw::find_avx2 +calls=73999 -75 +* 3000300 +fi=(40) +2869 100000 +fi=(33) +0 225000 +fe=(74) +316 75000 +fi=(33) +3101 75000 +fe=(74) +320 150000 +fi=(98) +0 75000 +fi=(99) +202 75000 +fi=(92) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs +380 150000 +fi=(99) +202 75000 +fi=(92) +384 150000 +fi=(44) +1229 25000 +fi=(91) +424 75000 +0 150000 +fi=(10) +1096 150000 +fi=(43) +90 75000 +fi=(100) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs +-62 150000 ++13 150000 +-41 150000 +42 650000 ++4 325000 +-5 725000 +fi=(54) +-41 75000 +fe=(74) +327 150000 +cfn=(5682) +calls=111000 91 +* 21533500 +* 75000 +fi=(33) +1865 75000 +fi=(76) +282 150000 +fe=(74) +0 75000 +fi=(32) +611 75000 +fi=(76) +282 75000 +fi=(14) +454 75000 +fi=(13) +4029 75000 +fi=(73) +2434 75000 +fe=(74) +329 75000 +fi=(73) +2438 75000 +320 300000 +fi=(55) +1337 75000 +fi=(51) /rust/deps/hashbrown-0.17.1/src/map.rs +-53 75000 +0 75000 +1287 225000 +241 150000 +cfi=(52) +cfn=(5702) +calls=111000 694 +* 13650000 +fi=(102) /rust/deps/hashbrown-0.17.1/src/control/tag.rs +47 225000 +fi=(55) +2452 450000 +0 75000 +fi=(18) +573 75000 +fi=(57) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/sse2.rs +1569 225000 +fi=(103) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs +40 150000 +-40 375000 +fi=(58) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/nonzero.rs +628 75000 +fi=(55) +2032 150000 +fi=(20) +1054 225000 +fi=(77) +21 150000 +-21 75000 +fi=(104) /rust/deps/hashbrown-0.17.1/src/lib.rs +157 225000 +cob=(2) +cfi=(2) +cfn=(5714) +calls=111000 0 +* 1425000 +* 75000 +fi=(47) +455 75000 +fe=(74) +330 150000 +fi=(33) +1865 75000 +fi=(43) +238 150000 +fi=(32) +611 75000 +fi=(43) +238 225000 +fe=(74) ++97 625000 +fi=(28) +2415 25000 +fe=(74) +345 75000 ++13 50000 +fi=(40) +0 75025 +fi=(11) +975 525175 +fe=(74) +515 75025 +fi=(33) +3101 25025 +fe=(74) +526 50050 +fi=(33) +2877 50000 +fi=(54) +871 50000 +fi=(18) +1755 75000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37000 0 +* 2225000 +fi=(98) +350 100000 +fi=(33) +1865 50000 +fi=(76) +282 100000 +fi=(32) +611 50000 +fi=(76) +282 50000 +fi=(14) +454 50000 +fi=(33) +1865 100000 +fi=(43) +238 100000 +fi=(32) +611 50000 +fi=(43) +238 100000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(74) +519 150000 +cfi=(106) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/converters.rs +cfn=(5756) ::parse_scalar +calls=74000 28 +* 19637399 +fi=(27) +2177 100000 +0 400000 +2177 100000 +fe=(74) +519 400000 +fi=(33) +1904 50000 +fi=(76) +305 300000 +fe=(74) +521 100000 +0 50000 +472 50000 +fi=(10) +1096 50000 +fi=(43) +90 25000 +fi=(100) +-62 50000 ++13 50000 +-41 25000 +42 200000 ++4 100000 +-5 225000 +fe=(74) +544 50 +fi=(32) ++72 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 50000 +-94 50000 +fi=(33) +2981 99950 +0 50000 +fi=(20) +970 50000 +fi=(18) +573 150000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=74000 0 +* 705000 +fi=(33) +2986 100000 +0 100000 +fi=(97) +1082 100000 +-17 50000 +0 25000 +fe=(74) +529 125000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37000 0 +* 2225000 +* 75000 +cfn=(5866) +calls=37000 52 +* 23353170 +fi=(27) +2177 50000 +0 200000 +2177 50000 +fe=(74) +529 200000 +fi=(33) +1904 25000 +fi=(76) +305 50000 +fi=(32) +611 25000 +fi=(76) +305 25000 +fi=(14) +454 25000 +fi=(55) +1337 25000 +fi=(51) +-53 25000 +fe=(74) +0 100000 +fi=(51) +1287 25000 +241 75000 +cfi=(52) +cfn=(5702) +calls=37000 694 +* 4500000 +* 25000 +fi=(102) +47 50000 +fi=(55) +2452 150000 +0 25000 +fi=(18) +573 25000 +fi=(57) +1569 75000 +fi=(103) +40 50000 +-40 150000 +fi=(58) +628 25000 +fi=(55) +2032 50000 +fi=(20) +1054 100000 +fi=(77) +21 50000 +fi=(104) +157 75000 +cob=(2) +cfi=(2) +cfn=(5714) +calls=37000 0 +* 475000 +* 25000 +fi=(47) +455 25000 +fi=(97) +0 100000 +fi=(43) +245 200000 +fi=(18) +847 100000 +fe=(74) +524 400000 +-3 50000 ++11 25000 +fi=(33) +1865 25000 +fi=(43) +238 75000 +fi=(32) +611 25000 +fi=(43) +238 50000 +fe=(74) +538 100000 +0 25000 +539 50000 +cfn=(5914) ::push_list_item +calls=37000 39 +* 1224450 +* 25000 +fi=(73) +0 200000 +fe=(74) +557 100000 +fi=(73) +0 150000 +fe=(74) +557 550000 +cfi=(18) +cfn=(5778) +calls=296000 847 +* 4000000 +fi=(33) +3082 600000 +fe=(74) +308 200000 ++29 100000 +fi=(33) +1865 25000 +fi=(76) +282 50000 +0 25000 +fi=(32) +611 25000 +fi=(76) +282 50000 +fe=(74) ++84 100000 +cfn=(5592) +calls=37000 155 +* 1050000 +fi=(27) +2177 25000 +0 25000 +2177 50000 +fe=(74) +371 50000 +cfn=(5728) ::new +calls=37000 23 +* 6925000 ++1 100000 +cfn=(5626) +calls=37000 566 +* 27406250 +fi=(27) +2177 50000 +fe=(74) +373 125000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37000 0 +* 2225000 +fi=(33) +996 75000 +cfn=(5772) +calls=37000 +31 +* 2700000 +* 25000 +fi=(45) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/schema.rs +11 100000 +fi=(33) +3082 150000 +fe=(74) +0 100000 +557 50000 +0 150000 +557 175000 +fi=(33) +0 100000 +fi=(13) +4049 50000 +fi=(73) +2868 50000 +fi=(33) +0 25000 +fi=(13) +4049 25000 +fi=(73) +2868 25000 +fi=(32) +672 150 +cfn=(5514) +calls=37 -14 +* 2875 +fi=(33) +3101 25 +2981 25 +fe=(74) +557 50 +0 25 +557 25 +cfi=(18) +cfn=(5778) +calls=37 847 +* 500 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5662) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5662) +calls=37 65 +* 850 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5662) +calls=37 65 +* 850 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5662) +calls=37 65 +* 3250 +0 25 +fi=(13) +4049 25 +fi=(73) +2868 25 +fi=(13) +4049 25 +fi=(73) +2868 25 +0 50 +2911 25 +cfn=(6068) >>::drop_slow +calls=37 2138 +* 1725 +0 25 +fe=(74) +279 50 +0 25 +279 25 +cfi=(18) +cfn=(5778) +calls=37 847 +* 500 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5662) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5662) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5662) +calls=37 65 +* 3850 +fe=(74) +286 275 +fi=(33) +2877 25 +fi=(32) +611 50 +fi=(18) +1755 75 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37 0 +* 2225 +fe=(74) +546 75 +cfn=(5866) +calls=37 52 +* 26466 +* 25 + +fn=(5570) +109 525175 ++1 75025 +fi=(98) +0 75025 +fi=(99) +272 75025 +fe=(74) +111 900300 +0 75025 +fi=(94) +227 225075 +cfn=(5572) +calls=111037 854 +* 12760100 +* 75000 +cfn=(5572) +calls=37000 854 +* 1600000 +fe=(74) +111 425075 +fi=(77) +-90 50000 +fi=(76) +2635 25000 +fi=(18) +847 50000 +fi=(32) +0 75025 +fe=(74) +122 75025 +cfi=(18) +cfn=(5586) +calls=111037 847 +* 2300450 ++1 75025 +fi=(40) +1162 150050 +fi=(13) +4029 75025 +fi=(73) +2434 75025 +fe=(74) +124 675225 + +fn=(5914) +39 150000 +fi=(97) +1082 75000 +-30 25000 +-15 25000 +fe=(74) +40 25000 +-40 24975 +fi=(97) +1082 24975 +-17 24975 +fi=(43) +195 50000 +fi=(97) +1082 25000 +-17 25000 +fe=(74) +0 25 +40 50 +fi=(14) +454 25 +fi=(33) +3101 25 +fe=(74) +42 50 +cfi=(97) +cfn=(5918) >; 4]>>::resize_with::<::push_list_item::{closure#0}> +calls=37 1841 +* 1200 +-42 25 +fi=(97) +1082 100 +-17 50 +fe=(74) +44 25000 +fi=(43) +197 50000 +fe=(74) +45 75000 +fi=(33) +1029 24975 ++3 49950 ++1 450 +cfi=(32) +cfn=(5934) >::grow_one +calls=333 186 +* 46350 +fi=(32) +611 24975 +fi=(20) +970 24975 +fi=(18) +1963 199800 +fi=(33) +1038 74925 +fi=(23) +128 25 +cfi=(6) +cfn=(5100) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5102) +calls=37 -89 +* 1050 +fi=(28) +251 50 +fe=(74) +47 225 +fi=(18) +847 50 +fe=(74) +47 75 ++3 150000 + +fn=(5728) +23 150000 +fi=(40) +634 25000 +fi=(33) +3101 25000 +fe=(74) +31 25000 ++1 100000 +cfi=(97) +cfn=(5606) +calls=37000 2052 +* 4250000 +-7 25000 ++9 75000 +-4 125000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37000 -30 +* 1925000 +* 50000 ++6 150000 + +fn=(5448) polyxml::deserialize +242 50 +cfn=(5450) +calls=37 +3 +* 271030152 + +fn=(5626) +566 200200 +fi=(98) +0 25025 +fi=(99) +272 25025 +fe=(74) +567 325325 +0 25025 +fi=(94) +227 75075 +cfn=(5572) +calls=37037 854 +* 9560100 +* 75000 +cfn=(5572) +calls=37000 854 +* 1600000 +fe=(74) +567 250050 +fi=(101) +222 25000 +fi=(77) +21 50000 +fi=(76) +2635 25000 +fe=(74) +572 50000 +cfi=(101) +cfn=(5686) +calls=37000 141 +* 950000 +0 50000 +fi=(14) +454 25000 +fi=(55) +1337 25000 +fi=(51) +-53 25000 +0 25000 +1287 25000 +241 50000 +cfi=(52) +cfn=(5702) +calls=37000 694 +* 4625000 +fi=(102) +47 75000 +fi=(55) +2452 150000 +0 25000 +fi=(18) +573 25000 +fi=(57) +1569 75000 +fi=(103) +40 50000 +-40 125000 +fi=(58) +628 25000 +fi=(55) +2032 50000 +fi=(20) +1054 75000 +fi=(77) +21 50000 +fi=(104) +157 100000 +cob=(2) +cfi=(2) +cfn=(5714) +calls=37000 0 +* 475000 +* 25000 +fi=(47) +455 25000 +fe=(74) +573 25000 +fi=(33) +1865 25000 +fi=(43) +238 50000 +fi=(32) +611 25000 +fi=(43) +238 50000 +fe=(74) +575 50000 +fi=(98) +350 50000 +fe=(74) +576 50000 +cfi=(105) +cfn=(5744) +calls=37000 236 +* 2078000 +fi=(27) +2177 25000 +0 75000 +2177 50000 +fe=(74) +0 50000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fe=(74) +577 75000 +cfi=(106) +cfn=(5756) +calls=37000 28 +* 2319750 +fi=(27) +2177 50000 +0 200000 +2177 50000 +fe=(74) +577 225000 +fi=(97) +1082 75000 +-17 25000 +fi=(43) +245 50000 +0 25000 +fi=(97) +1082 25000 +-17 25000 +fi=(43) +245 50000 +fi=(18) +847 50000 +fe=(74) +582 200000 +fi=(18) +847 150000 +fi=(23) +0 25025 +fe=(74) +585 25025 +cfi=(18) +cfn=(5586) +calls=37037 847 +* 1400450 +* 25025 ++1 25025 ++1 200200 + +fl=(87) +fn=(5498) +57 1500500 +fi=(54) +473 450150 +fi=(13) +3994 300100 +fi=(78) +153 900300 +cfi=(84) +cfn=(5504) memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 +calls=222073 1042 +* 4203450 +fi=(40) +2869 300100 +fi=(88) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs +0 150050 +fi=(54) +623 300100 +fe=(87) +59 300100 +fi=(54) +871 150050 +fe=(87) +59 625200 +fi=(13) +3994 25000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5504) +calls=37000 1042 +* 700000 +fi=(40) +2869 50000 +fi=(88) +0 25000 +fi=(54) +623 50000 +fe=(87) +59 50000 +fi=(54) +871 25000 +fe=(87) +59 375100 +-59 150050 +59 600200 +-59 150050 +59 200050 ++14 1350450 +fi=(88) +-73 25000 +fi=(54) +623 50000 +fe=(87) +59 50000 +fi=(54) +871 25000 +fe=(87) +59 75000 +fi=(13) +3994 25000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5504) +calls=37000 1042 +* 700000 +fi=(40) +2869 50000 +fe=(87) + +fl=(106) +fn=(5756) +28 600000 ++5 825000 +-33 25000 +cfi=(37) +cfn=(5186) +calls=37000 89 +0 1961250 +0 50000 +fi=(27) +2177 50000 +fi=(109) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/lib.rs +0 25000 +fi=(47) +478 25000 +fi=(32) +-17 25000 +0 25000 +cfi=(6) +cfn=(5100) +calls=37000 0 +0 25000 +0 25000 +fi=(23) +130 75000 +cfi=(24) +cfn=(5102) +calls=37000 -89 +* 10665349 +fi=(32) +470 50000 +fi=(36) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/slice.rs +0 25000 +fi=(18) +573 100000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37000 0 +* 330000 +* 25000 +0 25000 +fi=(76) +199 50000 +fi=(56) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/macros/mod.rs +434 75000 +0 25000 +434 75000 +fi=(47) +0 25000 +fe=(106) +35 75000 +-35 25000 +fi=(76) +199 50000 +0 75000 +fi=(56) +434 75000 +fi=(76) +0 250000 +fi=(56) +434 75000 +0 25000 +434 175000 +0 25000 +434 75000 +fi=(110) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/parse.rs +175 100000 +fi=(107) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-integer-1.0.6/src/algorithm.rs ++24 175000 +fi=(43) +0 50000 +fi=(111) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/iterator.rs +252 150000 +0 25000 +fi=(43) +184 50000 +fi=(110) +872 205600 +fi=(10) +2689 102800 +fi=(124) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs +39 205600 +fi=(10) +2728 77800 +fi=(110) +566 77800 +fi=(10) +2652 77800 +fi=(108) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/noskip.rs +144 77800 +fi=(43) ++40 155600 +fi=(107) +677 25000 ++10 25000 +0 50000 +411 50000 +fi=(10) +2689 25000 +fi=(124) +39 50000 +fi=(107) +411 94500 +fi=(10) +2689 47250 +fi=(124) +39 94500 +fi=(108) +270 72250 +fi=(145) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/int_macros.rs +2261 72250 +fi=(113) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs +132 72250 +fi=(145) +2189 72250 +fi=(43) +184 144500 +fe=(106) +46 75000 ++45 675000 +fi=(19) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs +2105 25000 +fi=(110) +616 25000 +0 50000 +fi=(43) +380 25000 +fi=(111) +252 100000 +fi=(43) +-68 50000 +fi=(110) +872 100000 +fi=(10) +2689 50000 +fi=(124) +39 100000 +fi=(10) +2728 50000 +fi=(110) +623 50000 +fi=(10) +2652 50000 +fi=(108) +144 50000 +fi=(43) ++40 100000 +0 50000 +90 25000 +fi=(110) +616 225000 +0 25000 +568 100000 +fi=(43) +184 50000 +fi=(110) +666 50000 +0 25000 +747 50000 +0 25000 +747 25000 +855 50000 +216 300000 ++51 25000 +cfi=(112) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/number.rs +cfn=(5860) ::try_fast_path:: +calls=37000 45 +* 675000 +* 50000 +fe=(106) +56 75000 + +fl=(90) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs +fn=(5536) ::emit_start +314 750250 +fi=(92) ++70 150050 +fi=(44) +1229 75025 +fi=(91) +493 75025 +0 75025 +221 150050 +fi=(76) +2736 150050 +fi=(77) +157 75025 +fi=(76) +2738 75025 +0 75025 +2738 75025 +fe=(90) +345 150050 +fi=(10) +1092 75025 +fi=(92) +380 150050 ++4 150050 +fi=(44) +1229 75025 +fi=(91) +424 75025 +0 225075 +fi=(93) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs +331 325175 +-4 650350 ++1 700350 +-13 350175 +0 50000 +fi=(33) +3101 25000 +1029 25000 ++3 50000 +fi=(32) +611 75025 +fi=(18) +1963 75025 +fi=(33) +1038 150050 +fi=(92) +380 150050 ++4 150050 +fi=(44) +1229 25000 +fi=(91) +424 25000 +fi=(33) +1033 100 +cfi=(32) +cfn=(5552) >::grow_one +calls=37 186 +* 2675 +* 75 +0 50025 +3101 50025 +1029 50025 ++3 100075 +fi=(91) +424 50025 +fi=(32) +616 75025 +fi=(33) +1461 75025 +fi=(10) +2689 75025 +fi=(32) +764 75025 +-94 75025 +0 75025 +fi=(20) +970 75025 +fi=(18) +573 300100 +cob=(2) +cfi=(2) +cfn=(4490) +calls=111037 0 +* 1125375 +* 75025 +fi=(33) +2986 225075 +fe=(90) +0 450150 +356 675225 +fi=(32) +672 250 +cfn=(5514) +calls=74 -14 +* 5825 +* 50 +fi=(33) +3101 100 +fe=(90) + +fn=(5788) ::emit_text +63 50000 ++1 100000 ++11 200000 ++1 150000 + +fn=(5818) ::emit_end +197 525175 +fi=(91) +-68 150050 +fi=(44) +1229 75025 +fi=(91) +145 75025 +fi=(44) +1229 75025 +fi=(91) +262 75025 +0 300100 +fe=(90) +214 225075 +fi=(93) +315 300100 +0 75025 +fi=(50) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs +402 150050 +fi=(93) +-87 75025 +fi=(33) +2873 225075 ++4 150050 +fi=(32) +611 75025 +fi=(18) +1755 75025 +fe=(90) +228 150050 +fi=(32) +611 75025 +fi=(33) +1865 75025 +fi=(92) +380 150050 ++4 150000 +fi=(44) +1229 75000 +fi=(91) +493 75000 +fi=(39) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs +1490 150050 +fi=(92) +380 450150 +fi=(32) +611 75000 +fi=(44) +1229 75000 +fi=(39) +1491 75000 +fi=(33) +1828 75025 +fe=(90) +257 375125 ++1 675225 +fi=(92) +384 225075 +fi=(91) +221 150050 +fi=(54) +871 75025 +fi=(77) +21 150050 +-21 75025 +157 600200 +cob=(2) +cfi=(2) +cfn=(5714) +calls=111037 0 +* 1425475 +* 450150 +fe=(90) ++73 75025 +fi=(92) +394 75025 +fi=(91) ++30 75025 +fe=(90) + +fl=(6) +fn=(4128) (below main) +cob=(2) +cfi=(2) +cfn=(4130) +calls=1 0 +0 283054621 + +fn=(5100) +0 125250 + +fn=(4178) +cfi=(8) +cfn=(4180) +calls=1 152 +0 283054621 + +fl=(112) +fn=(5860) +45 75000 +-45 25000 +46 50000 +-46 50000 +46 100000 ++36 50000 +fi=(113) ++70 50000 +fe=(112) +-67 50000 ++22 25000 +fi=(114) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/table_decimal.rs +-30 75000 +fi=(146) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/arith.rs +515 50000 +fe=(112) +100 75000 + +fl=(84) +fn=(5474) +659 350100 +fi=(78) +0 700200 +fi=(54) +623 350100 +fe=(84) ++40 350100 ++1 50100 +fi=(88) +1161 50050 +0 25025 +1162 25025 +fe=(84) +668 50050 +fi=(88) +1162 47250 +fe=(84) +668 239000 +fi=(54) +389 72250 +fi=(88) +1161 144500 +0 25000 +fi=(78) +86 75000 +fi=(18) +573 150000 +fi=(147) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs +699 300000 +2315 150000 +2163 150000 +fi=(148) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/vector.rs +147 150000 +fi=(88) +679 150000 +fi=(18) +573 25 +fi=(57) +920 50 +-25 25 +1569 25 +fi=(148) +147 25 +fi=(88) +679 25 +fe=(84) +0 450075 +fi=(78) +86 300100 +fe=(84) + +fn=(5504) +1042 400100 +0 1400350 +fi=(54) +623 400100 +fe=(84) +1046 400100 ++1 150 +fi=(88) +1161 50 +0 25 +1162 50 +fe=(84) +1051 25 +fi=(88) +1162 400 +fe=(84) +1051 1050 +fi=(54) +389 200 +fi=(88) +1161 400 +fi=(18) +573 199975 +fi=(147) +699 399950 +2315 199975 +699 199975 +2315 199975 +2163 199975 +fi=(148) +147 199975 +fi=(88) +972 199975 +fi=(18) +573 50 +fi=(57) +920 100 +-25 50 ++25 50 +-25 50 +1569 50 +fi=(148) +147 50 +fi=(88) +972 50 +fe=(84) +0 800100 +fi=(78) +86 400050 +-86 25 +86 50 +fe=(84) + +fl=(32) +fn=(5642) >>::grow_one +186 300000 +493 75000 ++30 75000 +fi=(19) +1051 225000 +fe=(32) +529 450000 +cfn=(5228) ::finish_grow +calls=111000 +15 +* 6225000 +fi=(27) +2177 150000 ++1 75000 +fe=(32) +773 75000 ++1 75000 +189 300000 + +fn=(5664) +186 100 +493 25 ++30 25 +fi=(19) +1051 75 +fe=(32) +529 150 +cfn=(5228) +calls=37 +15 +* 20217 +fi=(27) +2177 50 ++1 25 +fe=(32) +773 25 ++1 25 +189 100 + +fn=(5490) +186 300 +493 50 ++30 50 +fi=(19) +1051 150 +fe=(32) +529 200 +cfn=(5228) +calls=74 +15 +* 3550 +fi=(27) +2177 100 ++1 50 +fe=(32) +773 50 ++1 50 +189 250 + +fn=(5228) +544 2600 +fi=(10) +3212 2600 +fi=(47) +478 975 +0 325 +fe=(32) +631 325 +fi=(10) +1401 300 +fi=(23) +228 1500 +cfi=(24) +cfn=(5522) +calls=1451 41 +* 53967 +fi=(27) +965 600 +fi=(23) +298 50 ++4 25 +cfi=(6) +cfn=(5100) +calls=39 0 +* 25 +130 75 +cfi=(24) +cfn=(5102) +calls=39 -89 +* 950 +fi=(27) +965 50 ++1 975 +fe=(32) +0 650 +564 1950 +-20 600600 +fi=(10) +3212 600600 +fi=(47) +478 225225 +fe=(32) +631 150150 +fi=(10) +1401 25 +fi=(23) +228 125 +cfi=(24) +cfn=(5522) +calls=1037 41 +* 1400 +fi=(27) +965 50 +fi=(23) +298 150100 ++4 75050 +cfi=(6) +cfn=(5100) +calls=111074 0 +* 75050 +130 225150 +cfi=(24) +cfn=(5102) +calls=111074 -89 +* 3152000 +fi=(27) +965 150100 ++1 225225 +fe=(32) +0 150150 +564 450450 +-20 400 +fi=(86) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/layout.rs +75 50 ++38 50 +0 50 +fe=(32) +631 100 +fi=(23) +298 100 +128 50 +cfi=(6) +cfn=(5100) +calls=74 0 +* 50 ++2 150 +cfi=(24) +cfn=(5102) +calls=74 -89 +* 1900 +fi=(27) +965 100 ++1 150 +fe=(32) +0 100 +564 300 + +fn=(5514) +658 300 +512 150 +fi=(10) +938 75 +fi=(47) +478 75 +0 75 +fe=(32) +523 150 +fi=(19) +1051 150 +fe=(32) +159 525 +fi=(19) +1051 225 +fe=(32) +529 300 +cfn=(5228) +calls=1118 +15 +* 6775 +fi=(27) +2177 150 ++1 75 +fe=(32) +773 75 ++1 75 +668 300 +-10 150 +fi=(10) +938 50 +fi=(47) +478 50 +0 50 +fe=(32) +523 100 +fi=(19) +1051 250 +fe=(32) +529 350 +cfn=(5228) +calls=1074 +15 +* 4375 +fi=(27) +2177 100 ++1 50 +fe=(32) +773 50 ++1 50 +668 200 + +fn=(5934) +186 900 +493 225 ++30 225 +fi=(19) +1051 675 +fe=(32) +529 1350 +cfn=(5228) +calls=333 +15 +* 40950 +fi=(27) +2177 450 ++1 225 +fe=(32) +773 225 ++1 225 +189 900 + +fn=(5552) +186 100 +493 25 ++30 25 +fi=(19) +1051 75 +fe=(32) +529 150 +cfn=(5228) +calls=37 +15 +* 2075 +fi=(27) +2177 50 ++1 25 +fe=(32) +773 25 ++1 25 +189 100 + +fl=(26) +fn=(5662) +65 75200 +cob=(2) +cfi=(2) +cfn=(4878) +calls=112323 -65 +* 2487000 + +fl=(115) +fn=(5870) +32 200200 +fi=(97) +2493 100100 +0 25025 +2498 50050 +1082 25025 +-30 25025 +fi=(41) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter_nested.rs +0 25025 +26 225225 +fi=(97) +2506 25025 +fi=(10) +-10 75075 +fi=(19) +1051 75075 +fi=(10) +3212 25025 +fi=(41) +0 25025 +fi=(47) +478 75075 +fi=(97) +1052 25025 +fi=(54) +871 25025 +fi=(18) +1755 25025 +fi=(41) +24 50050 +fe=(115) ++10 200200 +fi=(32) +461 50050 +0 25025 +cfi=(6) +cfn=(5100) +calls=37037 0 +0 25025 +0 25025 +fi=(23) +130 75075 +cfi=(24) +cfn=(5102) +calls=37037 -89 +* 4833839 +fi=(32) +470 50050 +0 50050 +fi=(18) +1963 200200 +fi=(41) +36 100100 ++5 100100 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37037 -41 +* 1926925 +fi=(97) +2493 125125 +0 50 +2493 50 +0 100000 +fi=(33) +4100 225000 +fi=(18) +1963 400000 +fi=(33) +4111 50000 +2224 50000 +fi=(97) +2493 150000 ++5 100000 +fi=(18) +1755 50000 +fi=(33) +4100 550000 ++2 100000 +fi=(97) +0 75000 +2493 50000 +0 25025 +fi=(18) +847 25025 +cfi=(97) +cfn=(5882) ; 8]> as core::ops::drop::Drop>::drop +calls=37037 2373 +* 525525 +fi=(41) +42 150150 +fe=(115) + +fl=(75) +fn=(5452) +1006 3000750 +289 600150 +fi=(76) +2635 50 +fi=(77) +157 125 +fi=(85) +24 25 +fe=(75) +306 25 ++45 300100 +fi=(33) +3101 150050 +fi=(76) +137 300100 +0 300100 +fi=(54) +871 150050 +fi=(13) +3994 300100 +fi=(78) +153 750250 +cfi=(84) +cfn=(5474) +calls=222073 659 +* 3301100 +fi=(40) +2869 300100 +fi=(85) +72 600200 ++7 100000 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 100000 +-94 50000 +fi=(20) +970 50000 +fi=(18) +573 200000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=74000 0 +* 705000 +* 100000 +fi=(33) +2986 100000 +fi=(85) +0 50000 +fi=(43) +549 100000 +fi=(142) +389 100000 +fi=(43) +544 50000 +fi=(85) +79 100000 +fi=(43) +544 150000 +90 100000 +fi=(85) +-4 150000 +cfi=(37) +cfn=(5186) +calls=74000 +3 +* 3700250 +* 100000 +-25 100000 +fe=(75) +369 100000 +fi=(85) +75 100050 +fe=(75) +355 100050 +0 400200 +437 100050 +fi=(43) +544 200100 +fe=(75) +437 50000 +fi=(43) +544 100000 +fe=(75) +0 150050 +fi=(43) +90 150050 +fi=(76) ++66 300100 +fi=(142) +389 300100 +fi=(76) +156 150050 +fi=(71) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/clone.rs +716 450150 +fe=(75) +440 150050 +0 150050 +440 450150 +0 75025 +464 225075 +cfi=(85) +cfn=(5486) +calls=111037 211 +* 19183725 +-1 150050 ++4 375125 +cfi=(90) +cfn=(5818) +calls=111037 197 +* 8702725 +* 75025 +0 75025 +488 225075 +cfi=(85) +cfn=(5486) +calls=111037 211 +* 22204750 +-1 150050 +0 150000 +cfi=(90) +cfn=(5788) +calls=74000 63 +0 500000 +fi=(27) +2177 50000 +0 200000 +2177 100000 +fe=(75) +491 375125 +cfi=(90) +cfn=(5536) +calls=111037 314 +* 9137500 +* 75025 +0 300000 +375 50000 ++25 750250 +1011 1800450 + +fl=(37) +fn=(5186) +89 1125250 +fi=(38) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs ++44 675150 ++12 450100 +0 1575350 +164 225050 ++1 450100 +fi=(10) +2689 450100 +3875 225050 +fi=(38) +222 225050 ++2 450100 ++17 450100 +0 225050 +241 3590050 ++1 1795025 +-1 3815100 +fe=(37) +94 900200 +-94 225050 +98 900200 + +fl=(24) +fn=(5140) +cfn=(6388) measured_region +calls=1 79 +70 283054621 + +fn=(6388) +79 9 +fi=(19) +2144 1 +fi=(34) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/range.rs +1100 1 +0 10 +fi=(26) +0 5 +fi=(149) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hint.rs +491 4 +fi=(13) +4029 1 +fi=(73) +2434 1 +fi=(26) +0 24 +fi=(149) +491 96 +fi=(13) +4029 24 +fi=(73) +2434 24 +fe=(24) +89 125 +cfi=(74) +cfn=(5448) +calls=25 242 +* 271030202 +fi=(27) +1230 50 ++1 200 +fe=(24) +89 50 +cfi=(18) +cfn=(6326) +calls=25 847 +* 12023736 +fi=(19) +2144 25 +fi=(34) +1100 25 +fe=(24) +94 8 + +fn=(5102) +41 125250 +fi=(13) +3994 125250 +762 125250 +fe=(24) +16 125250 +fi=(25) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs +161 501000 +fi=(26) +30 250500 ++1 250500 +cob=(2) +cfi=(2) +cfn=(4228) +calls=186395 -31 +* 17157813 +fe=(24) + +fn=(5522) +41 25350 +fi=(13) +3994 25350 +762 25350 +fe=(24) +33 25350 +fi=(89) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs +-33 126750 +405 50700 +fi=(26) +70 50050 ++1 50050 +cob=(2) +cfi=(2) +cfn=(4460) +calls=37037 -71 +* 6883347 +-1 650 ++1 650 +cob=(2) +cfi=(2) +cfn=(4460) +calls=2488 -71 +* 50492 +fe=(24) + +fl=(78) +fn=(5796) +78 50000 +fi=(84) +184 100000 +0 150000 +fi=(54) +623 100000 +fi=(84) +188 100000 ++1 100000 +fi=(88) +1161 50000 +0 50000 +fi=(84) +193 1050150 +fi=(54) +389 350050 +fi=(88) +1161 700100 +0 100000 +fe=(78) +86 100000 + +fl=(97) +fn=(5606) +2052 250250 ++1 50050 +fi=(32) +0 25025 +fe=(97) +856 25025 +fi=(18) +-9 25025 +fi=(19) +2144 25025 +fi=(34) +1100 25025 +fe=(97) +0 25025 +fi=(40) +2274 50050 ++2 25025 +fi=(18) +1963 400400 +fi=(19) +2144 25025 +fi=(34) +1100 25025 +fi=(40) +2276 25000 +fi=(18) +1963 400000 +fi=(19) +2144 25000 +fi=(34) +1100 25000 +fi=(40) +2276 25000 +fi=(18) +1963 400000 +fi=(19) +2144 25000 +fi=(34) +1100 25000 +fe=(97) +2615 50050 +2067 100100 +cob=(2) +cfi=(2) +cfn=(4490) +calls=37037 0 +* 1926925 +fi=(18) +847 25025 +fe=(97) +2069 225225 + +fn=(5882) +2373 200200 +1082 50050 +2375 25025 +fi=(18) +847 50050 +fe=(97) +2382 200200 + +fn=(6064) +2483 250 ++10 50 +-8 200 + +fn=(5910) +2373 200200 +1082 50050 +2375 25025 +fi=(23) +0 25025 +fi=(18) +847 50050 +fe=(97) +2382 200200 + +fn=(5918) +1841 200 +1082 75 +-30 25 +0 25 +1846 75 +1082 50 +-17 25 +0 25 +1358 75 +0 50 +1230 50 +fi=(20) +970 25 +fi=(18) +1963 100 +fe=(97) +1237 25 +fi=(19) +2144 25 +fi=(34) +1100 50 +fi=(74) +42 25 +fe=(97) +1082 50 +1217 25 +1856 200 + +fl=(73) +fn=(6068) +2138 75 ++6 25 +fi=(18) +842 25 ++5 25 +cfi=(55) +cfn=(6070) +calls=37 3486 +* 450 +fi=(117) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/rc.rs +3277 25 +fe=(73) +3392 25 +fi=(13) +4049 25 +fe=(73) +3544 25 +fi=(23) +175 175 +cfi=(26) +cfn=(5662) +calls=37 65 +* 850 +fe=(73) + +fl=(101) +fn=(5686) +141 250000 ++69 250000 +fi=(10) +1096 100000 +fi=(43) +90 50000 +fi=(100) +-62 100000 ++13 100000 +-41 100000 +42 200000 ++4 100000 +-5 250000 +fi=(54) +-41 50000 +fe=(101) +143 350000 + +fl=(95) +fn=(5576) +1123 1750350 ++1 750150 +955 750150 ++2 250050 +1124 250050 +fi=(43) +544 500100 +fi=(14) +1663 500100 +fi=(50) +180 250050 +fe=(95) +1125 75000 +fi=(43) +90 375000 +-90 75000 +fe=(95) +1130 75000 +fi=(14) +627 75000 +fe=(95) +1130 75000 +fi=(93) +315 75000 +fe=(95) +1130 75000 +fi=(14) +627 75000 +fe=(95) +1130 75000 +fi=(93) +315 75000 +0 225000 +fi=(50) +180 75000 +fe=(95) +0 75000 +fi=(50) +180 75000 +fe=(95) +1138 175050 ++1 175050 +0 75000 +fi=(50) +180 75000 +fe=(95) +1143 300000 +fi=(14) +1663 150000 +fi=(50) +180 75000 +fe=(95) +1143 450000 +0 375000 +1188 525000 +0 175050 +1261 2250450 +-73 450000 +cfn=(5638) ::check_for_duplicates +calls=111000 1036 +* 12075000 +* 150000 +fi=(14) +1663 300000 +fi=(50) +180 75000 +0 225000 +fe=(95) +1199 150000 +fi=(93) +315 75000 +0 150000 +fe=(95) +0 225000 +fi=(14) +1663 150000 +fi=(50) +180 300000 +fe=(95) +1243 75000 +fi=(150) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/traits/iterator.rs +2490 75000 +fe=(95) +1243 216750 +fi=(150) +2490 216750 +fi=(14) +627 216750 +1663 433500 +fi=(50) +180 216750 +fi=(93) +0 150000 +fe=(95) +1243 75000 +0 150000 +1243 150000 +1113 150000 +0 375000 + +fn=(5638) +1036 525000 ++5 150000 +0 150000 +fi=(33) +3101 75000 +fe=(95) +1042 150000 +0 300000 +fi=(32) +611 150000 +fi=(20) +970 300000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +fe=(95) +0 225000 +fi=(33) +1032 150000 ++1 75000 +cfi=(32) +cfn=(5642) +calls=111000 186 +* 8025000 +fi=(32) +611 150000 +0 225000 +fi=(18) +1963 225000 +fi=(33) +1038 225000 +fe=(95) ++16 225000 ++1 600000 + +ob=(1) /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 +fl=(1) ??? +fn=(0) 0x0000000000023340 +cob=(6) +cfi=(6) +cfn=(4128) +calls=1 0 +0 283054621 + +totals: 283054621 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-annotated.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-annotated.txt new file mode 100644 index 0000000..bfc6d7f --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-annotated.txt @@ -0,0 +1,98 @@ +-------------------------------------------------------------------------------- +Profile data file 'benchmarks/rust-runtime-investigation/target/evidence/old/write-1000.callgrind' (creator: callgrind-3.26.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 30027593 +Trigger: Program termination +Profiled target: benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics write 1000 25 instructions (PID 341931, part 1) +Events recorded: Ir +Events shown: Ir +Event sort order: Ir +Thresholds: 95 +Include dirs: +User annotated: +Auto-annotation: off + +-------------------------------------------------------------------------------- +Ir +-------------------------------------------------------------------------------- +80,501,030 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir file:function +-------------------------------------------------------------------------------- +7,202,000 ( 8.95%) ???:0x0000000000197a00 [/usr/lib/x86_64-linux-gnu/libc.so.6] +6,239,250 ( 7.75%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs:core::str::converts::from_utf8 +6,077,100 ( 7.55%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/cursor.rs: as core::io::cursor::WriteThroughCursor>::write_all [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] +5,500,000 ( 6.83%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/serializer.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] +5,226,325 ( 6.49%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/writer.rs:>>>::write_event:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] +2,962,775 ( 3.68%) ???:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] +2,725,825 ( 3.39%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/cursor.rs:>>>::write_event:: +2,500,200 ( 3.11%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::_escape::::{closure#0}, &str> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] +2,426,375 ( 3.01%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/algorithm.rs:::format_scalar_to +2,100,350 ( 2.61%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs:core::str::converts::from_utf8 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] +2,050,200 ( 2.55%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:quick_xml::escape::_escape::::{closure#0}, &str> +1,950,000 ( 2.42%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/serializer.rs:::format_scalar_to [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] +1,575,375 ( 1.96%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:>>>::write_event:: +1,328,450 ( 1.65%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/jeaiii.rs:::format_scalar_to +1,200,400 ( 1.49%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/io/cursor.rs:>>>::write_event:: +1,187,750 ( 1.48%) ???:0x00000000000b4180 [/usr/lib/x86_64-linux-gnu/libc.so.6] +1,175,000 ( 1.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 +1,100,400 ( 1.37%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:>>>::write_event:: +1,079,375 ( 1.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>::reserve::do_reserve_and_handle:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] +1,062,650 ( 1.32%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 950,000 ( 1.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 916,750 ( 1.14%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::_escape::::{closure#0}, &str> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 900,375 ( 1.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs: as core::io::cursor::WriteThroughCursor>::write_all + 877,975 ( 1.09%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::finish_grow [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 825,925 ( 1.03%) ???:free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 775,225 ( 0.96%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>>>::write_event:: + 651,125 ( 0.81%) ???:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 600,150 ( 0.75%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/convert/mod.rs:>>>::write_event:: + 575,000 ( 0.71%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 550,250 ( 0.68%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>>>::write_event:: + 500,000 ( 0.62%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::push_attribute::<(&str, &str)> + 475,825 ( 0.59%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>>>::write_event:: + 466,750 ( 0.58%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 451,575 ( 0.56%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::finish_grow + 450,225 ( 0.56%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs: as core::io::cursor::WriteThroughCursor>::write_all + 450,150 ( 0.56%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:core::str::converts::from_utf8 + 450,150 ( 0.56%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs: as core::io::cursor::WriteThroughCursor>::write_all + 450,000 ( 0.56%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::push_attribute::<(&str, &str)> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 425,425 ( 0.53%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/schema.rs:::matches_variant [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 425,000 ( 0.53%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::push_attr [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 400,000 ( 0.50%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::push_attr + 375,000 ( 0.47%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 351,225 ( 0.44%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs:__rustc::__rust_realloc + 350,000 ( 0.43%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::push_attr + 325,025 ( 0.40%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:>>>::write_event:: + 325,000 ( 0.40%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 314,000 ( 0.39%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 302,200 ( 0.38%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/serializer.rs:::write_model::<&mut core::io::cursor::Cursor>> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 300,000 ( 0.37%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:>::from [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics] + 300,000 ( 0.37%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 275,000 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::format_scalar_to + 250,875 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::finish_grow + 250,875 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs:>::reserve::do_reserve_and_handle:: + 250,875 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::finish_grow + 225,975 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs: as core::io::cursor::WriteThroughCursor>::write_all + 225,225 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs:::matches_variant + 225,075 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs: as core::io::cursor::WriteThroughCursor>::write_all + 225,000 ( 0.28%) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/schema.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 225,000 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::push_attr + 225,000 ( 0.28%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 200,700 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs:__rustc::__rust_realloc + 200,000 ( 0.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 200,000 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::push_attribute::<(&str, &str)> + 199,125 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::format_scalar_to + 175,700 ( 0.22%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::finish_grow + 175,000 ( 0.22%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 150,525 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>::reserve::do_reserve_and_handle:: + 150,050 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>>>::write_event:: + 150,000 ( 0.19%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/shared.rs:::format_scalar_to + 150,000 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::push_attr + 150,000 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs:::write_model::<&mut core::io::cursor::Cursor>>'2 + 150,000 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::push_attr + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-valgrind.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-valgrind.txt new file mode 100644 index 0000000..b32187b --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-valgrind.txt @@ -0,0 +1,12 @@ +==341931== Callgrind, a call-graph generating cache profiler +==341931== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al. +==341931== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info +==341931== Command: benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics write 1000 25 instructions +==341931== Parent PID: 341905 +==341931== +==341931== For interactive control, run 'callgrind_control -h'. +==341931== +==341931== Events : Ir +==341931== Collected : 80501030 +==341931== +==341931== I refs: 80,501,030 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000.callgrind b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000.callgrind new file mode 100644 index 0000000..9e5e99d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/old/write-1000.callgrind @@ -0,0 +1,1891 @@ +# callgrind format +version: 1 +creator: callgrind-3.26.0 +pid: 341931 +cmd: benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics write 1000 25 instructions +part: 1 + + +desc: I1 cache: +desc: D1 cache: +desc: LL cache: + +desc: Timerange: Basic block 0 - 30027593 +desc: Trigger: Program termination + +positions: line +events: Ir +summary: 80501030 + + +ob=(3) ??? +fl=(3) ??? +fn=(4488) 0x000000000495a6a0 +0 200 +cob=(2) /usr/lib/x86_64-linux-gnu/libc.so.6 +cfi=(2) ??? +cfn=(4490) 0x0000000000197a00 +calls=210 0 +0 620650 + +ob=(2) +fl=(2) +fn=(4504) 0x00000000000b2300 +0 2100 +cfn=(4510) 0x00000000000b20e0 +calls=2274 0 +0 19350 +0 875 + +fn=(4130) (below main) +cfn=(4164) 0x000000000002a580 +calls=1 0 +0 80501030 + +fn=(4510) +0 18350 +cfn=(4952) 0x00000000000b0f70 +calls=722 0 +0 3050 +0 1125 + +fn=(4490) +0 7202000 + +fn=(4976) 0x0000000000198400 +0 103400 + +fn=(4234) 0x00000000000b2400 +0 20825 +cfn=(4952) +calls=36 0 +0 775 +0 15325 +cfn=(4952) +calls=749 0 +0 2800 +0 2075 + +fn=(4952) +0 8275 + +fn=(4228) malloc +0 400 +cfn=(4234) +calls=4089 0 +0 10525 +0 650725 + +fn=(4462) 0x00000000000b4180 +0 1182900 +cfn=(4234) +calls=163 0 +0 31275 +0 1675 +cfn=(4504) +calls=2112 0 +0 8425 +0 1050 +cfn=(4952) +calls=109 0 +0 1650 +0 1325 +cob=(3) +cfi=(3) +cfn=(4488) +calls=162 0 +0 620850 +0 600 +cfn=(4504) +calls=162 0 +0 13900 +0 200 + +fn=(4878) free +0 300 +cfn=(4510) +calls=4022 0 +0 3175 +0 825625 + +fn=(4164) +cob=(6) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/target/release/xml-diagnostics +cfi=(6) ??? +cfn=(4178) main +calls=1 0 +0 80501030 + +fn=(4460) realloc +0 2685850 +cfn=(4462) +calls=38275 0 +0 1863850 +0 276925 + +ob=(6) +fl=(109) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/lib.rs +fn=(6078) polyxml::serialize +38 50 +fi=(118) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/serializer.rs +169 125 +cfn=(6080) ::serialize_with_options +calls=36 +3 +* 80496025 +* 25 +fe=(109) +45 75 + +fl=(105) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs +fn=(6220) quick_xml::escape::_escape::::{closure#0}, &str> +201 500000 ++3 50000 +fi=(14) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs +1663 50000 +fi=(50) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs +180 50000 +0 250000 +180 250000 +0 150000 +fi=(14) +1663 675100 +fi=(50) +385 337550 +fi=(14) +1663 337550 +fi=(50) +180 337550 +379 675100 +fe=(105) +109 337550 +0 712650 +218 250000 ++7 200000 ++2 450000 + +fn=(6196) quick_xml::escape::_escape::::{closure#0}, &str> +201 225000 ++3 50000 +fi=(20) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs +970 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 225000 +fi=(14) +1663 144500 +fi=(50) +385 72250 +fi=(14) +1663 144500 +fi=(50) +379 144500 +fe=(105) +169 72250 +0 144500 +218 75000 ++7 125000 ++2 225000 + +fl=(8) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/rt.rs +fn=(4180) std::rt::lang_start_internal +fi=(142) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/function.rs +cfn=(5136) std::rt::lang_start::<()>::{closure#0} +calls=1 206 +287 80501030 +fe=(8) + +fn=(5136) +cfi=(30) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/backtrace.rs +cfn=(5138) std::sys::backtrace::__rust_begin_short_backtrace:: +calls=1 162 +206 80501030 + +fl=(122) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/cursor.rs +fn=(6146) as core::io::cursor::WriteThroughCursor>::write_all +315 1800600 +fi=(32) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs +616 225075 +fe=(122) +199 225075 +fi=(10) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs +2496 900300 +fe=(122) +136 450150 +fi=(33) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs +3101 75 +fe=(122) +146 75 +fi=(10) +2689 75 +fi=(32) +764 75 +-94 75 +fi=(33) +3101 225000 +fe=(122) +151 675000 +fi=(32) +672 600 +cfn=(5514) >::reserve::do_reserve_and_handle:: +calls=108 -14 +* 38600 +* 150 +fi=(33) +3101 75 +fe=(122) +151 225 ++54 225075 +fi=(20) +970 225075 +fi=(18) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs +664 450150 +cob=(2) +cfi=(2) +cfn=(4490) +calls=324108 0 +* 3476175 +fe=(122) +206 450150 +fi=(33) +2224 225075 +fe=(122) +212 225075 +319 2025675 + +fl=(30) +fn=(5138) +fi=(142) +cfi=(24) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/old/src/main.rs +cfn=(5140) xml_diagnostics::main +calls=1 43 +250 80501030 +fe=(30) + +fl=(6) +fn=(4128) (below main) +cob=(2) +cfi=(2) +cfn=(4130) +calls=1 0 +0 80501030 + +fn=(5100) __rustc::__rust_no_alloc_shim_is_unstable_v2 +0 25025 + +fn=(4178) +cfi=(8) +cfn=(4180) +calls=1 152 +0 80501030 + +fl=(32) +fn=(5228) ::finish_grow +544 201400 +fi=(10) +3212 201400 +fi=(47) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs +478 75525 +0 25175 +fe=(32) +631 25175 +fi=(10) +1401 25175 +fi=(23) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs +228 125875 +cfi=(24) +cfn=(5522) __rustc::__rust_realloc +calls=36276 41 +* 4179250 +fi=(27) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs +965 50350 ++1 75525 +fe=(32) +0 50350 +564 151050 +-20 200000 +fi=(10) +3212 200000 +fi=(47) +478 75000 +fe=(32) +631 50000 +fi=(10) +1401 25000 +fi=(23) +228 125000 +cfi=(24) +cfn=(5522) +calls=36002 41 +* 1400000 +fi=(27) +965 50000 ++1 75000 +fe=(32) +0 50000 +564 150000 + +fn=(5514) +658 100700 +512 50350 +fi=(10) +938 25175 +fi=(47) +478 25175 +0 25175 +fe=(32) +523 50350 +fi=(19) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs +1051 50350 +fe=(32) +159 176225 +fi=(19) +1051 75525 +fe=(32) +529 100700 +cfn=(5228) +calls=36258 +15 +* 5186250 +fi=(27) +2177 50350 ++1 25175 +fe=(32) +773 25175 ++1 25175 +668 100700 +-10 75000 +fi=(10) +938 25000 +fi=(47) +478 25000 +0 25000 +fe=(32) +523 50000 +fi=(19) +1051 125000 +fe=(32) +529 175000 +cfn=(5228) +calls=36004 +15 +* 2400000 +fi=(27) +2177 50000 ++1 25000 +fe=(32) +773 25000 ++1 25000 +668 100000 + +fl=(26) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs +fn=(5662) __rustc::__rust_dealloc +65 25000 +cob=(2) +cfi=(2) +cfn=(4878) +calls=42043 -65 +* 825000 + +fl=(121) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/writer.rs +fn=(6138) >>>::write_event:: +262 1600400 +fi=(143) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/convert/mod.rs +792 600150 +fe=(121) +264 600150 ++1 375125 ++53 75025 +0 75025 +318 75025 +-31 250000 ++26 50000 +fi=(32) +616 50000 +fi=(122) +199 50000 +fi=(10) +2496 200000 +fi=(122) +136 100000 +fi=(33) +3101 75 +fi=(122) +146 75 +fi=(10) +2689 75 +fi=(32) +764 75 +-94 75 +0 50000 +fi=(33) +3101 50000 +fi=(122) +151 150000 +fe=(121) +272 375125 +fi=(40) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs +765 225075 +fi=(122) +205 50000 +fi=(20) +970 50000 +fi=(18) +664 250000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=72000 0 +* 705300 +fi=(122) +206 100000 +fi=(33) +2224 50000 +fi=(122) +212 100000 +fi=(18) +847 150000 +fi=(23) +0 150000 +fi=(18) +847 50000 +fe=(121) +0 75025 +318 75025 +fi=(32) +616 75025 +fi=(122) +199 75025 +fi=(10) +2496 300100 +fi=(122) +136 150050 +fi=(32) +0 75025 +fi=(33) +3101 75025 +fi=(122) +151 225075 ++54 75025 +fi=(18) +664 75025 +fi=(122) +206 150050 +fi=(33) +2224 75025 +fi=(122) +212 75025 +fi=(119) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/io/cursor.rs +508 300100 +cfi=(122) +cfn=(6146) +calls=108036 315 +* 3891025 +0 75025 +fi=(27) +2177 150050 +fi=(119) +508 300100 +cfi=(122) +cfn=(6146) +calls=108036 315 +* 3976325 +0 75025 +fi=(40) +765 150050 +fi=(18) ++82 300100 +fi=(23) +175 100000 +cfi=(26) +cfn=(5662) +calls=36000 65 +* 850000 +0 75025 +fi=(18) +847 75025 +fi=(40) +-82 400100 +fe=(121) +308 1600400 +fi=(32) +616 75025 +fi=(122) +199 75025 +fi=(10) +2496 300100 +fi=(122) +136 150050 +fi=(33) +3101 25 +fi=(122) +146 25 +fi=(10) +2689 25 +fi=(32) +764 25 +-94 25 +fi=(33) +3101 75025 +fi=(122) +151 225075 ++54 75025 +fi=(18) +664 75025 +fi=(122) +206 150050 +fi=(33) +2224 150050 +fi=(122) +212 75025 +fi=(10) +2496 300100 +fi=(32) +616 75025 +fi=(122) +136 150050 +fi=(32) +0 75025 +fi=(122) +151 225075 +fi=(32) +672 300 +cfn=(5514) +calls=108 -14 +* 660025 +* 175 +cfn=(5514) +calls=36 -14 +* 18925 +* 25 +fi=(122) +205 75025 +fi=(20) +970 75025 +fi=(18) +664 300100 +cob=(2) +cfi=(2) +cfn=(4490) +calls=108036 0 +* 1125375 +fi=(122) +206 150050 +fi=(33) +2224 75025 +fi=(122) +212 75025 +fi=(119) +508 300100 +cfi=(122) +cfn=(6146) +calls=108036 315 +* 3976325 +0 150050 +fi=(18) +847 300100 +fe=(121) + +fl=(37) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs +fn=(5186) core::str::converts::from_utf8 +89 750125 +fi=(38) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs ++44 450075 ++12 300050 +0 1050175 +145 50 ++19 150050 ++1 300100 +fi=(10) +2689 300100 +3875 150050 +fi=(38) +222 150050 ++23 50 +-21 300050 ++17 300050 +0 150025 +241 1175400 ++1 587700 +-1 1325425 +fe=(37) +94 600100 +-94 150025 +98 600100 + +fl=(24) +fn=(5140) +cfn=(6356) measured_region +calls=1 79 +70 80501030 + +fn=(6356) +79 9 +fi=(19) +2144 1 +fi=(34) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/range.rs +1100 1 +0 8 +fi=(26) +0 3 +fi=(19) +2144 25 +fi=(34) +1100 25 +fi=(131) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hint.rs +491 50 +fe=(24) +91 175 +cfi=(109) +cfn=(6078) +calls=25 -53 +* 80496300 +fi=(27) +1230 50 ++1 100 +fi=(131) +491 50 +fi=(32) +631 50 +fe=(24) +91 25 +fi=(26) +-26 25 +cob=(2) +cfi=(2) +cfn=(4878) +calls=25 -65 +* 4100 +* 25 +fe=(24) ++29 8 + +fn=(5102) __rustc::__rust_alloc +41 25025 +fi=(13) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs +3994 25025 +762 25025 +fe=(24) +16 25025 +fi=(25) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs +161 100100 +fi=(26) +30 50050 ++1 50050 +cob=(2) +cfi=(2) +cfn=(4228) +calls=46080 -31 +* 661650 +fe=(24) + +fn=(5522) +41 50175 +fi=(13) +3994 50175 +762 50175 +fe=(24) +33 50175 +fi=(89) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs +-33 250875 +405 100350 +fi=(26) +70 100350 ++1 100350 +cob=(2) +cfi=(2) +cfn=(4460) +calls=72278 -71 +* 4826625 +fe=(24) + +fl=(45) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/schema.rs +fn=(6120) ::matches_variant +142 200200 +fi=(14) +454 25025 +fi=(13) +3994 25025 +fi=(96) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs +54 50050 ++45 25025 +fi=(13) +4149 25025 +fi=(96) +97 25025 +fi=(13) +3994 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +fi=(50) +180 25025 +0 75075 +fi=(13) +4049 25025 +fi=(96) +111 25025 ++7 100100 +fe=(45) ++33 225225 + +fn=(6102) ::variants +103 350 +fi=(14) +454 50 +fi=(73) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs +2454 50 +fi=(13) +3994 50 +fi=(96) +54 100 ++45 50 +fi=(13) +4149 50 +fi=(96) +97 50 +fi=(13) +3994 50 +fi=(33) +1865 50 +fi=(10) +3212 350 +fi=(47) +478 100 +fi=(32) +-17 100 +fi=(120) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/take.rs +0 50 +fi=(36) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/slice.rs +440 200 +fi=(13) +4049 50 +fi=(96) +111 50 ++7 200 +fe=(45) +-10 450 + +fl=(118) +fn=(6174) ::format_scalar_to +204 525000 ++4 300000 +0 75000 +208 225000 ++7 25000 +fi=(144) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/f64.rs +1264 25000 +886 100000 +fi=(113) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs +1037 50000 +fi=(32) +611 25000 +fi=(33) +1865 50000 +fe=(118) +211 25000 +fi=(19) +2144 25000 +fi=(145) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/api.rs +50 25000 +fi=(123) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/jeaiii.rs +310 50000 ++2 50000 +118 22500 ++2 45000 ++1 45000 +fi=(124) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs +-60 22500 +fi=(123) ++16 22500 +-39 45000 ++76 67500 +fi=(43) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs +219 22500 +fi=(123) +68 22500 ++20 22500 ++1 22500 +-21 22500 ++21 45000 +fe=(118) +-89 125000 +fi=(128) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/bit.rs +178 50000 +fi=(19) +2105 25000 +fi=(146) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/write.rs +121 25000 +fi=(27) +0 125000 +fi=(126) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/algorithm.rs +292 50025 +0 50 +fi=(128) +282 50 +fi=(10) +154 25 +fi=(147) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/decimal.rs +32 50 +fi=(43) +186 25 +fi=(19) +2150 25 +fi=(147) +108 25 +fi=(126) +-54 25 +fi=(127) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/shared.rs +181 100 +fi=(128) +282 49950 +fi=(10) +154 24975 +fi=(147) +32 49950 +fi=(43) +186 24975 +fi=(19) +2150 24975 +fi=(147) +108 24975 +fi=(126) +-54 24975 +fi=(127) +181 99900 ++5 50000 +fi=(126) +53 50000 +fi=(123) +310 50000 ++2 24500 +118 9375 ++2 18750 ++1 18750 +fi=(124) +-60 3350 +fi=(123) ++16 3350 +-39 6700 ++76 10050 +fi=(43) +219 3350 +fi=(123) +68 6700 ++20 3350 ++1 3350 +-21 3350 ++21 6700 +fi=(126) +225 3350 ++3 9500 +0 224775 +352 49950 +0 24975 +fi=(148) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/int_macros.rs +2261 24975 +fi=(126) +875 24975 +456 49950 +fi=(43) +219 74925 +fi=(126) +0 24975 +fi=(43) +219 24975 +fi=(149) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/index.rs +13 24975 +fi=(113) +1057 49950 +fi=(148) +2261 24975 +fi=(126) +883 24975 +457 24975 +1381 149850 +fi=(149) +13 24975 +fi=(126) +461 49950 ++12 74925 +836 99900 +-6 74925 ++7 49950 +-7 99900 +968 24975 +fi=(10) +2728 24975 +fi=(126) +484 24975 ++13 49950 +-51 49950 ++54 24975 +fi=(123) +314 5000 +fi=(43) +-95 2250 +fi=(123) +68 2250 ++20 4500 +-88 45000 +fe=(118) +212 22500 +cfi=(37) +cfn=(5186) +calls=32400 89 +* 1215000 +fi=(27) +714 45000 +fi=(123) +0 12750 +319 38250 ++2 25500 +fi=(126) +0 11450 +fi=(124) +61 250 +fi=(123) ++16 750 +fe=(118) +212 250 +cfi=(37) +cfn=(5186) +calls=360 89 +* 11000 +fi=(27) +714 500 +fi=(123) +0 4500 +fe=(118) +212 2250 +cfi=(37) +cfn=(5186) +calls=3240 89 +* 110250 +fi=(27) +714 4500 +fi=(123) +314 5750 +fi=(43) +-95 2350 +fi=(123) +68 4700 ++20 4700 ++1 4700 +fi=(126) +225 2350 ++3 7000 +fi=(43) +-9 6025 +fi=(123) +68 12050 ++20 12050 ++1 6025 +-51 12050 ++76 18075 +-46 6025 ++20 6025 ++1 6025 +-21 6025 ++21 12050 +fi=(126) +225 6025 ++3 12675 +fi=(123) ++98 25500 +fi=(124) +61 1050 +fi=(123) ++16 525 +fi=(126) +225 1050 +fi=(10) +1096 1575 +fi=(43) +102 525 +fi=(150) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/specialize.rs +-68 2100 +cob=(2) +cfi=(2) +cfn=(4976) +calls=756 -34 +* 9125 +fi=(10) +1096 17175 +fi=(43) +102 5725 +fi=(150) +-68 22900 +cob=(2) +cfi=(2) +cfn=(4976) +calls=8244 -34 +* 94275 +fi=(126) +236 6250 ++3 6250 +fi=(146) +-85 25000 +fe=(118) ++62 6250 +cfi=(37) +cfn=(5186) +calls=9000 89 +* 403500 +fi=(27) +714 12500 +fi=(126) +1398 74925 +535 24975 +1404 149850 ++2 49950 +0 24975 +fi=(10) +2728 24975 +fi=(126) +1088 24975 +1412 74925 +0 36050 +fi=(10) +2728 36050 +fi=(126) +1088 36050 +1412 108150 +0 174825 +533 24975 +fi=(123) +328 25500 +118 12750 ++2 25500 ++1 25500 +fi=(124) +-60 10250 +fi=(123) ++16 10250 +-39 30750 ++76 41000 +fi=(43) +219 10250 +fi=(123) +68 20500 ++20 10250 ++1 10250 +-21 10250 ++21 10250 +-51 10250 ++76 30750 +-46 10250 ++20 10250 ++1 10250 +-21 10250 ++21 20500 +fi=(126) +225 10250 ++3 20500 +fi=(27) +0 50000 +fe=(118) +221 600000 +fi=(126) ++26 37500 +fi=(43) +102 18750 +fi=(34) +1142 37500 +0 18750 +1142 18750 +fi=(19) +2144 18750 +0 18750 +2144 18750 +fi=(126) +251 56250 +fi=(34) +1142 18750 +fi=(19) +2144 12500 +fi=(126) +251 37500 +fi=(34) +1142 12500 +fi=(126) +248 18750 ++7 18750 +fi=(146) +154 37500 +fe=(118) ++62 18750 +cfi=(37) +cfn=(5186) +calls=27000 89 +* 1273000 +fi=(27) +714 37500 +fi=(43) +219 2500 +fi=(123) +68 5000 ++20 5000 ++1 2500 +-51 7500 ++76 7500 +-46 2500 ++20 2500 ++1 2500 +-21 2500 ++21 2500 +-51 2500 ++76 7500 +-46 2500 ++20 2500 ++1 2500 +-21 2500 ++21 5000 +fi=(126) +225 2500 ++3 5000 +fe=(118) + +fn=(6092) ::collect_namespaces +88 225 ++1 100 +fi=(33) +-89 25 +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 175 +180 25 +fi=(14) +454 25 +fi=(73) +2454 25 +fe=(118) +0 50 +cfn=(6093) ::collect_namespaces'2 +calls=36 88 +0 2925 +0 25 +fi=(14) +1663 25 +fi=(50) +180 25 +fe=(118) +-85 50 ++5 150 +fi=(28) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/boxed.rs +2415 25 +fe=(118) +103 50 +fi=(14) +454 25 +fe=(118) +103 25 +0 50 +114 25 +cfi=(45) +cfn=(6102) +calls=36 -11 +* 1200 +fi=(33) +3101 25 ++25 25 +fe=(118) +115 25 +fi=(32) +425 50 +631 25 +fe=(118) +123 200 + +fn=(6093) +88 225 ++1 100 +fi=(33) +-89 25 +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 175 +180 25 +fe=(118) +0 75 +fi=(14) +1663 75 +fi=(50) +180 75 +fe=(118) +-85 150 ++5 300 +0 50 +114 25 +cfi=(45) +cfn=(6102) +calls=36 -11 +* 1200 +fi=(33) +3101 25 ++25 25 +fe=(118) +115 25 +fi=(32) +425 50 +631 25 +fe=(118) +123 200 + +fn=(6118) ::write_model::<&mut core::io::cursor::Cursor>> +230 225 ++9 125 +0 50 +252 50 +0 50 +fi=(14) +454 25 +fi=(73) +2454 75 +fe=(118) +253 75 +cfi=(45) +cfn=(6120) +calls=36 142 +* 950 +* 50 +0 125 +fi=(98) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs +0 25 +fe=(118) +280 75 +cfi=(37) +cfn=(5186) +calls=36 89 +* 2000 +fi=(27) +0 50 +2177 50 +0 25 +fe=(118) +281 100 ++3 75 +fi=(99) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs +124 100 +0 25 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 450 +fi=(45) +4 50 +fi=(116) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs +-4 50 +fi=(14) +1663 25 +fi=(50) +180 50 +fe=(118) +325 75 ++21 200 +cfi=(121) +cfn=(6138) +calls=36 -84 +* 4400 +0 25 +fi=(27) +965 50 +fi=(18) +0 25 +fi=(33) +1865 25 +fe=(118) +350 50 +fi=(14) +1663 25 +fi=(50) +180 25 +0 475 +fi=(45) +4 25 +fe=(118) +381 25 +0 25 +273 50 +fi=(43) +-89 50 ++2 50 +fi=(40) +743 75 +fe=(118) +274 25 +fi=(129) /home/bailey/github/polyxml-perf-old/crates/polyxml-core/src/value.rs +59 25 +fe=(118) +383 25 +fi=(40) +743 75 +0 25 +743 50 +fi=(33) +0 25 +fe=(118) +389 125 +0 50 +413 50 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 25075 +fi=(14) +1663 25000 +fi=(50) +180 25000 +fi=(28) +2415 25000 +fe=(118) +415 75000 +fi=(40) +743 50000 +fi=(14) +454 25000 +fi=(40) +743 50000 +fi=(23) +0 25000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fi=(73) +2454 25000 +fe=(118) +465 200000 +cfn=(6119) ::write_model::<&mut core::io::cursor::Cursor>>'2 +calls=36000 230 +* 79784625 +* 25000 +fi=(27) +2177 50000 +0 50 +fi=(14) +1663 25 +fi=(50) +180 25 +fi=(98) +350 50 +fe=(118) +502 175 +cfi=(121) +cfn=(6138) +calls=36 262 +* 3800 +0 25 +fi=(27) +965 50 +fe=(118) +506 200 +0 25 +505 25 ++1 25 +fi=(18) +847 50 +fi=(23) +0 25 +fi=(18) +847 75 +fe=(118) + +fn=(6119) +230 225000 ++9 125000 +0 50000 +252 50000 +0 50000 +fi=(14) +454 25000 +fi=(73) +2454 75000 +fe=(118) +253 75000 +cfi=(45) +cfn=(6120) +calls=36000 142 +* 950000 +* 50000 +0 125000 +fi=(98) +0 25000 +fe=(118) +280 75000 +cfi=(37) +cfn=(5186) +calls=36000 89 +* 1475000 +fi=(27) +0 50000 +2177 50000 +0 25000 +fe=(118) +281 100000 ++3 75000 +fi=(99) +124 100000 +0 25000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 450000 +fi=(45) +4 150000 +fi=(116) +-4 150000 +fi=(14) +1663 75000 +fi=(50) +180 100000 +0 25000 +fe=(118) +273 50000 +fi=(43) +-89 50000 ++2 50000 +fi=(40) +743 75000 +fe=(118) +274 25000 +fi=(129) +59 25000 +fe=(118) +307 25000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fe=(118) +308 50000 +cfi=(37) +cfn=(5186) +calls=36000 89 +* 1225000 +fi=(27) +0 50000 +2177 50000 +0 25000 +fe=(118) +281 25000 ++28 25000 ++3 75000 +-3 25000 +0 25000 +314 100000 ++1 75000 +cfn=(6174) +calls=36000 204 +* 2728250 +* 50000 +-91 100000 +fi=(98) +350 25000 +fe=(118) +-33 150000 +cfi=(99) +cfn=(6182) ::push_attribute::<(&str, &str)> +calls=36000 -61 +* 16322000 +fi=(18) +847 75000 +fe=(118) +325 75000 ++21 200000 +cfi=(121) +cfn=(6138) +calls=36000 -84 +* 5319400 +0 25000 +fi=(27) +965 50000 +fi=(18) +0 25000 +fi=(33) +1865 25000 +fe=(118) +350 50000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 475000 +fi=(45) +4 75000 +fe=(118) +381 75000 +0 50000 +273 100000 +fi=(43) +-89 100000 ++2 100000 +fi=(40) +743 150000 +fe=(118) +274 50000 +fi=(129) +59 50000 +fe=(118) +383 50000 +fi=(40) +743 150000 +0 50000 +743 100000 +fi=(33) +0 50000 +fe=(118) +389 250000 +fi=(40) +0 50000 +fe=(118) +391 200000 ++1 150000 +cfn=(6174) +calls=72000 204 +* 7846350 +* 150000 +0 50000 +224 200000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(118) +394 100000 +cfi=(37) +cfn=(5186) +calls=72000 89 +* 3075000 +0 200000 +fi=(27) +2177 100000 +0 50000 +fe=(118) +281 50000 +395 50000 ++3 150000 ++4 400000 +cfi=(121) +cfn=(6138) +calls=72000 262 +* 8820325 +fi=(27) +965 100000 +fi=(105) +108 200000 +cfn=(6220) +calls=72000 +93 +* 5613050 +fi=(99) +564 250000 +fe=(118) +405 200000 +cfi=(121) +cfn=(6138) +calls=72000 262 +* 4466075 +fi=(27) +965 100000 +fe=(118) +408 350000 +cfi=(121) +cfn=(6138) +calls=72000 262 +* 7619175 +fi=(27) +965 100000 +fe=(118) +410 50000 +fi=(18) +847 100000 +fi=(27) +0 150000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +fi=(98) +350 50000 +fe=(118) +502 175000 +cfi=(121) +cfn=(6138) +calls=36000 262 +* 3800000 +0 25000 +fi=(27) +965 50000 +fe=(118) +506 200000 +0 25000 +505 25000 ++1 25000 +fi=(18) +847 50000 +fi=(23) +0 25000 +fi=(18) +847 75000 +fe=(118) + +fn=(6080) +172 350 +cfi=(6) +cfn=(5100) +calls=36 0 +* 25 +fi=(23) +-42 75 +cfi=(24) +cfn=(5102) +calls=36 -89 +* 11950 +fi=(32) +470 50 +fi=(119) +102 100 +fe=(118) ++79 50 +fi=(40) +0 25 +743 25 +0 25 +fi=(121) +124 75 +fe=(118) ++62 50 +0 50 +188 75 +cfn=(6090) ::build +calls=36 23 +* 6525 +fi=(40) +743 75 +0 25 +743 75 +0 50 +fe=(118) +191 225 +cfn=(6118) +calls=36 +39 +* 80475575 +* 25 +fi=(27) +2177 50 +fe=(118) +201 125 +fi=(18) +847 125 +fe=(118) +202 225 + +fn=(6090) +23 250 +fi=(33) +462 100 +fe=(118) +28 50 +cfn=(6092) +calls=36 +60 +* 5675 +fi=(33) +3126 25 +fe=(118) +30 25 +fi=(40) +709 50 +fe=(118) +0 25 +31 25 +fi=(32) +425 50 +631 25 +fe=(118) +86 225 + +fl=(95) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs +fn=(6194) >::from +376 75000 ++2 50000 ++1 50000 +fi=(105) +168 50000 +cfn=(6196) +calls=36000 +33 +* 1722500 +* 25000 +fe=(95) +377 25000 ++4 100000 + +fl=(99) +fn=(6182) +256 175000 +fi=(98) ++28 75000 +fi=(32) +611 25000 +fi=(125) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/char/methods.rs +2558 25000 +fi=(39) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs +1440 25000 +fi=(33) +2224 75000 +fi=(143) +781 50000 +cfi=(95) +cfn=(6194) +calls=36000 376 +* 2097500 +fe=(99) +261 75000 +cfn=(6204) ::push_attr +calls=36000 +41 +* 5899500 ++1 200000 +fi=(98) ++23 50000 +fi=(47) +478 25000 +fi=(32) +0 25000 +461 25000 +0 100000 +cfi=(6) +cfn=(5100) +calls=36000 0 +0 25000 +0 25000 +fi=(23) +130 75000 +cfi=(24) +cfn=(5102) +calls=36000 -89 +* 950000 +fi=(32) +470 50000 +fi=(36) +0 25000 +fi=(18) +573 100000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=36000 0 +* 375000 +* 50000 +fi=(98) +286 75000 +fi=(32) +672 175000 +cfn=(5514) +calls=36000 -14 +* 5375000 +* 75000 +fe=(99) + +fn=(6204) +302 225000 +fi=(98) +-18 75000 +fi=(33) +1461 50000 +fi=(101) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs +222 50000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +fi=(33) +2981 50000 +0 25000 +fi=(20) +970 25000 +fi=(18) +573 75000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=36000 0 +* 450000 +fi=(33) +2986 50000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +-59 25000 +fi=(18) +-38 25000 +fi=(33) +2986 50000 +fi=(98) +0 75000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +fi=(33) +2981 50000 +fi=(20) +970 50000 +fi=(18) +573 50000 +cob=(2) +cfi=(2) +cfn=(4490) +calls=36000 0 +* 449500 +fi=(33) +2986 50000 +fi=(32) +764 25000 +-94 25000 +fi=(125) +2558 25000 +fi=(39) +1440 25000 +fi=(33) +2224 25000 +fi=(18) +847 75000 +fe=(99) +309 200000 +fi=(32) +672 100000 +cfn=(5514) +calls=36000 -14 +* 3125000 +-56 25000 +fi=(33) +3101 50000 +fe=(99) + +ob=(1) /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 +fl=(1) ??? +fn=(0) 0x0000000000023340 +cob=(6) +cfi=(6) +cfn=(4128) +calls=1 0 +0 80501030 + +totals: 80501030 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-annotated.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-annotated.txt new file mode 100644 index 0000000..3878048 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-annotated.txt @@ -0,0 +1,209 @@ +-------------------------------------------------------------------------------- +Profile data file 'benchmarks/rust-runtime-investigation/target/evidence/selected-diagnostics/read-1000.callgrind' (creator: callgrind-3.26.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 89724906 +Trigger: Program termination +Profiled target: benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics read 1000 25 instructions (PID 394741, part 1) +Events recorded: Ir +Events shown: Ir +Event sort order: Ir +Thresholds: 95 +Include dirs: +User annotated: +Auto-annotation: off + +-------------------------------------------------------------------------------- +Ir +-------------------------------------------------------------------------------- +296,585,254 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir file:function +-------------------------------------------------------------------------------- +21,680,675 ( 7.31%) ???:0x0000000000197a00 [/usr/lib/x86_64-linux-gnu/libc.so.6] +13,926,225 ( 4.70%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs:core::str::converts::from_utf8 +11,858,578 ( 4.00%) ???:0x00000000000b2400 [/usr/lib/x86_64-linux-gnu/libc.so.6] +10,868,100 ( 3.66%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::next [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] +10,352,875 ( 3.49%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 9,477,175 ( 3.20%) crates/polyxml-core/src/parser.rs:::parse_sub_tree::<&[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 8,900,000 ( 3.00%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs: as core::hash::Hasher>::write [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 7,805,073 ( 2.63%) ???:0x00000000000b20e0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 6,602,200 ( 2.23%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 6,401,100 ( 2.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::next [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 5,426,700 ( 1.83%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/parser/element.rs:::feed [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 5,127,950 ( 1.73%) ???:free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 4,625,000 ( 1.56%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs:::hash_one::<&[u8]> + 4,403,350 ( 1.48%) ???:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 4,058,539 ( 1.37%) ???:0x00000000001972a0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 3,650,000 ( 1.23%) crates/polyxml-core/src/converters.rs:::parse_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 3,275,600 ( 1.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 3,150,700 ( 1.06%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs:core::str::converts::from_utf8 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 3,001,875 ( 1.01%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 3,000,000 ( 1.01%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::hash_one::<&[u8]> + 2,825,000 ( 0.95%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::find:: + 2,801,425 ( 0.94%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::parse_sub_tree::<&[u8]> + 2,625,750 ( 0.89%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:core::ptr::drop_glue::> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 2,550,000 ( 0.86%) crates/polyxml-core/src/parser.rs:polyxml::parser::is_nil_element [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 2,475,825 ( 0.83%) crates/polyxml-core/src/parser.rs:polyxml::parser::namespace_scope [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 2,475,550 ( 0.83%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::parse_sub_tree::<&[u8]> + 2,414,886 ( 0.81%) ???:0x00000000000b0f70 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,375,000 ( 0.80%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::hash_one::<&[u8]> + 2,325,000 ( 0.78%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:::check_for_duplicates [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 2,200,000 ( 0.74%) /rust/deps/hashbrown-0.17.1/src/raw.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 2,175,000 ( 0.73%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::next + 2,076,050 ( 0.70%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::emit_start + 2,025,675 ( 0.68%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_end [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 2,025,675 ( 0.68%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_start [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 2,001,075 ( 0.67%) crates/polyxml-core/src/parser.rs:::parse_attributes [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 1,950,800 ( 0.66%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 1,948,250 ( 0.66%) ???:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,900,350 ( 0.64%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::next + 1,800,000 ( 0.61%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::find:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 1,583,400 ( 0.53%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/parse.rs:::parse_scalar + 1,525,000 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::parse_sub_tree::<&[u8]> + 1,500,150 ( 0.51%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 1,500,000 ( 0.51%) /rust/deps/hashbrown-0.17.1/src/map.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 1,500,000 ( 0.51%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/mod.rs:::hash_one::<&[u8]> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 1,489,425 ( 0.50%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 1,465,250 ( 0.49%) ???:0x00000000000b4180 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,366,800 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::next + 1,357,775 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::finish_grow [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 1,350,275 ( 0.46%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 1,350,000 ( 0.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>>::grow_one [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 1,275,425 ( 0.43%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs:::emit_end + 1,226,475 ( 0.41%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::finish + 1,225,425 ( 0.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:; 8]>>::from_elem + 1,200,400 ( 0.40%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 1,200,000 ( 0.40%) crates/polyxml-core/src/parser.rs:polyxml::parser::record_content_token [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 1,199,850 ( 0.40%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 1,151,775 ( 0.39%) crates/polyxml-core/src/parser.rs:::finish [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 1,150,300 ( 0.39%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:::feed + 1,075,300 ( 0.36%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 1,050,400 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 1,050,300 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:::feed + 1,050,300 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::emit_end + 1,050,150 ( 0.35%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::parse_sub_tree::<&[u8]> + 1,000,000 ( 0.34%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs:::parse_sub_tree::<&[u8]> + 975,000 ( 0.33%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 950,100 ( 0.32%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::next + 900,750 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::parse_sub_tree::<&[u8]> + 900,525 ( 0.30%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 900,300 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 900,275 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::emit_end + 900,100 ( 0.30%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 897,350 ( 0.30%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::parse_scalar + 850,150 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 850,000 ( 0.29%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs:::local_name [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 850,000 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::parse_sub_tree::<&[u8]> + 850,000 ( 0.29%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs:::local_name + 800,575 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::emit_start + 800,250 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 800,100 ( 0.27%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs:::parse_sub_tree::<&[u8]> + 800,000 ( 0.27%) crates/polyxml-core/src/parser.rs:::new [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 775,475 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::finish + 775,000 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::try_allocate_in [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 750,250 ( 0.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 750,250 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::emit_start + 750,000 ( 0.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::next + 750,000 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs: as core::hash::Hasher>::write + 750,000 ( 0.25%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/hash/random.rs:::hash_one::<&[u8]> + 700,700 ( 0.24%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:; 8]>>::from_elem [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 700,250 ( 0.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 700,225 ( 0.24%) crates/polyxml-core/src/parser.rs:::push_list_item [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 700,000 ( 0.24%) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 675,675 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter_nested.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter + 675,225 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs:::emit_start + 675,150 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:core::str::converts::from_utf8 + 675,000 ( 0.23%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::unescape [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 650,125 ( 0.22%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:polyxml::parser::namespace_scope + 608,450 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::parse_scalar + 603,525 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::finish_grow + 600,600 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 600,200 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 600,150 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:core::ptr::drop_glue::> + 600,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 600,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:polyxml::parser::is_nil_element + 575,050 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs:::parse_sub_tree::<&[u8]> + 575,000 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/macros/mod.rs:::parse_scalar + 550,550 ( 0.19%) crates/polyxml-core/src/parser.rs:polyxml::parser::resolve_record_schema [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 550,550 ( 0.19%) crates/polyxml-core/src/schema.rs:polyxml::schema::validate_content [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 550,350 ( 0.19%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::finish + 525,175 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::emit_end + 525,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::check_for_duplicates + 525,000 ( 0.18%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::check_for_duplicates + 501,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs:__rustc::__rust_alloc + 501,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs:__rustc::__rust_alloc + 500,000 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/number.rs:::try_fast_path:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 500,000 ( 0.17%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs:::emit_text [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 500,000 ( 0.17%) /rust/deps/hashbrown-0.17.1/src/lib.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 500,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs: as core::hash::Hasher>::write + 500,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>::map_or::<&str, >::from::{closure#0}> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 500,000 ( 0.17%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::parse_attributes + 500,000 ( 0.17%) crates/polyxml-core/src/parser.rs:polyxml::parser::parse_field_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 475,475 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:>; 4]> as core::ops::drop::Drop>::drop [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 475,475 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:; 8]> as core::ops::drop::Drop>::drop [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 466,875 ( 0.16%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 452,375 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::finish_grow + 450,150 ( 0.15%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs:::emit_end + 450,150 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 450,150 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::emit_start + 450,100 ( 0.15%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs:::parse_scalar + 450,050 ( 0.15%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr_raw::find_avx2 + 425,850 ( 0.14%) ???:0x00000000000b2300 [/usr/lib/x86_64-linux-gnu/libc.so.6] + 422,350 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 + 419,500 ( 0.14%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-integer-1.0.6/src/algorithm.rs:::parse_scalar + 400,400 ( 0.14%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter.rs:> as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 400,300 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 400,125 ( 0.13%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs:memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 + 400,100 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::feed + 400,000 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/collections/hash/map.rs:::parse_sub_tree::<&[u8]> + 377,250 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::finish_grow + 375,425 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::emit_start + 375,125 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs:::parse_attributes + 375,125 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs:::emit_start + 375,000 ( 0.13%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs:::next + 350,100 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:::feed + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>::push_mut [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs: as core::hash::Hasher>::write + 350,000 ( 0.12%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 325,050 ( 0.11%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:::parse_sub_tree::<&[u8]> + 300,300 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>>::into_boxed_slice [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 300,200 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::finish + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/clone.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:<&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,100 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,075 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs:polyxml::parser::namespace_scope + 300,050 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,050 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs:::emit_end + 300,025 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::parse_sub_tree::<&[u8]> + 300,025 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::parse_sub_tree::<&[u8]> + 300,000 ( 0.10%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::parse_sub_tree::<&[u8]> + 300,000 ( 0.10%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::name + 300,000 ( 0.10%) /rust/deps/hashbrown-0.17.1/src/control/tag.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/sse2.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs:polyxml::parser::is_nil_element + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:>::read_event_impl::<&mut alloc::vec::Vec> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:, usize, std::hash::random::RandomState>>::get::<[u8]> + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:::check_for_duplicates + 300,000 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs:::name + 291,750 ( 0.10%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/traits/iterator.rs:::next + 275,050 ( 0.09%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::parse_attributes + 250,500 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs:__rustc::__rust_alloc + 250,500 ( 0.08%) benchmarks/rust-runtime-investigation/target/selected/src/main.rs:__rustc::__rust_alloc [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 250,475 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::finish + 250,050 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/noskip.rs:::parse_scalar + 250,000 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/iterator.rs:::parse_scalar + 250,000 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::parse_sub_tree::<&[u8]> + 250,000 ( 0.08%) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs:::parse_attributes + 250,000 ( 0.08%) /rust/deps/hashbrown-0.17.1/src/raw.rs:::parse_attributes + 250,000 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::parse_scalar + 226,525 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::finish_grow + 225,225 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs:polyxml::parser::resolve_record_schema + 225,100 ( 0.08%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs:::push_list_item + 225,075 ( 0.08%) crates/polyxml-core/src/schema.rs:::finish + 225,050 ( 0.08%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::emit_end + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-valgrind.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-valgrind.txt new file mode 100644 index 0000000..3091a19 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-valgrind.txt @@ -0,0 +1,12 @@ +==394741== Callgrind, a call-graph generating cache profiler +==394741== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al. +==394741== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info +==394741== Command: benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics read 1000 25 instructions +==394741== Parent PID: 388927 +==394741== +==394741== For interactive control, run 'callgrind_control -h'. +==394741== +==394741== Events : Ir +==394741== Collected : 296585254 +==394741== +==394741== I refs: 296,585,254 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000.callgrind b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000.callgrind new file mode 100644 index 0000000..b5c7286 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000.callgrind @@ -0,0 +1,3680 @@ +# callgrind format +version: 1 +creator: callgrind-3.26.0 +pid: 394741 +cmd: benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics read 1000 25 instructions +part: 1 + + +desc: I1 cache: +desc: D1 cache: +desc: LL cache: + +desc: Timerange: Basic block 0 - 89724906 +desc: Trigger: Program termination + +positions: line +events: Ir +summary: 296585254 + + +ob=(2) /usr/lib/x86_64-linux-gnu/libc.so.6 +fl=(2) ??? +fn=(4508) 0x00000000000b20e0 +0 4946685 +cfn=(4942) 0x00000000000b0f70 +calls=73313 0 +0 1086761 +0 2459238 +cfn=(4942) +calls=35010 0 +0 548102 +0 399150 + +fn=(4330) 0x00000000000b08d0 +0 120120 + +fn=(4488) 0x0000000000197a00 +0 21680675 + +fn=(4162) 0x000000000002a580 +cob=(6) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics +cfi=(6) ??? +cfn=(4176) main +calls=1 0 +0 296585254 + +fn=(4232) 0x00000000000b2400 +0 10553314 +cfn=(4942) +calls=35955 0 +0 780023 +0 1272808 +cfn=(4330) +calls=32761 0 +0 117485 +0 8432 +cfn=(4330) +calls=799 0 +0 2635 +0 24024 + +fn=(5752) 0x00000000001972a0 +0 4058539 + +fn=(4226) malloc +0 796400 +cfn=(4232) +calls=73729 0 +0 12746428 +0 3606950 + +fn=(4460) 0x00000000000b4180 +0 1109825 +cfn=(4232) +calls=64 0 +0 12293 +0 325500 +cfn=(4502) 0x00000000000b2300 +calls=37042 0 +0 3506272 +0 25225 +cob=(3) ??? +cfi=(3) ??? +cfn=(4486) 0x0000000004b296a0 +calls=63 0 +0 325 +0 150 +cfn=(4502) +calls=63 0 +0 2925 +0 4550 + +fn=(4128) (below main) +cfn=(4162) +calls=1 0 +0 296585254 + +fn=(4458) realloc +0 1670225 +cfn=(4460) +calls=38415 0 +0 4987065 +0 278025 + +fn=(4942) +0 2414886 + +fn=(4502) +0 300600 +cfn=(4508) +calls=37105 0 +0 3083347 +0 125250 + +fn=(4868) free +0 597300 +cfn=(4508) +calls=73670 0 +0 6356589 +0 4530650 + +ob=(3) +fl=(3) +fn=(4486) +0 50 +cob=(2) +cfi=(2) +cfn=(4488) +calls=109 0 +0 275 + +ob=(6) +fl=(108) /home/bailey/github/PolyXML/crates/polyxml-core/src/converters.rs +fn=(5790) ::parse_scalar +28 1275000 ++5 1275000 +fi=(111) /home/bailey/github/PolyXML/crates/polyxml-core/src/lib.rs +-33 25000 +fi=(76) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/mod.rs +199 25000 +fi=(56) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/macros/mod.rs +434 50000 +0 25000 +434 75000 +fi=(76) +0 25000 +fe=(108) +132 75000 +cfi=(38) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs +cfn=(5180) core::str::converts::from_utf8 +calls=37000 -43 +* 1961250 +fi=(27) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs +0 50000 +2177 50000 +0 25000 +fi=(76) +199 25000 +0 75000 +fi=(56) +434 75000 +fi=(111) +0 25000 +fi=(32) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs +435 125000 +cfn=(5898) ::try_allocate_in +calls=37000 +12 +* 11703953 +0 25000 +435 75000 ++1 25000 +fi=(36) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/slice.rs ++16 50000 +fi=(18) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs +573 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 330000 +fe=(108) +133 100000 +0 50000 +209 225000 +0 50000 +209 450000 +fi=(56) +434 150000 +fi=(76) +0 25000 +fi=(56) +434 175000 +fi=(112) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/parse.rs +175 100000 +fi=(56) +0 25000 +fi=(109) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-integer-1.0.6/src/algorithm.rs +199 150000 +fi=(44) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs +0 50000 +fi=(113) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/iterator.rs +252 100000 +0 50000 +252 25000 +fi=(109) +677 25000 ++10 25000 +0 75000 +411 50000 +fi=(10) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs +2689 25000 +fi=(124) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs +39 50000 +fi=(109) +411 94500 +fi=(10) +2689 47250 +fi=(124) +39 94500 +fi=(110) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/noskip.rs +270 72250 +fi=(141) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/int_macros.rs +2261 72250 +fi=(115) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs +132 72250 +fi=(141) +2189 72250 +fi=(44) +184 216750 +0 25000 +fe=(108) +154 75000 +fi=(44) ++30 50000 +fi=(112) +872 205600 +fi=(10) +2689 102800 +fi=(124) +39 205600 +fi=(10) +2728 155600 +fi=(112) +566 77800 +fi=(10) +2652 77800 +fi=(110) +144 77800 +fi=(44) ++40 155600 +fi=(19) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs +2105 25000 +fi=(112) +616 25000 +0 75000 +fi=(44) +380 50000 +fi=(113) +252 75000 +fi=(44) +-68 50000 +0 25000 +fi=(112) +872 50000 +fi=(10) +2689 25000 +fi=(124) +39 50000 +fi=(112) +872 50000 +fi=(10) +2689 25000 +fi=(124) +39 50000 +fi=(10) +2728 100000 +fi=(112) +623 50000 +fi=(10) +2652 50000 +fi=(110) +144 50000 +fi=(44) ++40 100000 +0 50000 +90 50000 +fi=(112) +616 250000 +-48 100000 +fi=(44) +184 50000 +fi=(110) +0 50000 +fi=(112) +666 50000 +fi=(44) +0 25000 +fi=(112) +747 50000 +0 50000 +855 50000 +216 300000 ++51 25000 +cfi=(114) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/number.rs +cfn=(5918) ::try_fast_path:: +calls=37000 45 +* 675000 +* 50000 +0 25000 +fe=(108) +164 75000 + +fl=(103) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs +fn=(5718) ::local_name +141 250000 ++69 250000 +fi=(10) +1096 100000 +fi=(44) +90 50000 +fi=(102) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/memchr.rs +-62 100000 ++13 100000 +-41 100000 +42 200000 ++4 100000 +-5 250000 +fi=(54) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/const_ptr.rs +-41 50000 +fe=(103) +143 350000 + +fl=(59) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs +fn=(6140) >>::drop_slow +2138 75 ++6 25 +fi=(18) +842 25 ++5 25 +cfi=(55) /rust/deps/hashbrown-0.17.1/src/raw.rs +cfn=(6142) as core::ops::drop::Drop>::drop +calls=37 3486 +* 450 +fi=(119) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/rc.rs +3277 25 +fe=(59) +3392 25 +fi=(13) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs +4049 25 +fe=(59) +3544 25 +fi=(23) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs +175 175 +cfi=(26) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs +cfn=(5682) __rustc::__rust_dealloc +calls=37 65 +* 850 +fe=(59) + +fl=(92) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/mod.rs +fn=(5702) ::find:: +1497 1100000 +fi=(10) +1096 200000 +fi=(44) +90 100000 +fi=(102) +-62 200000 ++13 200000 +-41 200000 +42 850000 ++4 425000 +-5 950000 +fe=(92) +1499 700000 + +fl=(33) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs +fn=(5814) >::push_mut +1027 125000 ++2 25000 ++3 50000 +fi=(20) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs +-62 50000 +fi=(18) +1963 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fe=(33) +1038 50000 ++4 100000 + +fn=(5964) >>::into_boxed_slice +1723 100100 +fi=(32) +616 25025 +fe=(33) +1598 75075 +fi=(32) +832 25025 +fi=(10) +1401 25025 +fi=(32) +839 50050 +fi=(10) +1401 25025 +fi=(23) +228 75075 +cfi=(24) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/src/main.rs +cfn=(5538) __rustc::__rust_realloc +calls=37037 41 +* 7260022 +fi=(27) +965 50050 +fe=(33) +1731 125125 + +fl=(38) +fn=(5180) +89 1125250 +fi=(39) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs ++44 675150 ++12 450100 +0 1575350 +164 225050 ++1 450100 +fi=(10) +2689 450100 +3875 225050 +fi=(39) +222 225050 ++2 450100 ++17 450100 +0 225050 +241 3590050 ++1 1795025 +-1 3815100 +fe=(38) +94 900200 +-94 225050 +98 900200 + +fl=(41) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs +fn=(5710) >::map_or::<&str, >::from::{closure#0}> +1222 100000 ++5 200000 ++4 200000 + +fl=(107) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs +fn=(5778) quick_xml::escape::unescape +236 250000 ++52 25000 +fi=(54) +473 75000 +0 25000 +fi=(13) +3994 50000 +fi=(78) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/memchr.rs +153 125000 +cfi=(84) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/x86_64/avx2/memchr.rs +cfn=(5490) memchr::arch::x86_64::memchr::memchr2_raw::find_avx2 +calls=37000 659 +* 1053000 +fi=(41) +2869 50000 +fe=(107) +321 50000 +fi=(91) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/traits.rs +0 25000 +fe=(107) +327 100000 +0 25000 +238 225000 + +fl=(6) +fn=(4176) +cfi=(8) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/rt.rs +cfn=(4178) std::rt::lang_start_internal +calls=1 152 +0 296585254 + +fn=(5090) __rustc::__rust_no_alloc_shim_is_unstable_v2 +0 125250 + +fn=(4126) (below main) +cob=(2) +cfi=(2) +cfn=(4128) +calls=1 0 +0 296585254 + +fl=(85) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/buffered_reader.rs +fn=(5502) <&[u8] as quick_xml::reader::XmlSource<&mut alloc::vec::Vec>>::read_with:: +211 1800600 +fi=(33) +3101 150050 +1032 300100 ++1 100 +cfi=(32) +cfn=(5506) >::grow_one +calls=74 186 +* 4800 +fi=(32) +611 150050 +fi=(18) +1963 150050 +fi=(33) +1038 450150 +fi=(76) +137 150050 +fe=(85) ++86 150050 +0 450150 +232 450150 +cfi=(87) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/parser/element.rs +cfn=(5514) ::feed +calls=222074 57 +* 14181000 +* 300100 +0 150050 +233 450150 +fi=(10) +1092 150050 +fi=(32) +616 150050 +fi=(33) +1461 150050 +fi=(10) +2689 150050 +fi=(32) +764 150050 +-94 150050 +fi=(33) +2981 300000 +0 150050 +fi=(20) +970 150050 +fi=(18) +573 750250 +cob=(2) +cfi=(2) +cfn=(4488) +calls=222074 0 +* 2200650 +* 300100 +fi=(33) +2986 450150 +fi=(44) +90 150050 +fi=(142) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/io/impls.rs +389 450150 +fe=(85) +239 600200 +fi=(44) +544 450150 +90 300100 +fe=(85) +240 300100 +cfi=(38) +cfn=(5180) +calls=222074 89 +* 12090575 +fi=(27) +0 300100 +2177 300100 +fe=(85) +253 1200400 +0 150050 +240 600200 +fi=(33) +0 50 +fi=(32) +672 300 +cfn=(5530) >::reserve::do_reserve_and_handle:: +calls=74 -14 +* 6600 +* 100 +fi=(33) +3101 50 +2981 50 +fe=(85) + +fl=(98) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/smallvec-1.16.2/src/lib.rs +fn=(5632) ; 8]>>::from_elem +2052 250250 ++1 50050 +856 25025 +fi=(18) +-9 25025 +fi=(19) +2144 25025 +fi=(34) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/range.rs +1100 25025 +fe=(98) +0 25025 +fi=(41) +2274 50050 ++2 25025 +fi=(18) +1963 400400 +fi=(19) +2144 25025 +fi=(34) +1100 25025 +fi=(41) +2276 25000 +fi=(18) +1963 400000 +fi=(19) +2144 25000 +fi=(34) +1100 25000 +fi=(41) +2276 25000 +fi=(18) +1963 400000 +fi=(19) +2144 25000 +fi=(34) +1100 25000 +fe=(98) +2615 50050 +2067 75075 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 0 +* 1926925 ++2 225225 + +fn=(5958) ; 8]> as core::ops::drop::Drop>::drop +2373 200200 +1082 50050 +2375 25025 +fi=(18) +847 50050 +fe=(98) +2382 200200 + +fn=(5984) >; 4]> as core::ops::drop::Drop>::drop +2373 200200 +1082 50050 +2375 25025 +fi=(23) +0 25025 +fi=(18) +847 50050 +fe=(98) +2382 200200 + +fn=(5994) >; 4]>>::resize_with::<::push_list_item::{closure#0}> +1841 200 +1082 75 +-30 25 +0 25 +1846 75 +1082 50 +-17 25 +0 25 +1358 75 +0 50 +1230 50 +fi=(20) +970 25 +fi=(18) +1963 100 +fe=(98) +1237 25 +fi=(19) +2144 25 +fi=(34) +1100 50 +fi=(74) /home/bailey/github/PolyXML/crates/polyxml-core/src/parser.rs +70 25 +fe=(98) +1082 50 +1217 25 +1856 200 + +fn=(6132) >; 4]> as core::ops::drop::Drop>::drop +2483 250 ++10 50 +-8 200 + +fl=(74) +fn=(5578) ::check_root +343 200 ++1 50 ++14 25 ++1 200 + +fn=(5692) polyxml::parser::record_content_token +1123 525000 +fi=(14) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs +454 75000 +fi=(41) +634 75000 +fe=(74) +1128 75000 ++8 600000 + +fn=(5598) polyxml::parser::namespace_scope +174 525175 ++1 75025 +fi=(101) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs +0 75025 +fi=(100) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs +272 75025 +fe=(74) +-96 975325 +0 75025 +fi=(99) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/fuse.rs +403 225075 +cfi=(94) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs +cfn=(5600) ::next +calls=111037 601 +* 12009850 +* 75000 +cfi=(94) +cfn=(5600) +calls=37000 601 +* 1350000 +fi=(95) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/flatten.rs +855 300075 +fi=(41) +-90 50000 +fi=(95) ++90 200050 ++1 150000 +fi=(77) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/cmp.rs +21 50000 +fi=(76) +2635 25000 +fi=(18) +847 75000 +fi=(96) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/collections/hash/map.rs +0 75025 +fe=(74) +187 75025 +cfi=(18) +cfn=(5612) core::ptr::drop_glue::> +calls=111037 847 +* 2300450 ++1 75025 +fi=(41) +1162 150050 +fi=(13) +4029 75025 +fi=(59) +2434 75025 +fe=(74) +189 675225 + +fn=(5892) polyxml::parser::parse_field_scalar +137 150000 ++5 50000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(74) +151 150000 +cfi=(108) +cfn=(5790) +calls=74000 28 +* 21578803 ++1 150000 + +fn=(5618) polyxml::parser::resolve_record_schema +220 200200 +fi=(14) +454 25025 +fe=(74) +225 50050 +fi=(14) +454 25025 +fi=(13) +3994 25025 +fi=(97) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs +54 50050 ++45 25025 +fi=(13) +4149 25025 +fi=(97) +97 25025 +fi=(13) +3994 25025 +fi=(33) +3101 50050 +fi=(13) +4049 25025 +fi=(97) +111 25025 ++7 100100 +fi=(33) +3126 25025 +fe=(74) +225 25025 +fi=(13) +4029 25025 +fi=(59) +2434 25025 +fe=(74) +226 25025 +0 25025 +274 225225 + +fn=(5990) ::push_list_item +67 175000 +fi=(98) +1082 75000 +-30 25000 +-15 25000 +fe=(74) +68 25000 +-68 24975 +fi=(98) +1082 24975 +-17 24975 +fi=(44) +195 50000 +fi=(98) +1082 25000 +-17 25000 +fe=(74) +0 25 +68 50 +fi=(14) +454 25 +fi=(33) +3101 25 +fe=(74) +70 50 +cfi=(98) +cfn=(5994) +calls=37 1841 +* 1200 +-70 25 +fi=(98) +1082 100 +-17 50 +fe=(74) +72 25000 +fi=(44) +197 50000 +fe=(74) +73 75000 ++1 199800 +fi=(33) +1029 24975 ++3 49950 ++1 450 +cfi=(32) +cfn=(6010) >::grow_one +calls=333 186 +* 46350 +fi=(32) +611 24975 +fi=(20) +970 24975 +fi=(18) +1963 199800 +fi=(33) +1038 74925 +fi=(23) +128 25 +cfi=(6) +cfn=(5090) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5092) __rustc::__rust_alloc +calls=37 -89 +* 1050 +fi=(28) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/boxed.rs +251 50 +fe=(74) +75 225 +fi=(18) +847 50 +fe=(74) +75 75 ++3 175000 + +fn=(5588) ::parse_sub_tree::<&[u8]> +410 350 +cfi=(6) +cfn=(5090) +calls=37 0 +* 25 +fi=(23) +130 75 +cfi=(24) +cfn=(5092) +calls=37 -89 +* 3725 +fi=(32) +470 50 +fi=(33) +969 75 +fi=(23) +128 25 +cfi=(6) +cfn=(5090) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5092) +calls=37 -89 +* 950 +fi=(28) +251 50 +fe=(74) +418 100 +cfn=(5598) +calls=37 174 +* 3000 +* 25 +fi=(33) +1196 125 +fe=(74) +420 75 +cfn=(5618) +calls=37 220 +* 1050 +fi=(27) +2177 25 +0 25 +2177 50 +fi=(41) +634 25 +fi=(33) +3101 25 +fe=(74) +38 25 ++1 100 +cfi=(98) +cfn=(5632) +calls=37 2052 +* 3225 +-7 25 ++9 75 +-4 150 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 -37 +* 1925 +* 175 +422 75 +cfn=(5636) ::parse_attributes +calls=37 997 +* 3225 +fi=(27) +2177 50 +fe=(74) +0 75 +423 50 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fi=(33) +1029 25 ++3 50 +fi=(20) +-62 75 +fi=(18) +1963 50 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fi=(33) +1038 50 +462 725 +3082 200000 +fi=(85) +412 800000 +cfi=(75) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/mod.rs +cfn=(5468) >::read_event_impl::<&mut alloc::vec::Vec> +calls=296000 1006 +* 85032514 +* 100 +cfi=(75) +cfn=(5468) +calls=37 1006 +* 24575 +fe=(74) ++20 1000125 +0 200025 +432 600075 +fi=(33) +1865 75000 +fi=(76) +282 150000 +fi=(32) +611 75000 +fi=(76) +282 150000 +fe=(74) +434 150000 +cfn=(5598) +calls=111000 174 +* 19808500 +0 150000 +fi=(33) +1029 75000 ++3 150000 ++1 50 +cfi=(32) +cfn=(5684) >::grow_one +calls=37 186 +* 20993 +fi=(32) +611 75000 +fi=(18) +1963 75000 +fi=(33) +1038 150000 +fe=(74) +435 150000 +784 100000 +fi=(101) +350 100000 +fi=(54) +871 50000 +fi=(33) +3126 50000 +fi=(13) +3994 100000 +fe=(74) +787 50000 +fi=(33) +2873 225075 ++4 150050 +fi=(32) +611 75025 +fi=(18) +1755 75025 +fi=(33) +0 75025 +fi=(13) +4049 75025 +fi=(59) +2868 75025 +fe=(74) +878 150050 +fi=(33) +3101 75025 ++25 75025 +fe=(74) +882 75025 +0 75000 +fi=(41) +634 150000 +fi=(33) +3126 150000 +fi=(76) +282 150000 +fi=(33) +1904 75000 +fi=(76) +305 150000 +fi=(32) +611 150000 +fi=(76) +305 225000 +fi=(14) +454 75000 +fi=(59) +2454 75000 +fe=(74) +441 150000 +cfn=(5692) +calls=111000 1123 +* 1350000 +fi=(33) +3126 75000 +fe=(74) +447 75000 +fi=(78) +153 150000 +cfn=(5840) memchr::arch::x86_64::memchr::memchr_raw::find_avx2 +calls=73999 -75 +* 3000300 +fi=(41) +2869 100000 +fe=(74) +0 75025 +909 300100 ++42 50050 +fi=(33) +2877 50000 +fi=(54) +871 50000 +fi=(18) +1755 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fi=(101) +350 50000 +fi=(103) +210 75000 +cfi=(92) +cfn=(5702) +calls=37000 1497 +* 1200000 ++62 175000 +cfi=(41) +cfn=(5710) +calls=37000 1222 +* 125000 +fe=(74) +0 50000 +fi=(11) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/mem/mod.rs +975 100000 ++1 25000 +fe=(74) +-21 125000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +* 75000 +cfn=(5924) ::finish +calls=37000 80 +* 27532831 +fi=(27) +2177 50000 +0 200000 +2177 50000 +fe=(74) +955 200000 +fi=(33) +1904 25000 +fi=(76) +305 50000 +fi=(32) +611 25000 +fi=(76) +305 75000 +fe=(74) +958 75000 +fi=(76) +305 100000 +fi=(32) +611 50000 +fi=(76) +305 150000 +fi=(14) +454 50000 +fe=(74) +911 100000 +fi=(41) +634 50000 +fe=(74) +802 50000 +975 50 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 50000 +-94 50000 +fi=(33) +2981 99950 +0 50000 +fi=(20) +970 50000 +fi=(18) +573 150000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=74000 0 +* 705000 +fi=(33) +2986 150000 +1865 100000 +fi=(44) +238 100000 +fi=(32) +611 50000 +fi=(44) +238 150000 +fe=(74) +915 350000 +fi=(33) +3101 75000 +fe=(74) +464 150000 +fi=(100) +211 150000 +cfi=(101) +cfn=(5696) ::name +calls=111000 0 +* 775000 +* 150000 +fi=(103) +-1 225000 +cfi=(92) +cfn=(5702) +calls=111000 1497 +* 3725000 ++62 525000 +cfi=(41) +cfn=(5710) +calls=111000 1222 +* 375000 +fe=(74) +0 150000 +471 150000 +cfn=(5712) polyxml::parser::is_nil_element +calls=111000 156 +* 20683500 +fi=(33) +1865 75000 +fi=(76) +282 150000 +fe=(74) +0 75000 +fi=(32) +611 75000 +fi=(76) +282 75000 +fi=(14) +454 75000 +fi=(13) +4029 75000 +fi=(59) +2434 75000 +fe=(74) +473 75000 +fi=(59) +2438 75000 +320 75000 +fi=(96) +1039 300000 +cfi=(55) +cfn=(5736) , usize, std::hash::random::RandomState>>::get::<[u8]> +calls=111000 1337 +* 19848000 +fe=(74) +474 150000 +0 75000 +474 75000 +fi=(33) +1865 75000 +fi=(44) +238 150000 +fi=(32) +611 75000 +fi=(44) +238 150000 +fe=(74) +479 525000 +0 25000 +479 50000 +fi=(28) +2415 25000 +fe=(74) +492 275000 ++16 50000 +915 100000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(74) +925 50000 +cfn=(5892) +calls=74000 137 +* 22178803 +fi=(27) +2177 100000 +0 400000 +2177 100000 +fe=(74) +925 400000 ++1 100000 +0 50000 +929 400000 +fi=(98) +1082 100000 +-17 50000 +fe=(74) +0 50000 +fi=(14) +454 25000 +fi=(96) +1039 100000 +cfi=(55) +cfn=(5736) +calls=37000 1337 +* 6550000 +fe=(74) +-76 75000 +fi=(33) +1865 25000 +fi=(44) +238 50000 +fi=(32) +611 25000 +fi=(44) +238 50000 +fe=(74) +969 100000 ++1 250000 +cfn=(5990) +calls=37000 67 +* 1474250 +* 25000 +fi=(98) +0 100000 +fi=(44) +245 200000 +fi=(18) +847 100000 +fe=(74) ++82 250000 +0 450000 +481 100000 +fi=(33) +3082 250000 +fe=(74) +0 75000 +fi=(14) +454 75000 +fi=(13) +4049 75000 +fi=(59) +2868 75000 +fi=(33) +1865 25000 +fi=(76) +282 50000 +fe=(74) +0 25000 +fi=(32) +611 25000 +fi=(76) +282 50000 +fe=(74) +516 75000 +cfn=(5618) +calls=37000 220 +* 1050000 +fi=(27) +2177 25000 +0 25000 +2177 50000 +fe=(74) +521 50000 +cfn=(5762) ::new +calls=37000 30 +* 6950000 +0 25000 +522 125000 +cfn=(5636) +calls=37000 997 +* 28271500 +fi=(27) +2177 50000 +fe=(74) +523 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 0 +* 2225000 +fi=(33) +996 75000 +cfn=(5814) +calls=37000 +31 +* 2700000 +* 25000 +fi=(59) +0 125000 +fe=(74) +988 400000 +fi=(18) +847 600000 +0 200000 +847 1200000 +fi=(32) +672 150 +cfn=(5530) +calls=37 -14 +* 2875 +fi=(33) +3101 25 +2981 25 +fe=(74) +988 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5682) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5682) +calls=37 65 +* 850 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5682) +calls=37 65 +* 850 +fi=(33) +4358 25 +fi=(18) +847 50 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5682) +calls=37 65 +* 3250 +fi=(14) +454 25 +fi=(13) +4049 25 +fi=(59) +2868 25 +fe=(74) +995 200 +fi=(18) +847 75 +0 25 +847 150 +fi=(33) +2877 25 +fi=(32) +611 50 +fi=(18) +1755 75 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37 0 +* 2225 +fe=(74) +977 75 +cfn=(5924) +calls=37 80 +* 29016 +* 25 + +fn=(5636) +997 200200 ++1 25025 +fi=(101) +0 25025 +fi=(100) +272 25025 +fe=(74) +999 500500 +fi=(99) +403 75075 +cfi=(94) +cfn=(5600) +calls=37037 601 +* 9309850 +* 75000 +cfi=(94) +cfn=(5600) +calls=37000 601 +* 1350000 +fi=(95) +855 150075 +fi=(41) +-90 50000 +fi=(95) ++90 100050 ++1 125000 +fe=(74) +999 25000 +fi=(103) +222 75000 +fi=(77) +21 75000 +fi=(76) +2635 25000 +fe=(74) +0 25000 +1004 50000 +cfi=(103) +cfn=(5718) +calls=37000 141 +* 950000 +0 50000 +fi=(14) +454 25000 +fi=(55) +1337 25000 +fi=(51) /rust/deps/hashbrown-0.17.1/src/map.rs +-53 25000 +0 25000 +1287 25000 +241 50000 +cfi=(52) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/mod.rs +cfn=(5740) ::hash_one::<&[u8]> +calls=37000 694 +* 4625000 +fi=(104) /rust/deps/hashbrown-0.17.1/src/control/tag.rs +47 75000 +fi=(55) +2452 150000 +0 25000 +fi=(18) +573 25000 +fi=(57) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/sse2.rs +1569 75000 +fi=(105) /rust/deps/hashbrown-0.17.1/src/control/bitmask.rs +40 50000 +-40 200000 +fi=(58) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/nonzero.rs +628 25000 +fi=(55) +2032 50000 +fi=(20) +1054 75000 +fi=(77) +21 50000 +fi=(106) /rust/deps/hashbrown-0.17.1/src/lib.rs +157 100000 +cob=(2) +cfi=(2) +cfn=(5752) +calls=37000 0 +* 493000 +* 25000 +fi=(47) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs +455 25000 +fe=(74) +1005 25000 +fi=(33) +1865 25000 +fi=(44) +238 50000 +fi=(32) +611 25000 +fi=(44) +238 50000 +fe=(74) +1007 100000 +fi=(101) +350 50000 +fe=(74) +1008 50000 +cfi=(107) +cfn=(5778) +calls=37000 236 +* 2078000 +fi=(27) +2177 25000 +0 100000 +2177 50000 +fe=(74) +0 75000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fe=(74) +1009 75000 +cfi=(108) +cfn=(5790) +calls=37000 28 +* 2767000 +fi=(27) +2177 50000 +0 200000 +2177 75000 +fe=(74) +1009 225000 +fi=(98) ++73 75000 +-17 25000 +fi=(44) +245 50000 +0 25000 +fi=(98) +1082 25000 +-17 25000 +fi=(44) +245 50000 +fi=(18) +847 50000 +fe=(74) +1014 225000 +fi=(18) +847 100000 +fi=(23) +0 50000 +fi=(18) +847 50000 +fi=(11) +0 25025 +fe=(74) +1024 25025 +cfi=(18) +cfn=(5612) +calls=37037 847 +* 1400450 +* 25025 +fi=(14) +454 25025 +fe=(74) +1025 50050 ++3 25025 +fi=(18) +847 50050 +fe=(74) +1029 225225 + +fn=(5712) +156 525000 +fi=(101) +0 75000 +fi=(100) +272 75000 +fe=(74) +157 1125000 +0 75000 +fi=(99) +403 225000 +cfi=(94) +cfn=(5600) +calls=111000 601 +* 12008500 +* 75000 +cfi=(94) +cfn=(5600) +calls=37000 601 +* 1350000 +fi=(95) +855 300000 +fi=(41) +-90 50000 +fi=(95) ++90 200000 ++1 100000 +fe=(74) +157 25000 +fi=(103) ++65 50000 +fi=(77) +21 50000 +fi=(76) +2635 25000 +fe=(74) +162 50000 +cfi=(103) +cfn=(5718) +calls=37000 -21 +* 950000 +fi=(77) +21 100000 +fi=(18) +847 50000 +fi=(23) +0 150000 +fe=(74) +168 75000 +cfi=(18) +cfn=(5612) +calls=111000 847 +* 2300000 ++2 675000 + +fn=(5466) ::deserialize_with_limit +365 250 +fi=(75) +810 300 +fi=(33) +462 150 +0 50 +fi=(85) +412 100 +cfi=(75) +cfn=(5468) +calls=37 1006 +* 24750 +fe=(74) +-38 225 +fi=(14) ++80 25 +fi=(59) +2454 100 +fe=(74) +376 50 +cfn=(5578) +calls=37 -33 +* 475 +fi=(27) +2177 50 +fe=(74) +379 50 +fi=(143) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/thread_local/native/mod.rs +105 75 +fi=(144) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/thread_local/native/lazy.rs +-46 50 +fi=(60) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cell.rs +558 50 +fi=(10) +2652 25 +fi=(11) +976 25 +fi=(59) +440 200 +fi=(23) +128 25 +cfi=(6) +cfn=(5090) +calls=37 0 +* 25 ++2 75 +cfi=(24) +cfn=(5092) +calls=37 -89 +* 1050 +fi=(28) +251 50 +0 25 +293 200 +fi=(59) ++27 75 +fe=(74) ++57 125 +cfn=(5588) +calls=37 +33 +* 284098132 +fi=(13) +4049 25 +fi=(59) +2868 25 +0 50 +2911 25 +cfn=(6140) +calls=37 2138 +* 1725 +0 25 +fe=(74) +401 75 +fi=(18) +847 75 +0 25 +847 150 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5682) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5682) +calls=37 65 +* 850 +fi=(32) +425 50 +631 25 +425 25 +fi=(10) +1401 25 +fi=(23) +175 50 +cfi=(26) +cfn=(5682) +calls=37 65 +* 3850 +fe=(74) +408 275 + +fn=(5924) +80 225225 +fi=(14) +454 50050 +fi=(59) +2454 25025 +fi=(32) +611 25025 +fi=(33) +1865 75075 +fe=(74) +81 25025 +cfi=(45) /home/bailey/github/PolyXML/crates/polyxml-core/src/schema.rs +cfn=(5926) polyxml::schema::validate_content +calls=37037 725 +* 550550 +fi=(27) +2177 50050 +fi=(18) +0 50050 +fi=(14) +454 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +fi=(50) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs +180 25025 +0 125125 +180 100100 +fi=(41) +634 25000 +fe=(74) +83 25000 +fi=(50) +-83 75025 +fi=(14) +1663 150050 +fi=(118) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs +82 75025 +fi=(14) +1663 75025 +fi=(50) +180 75025 +fi=(45) +4 75025 +fe=(74) ++79 75025 +fi=(98) +1082 75000 +-30 25000 +fi=(44) +238 50000 +0 25000 +fi=(98) +1082 25000 +-30 25000 ++30 75075 +-30 25025 +-15 50050 +fe=(74) +96 25025 +-96 50 +fi=(98) +1082 25 +fe=(74) +97 300 +fi=(98) +996 50 ++56 25 +-56 25 +fe=(74) +97 25 +fi=(118) +-73 125 +fe=(74) ++73 25 +fi=(98) +2493 50 +0 125 +fe=(74) +99 200 +fi=(98) +2493 50 +0 25 +2493 50 ++5 50 +1082 50 +-30 25 +fi=(54) +871 25 +fi=(18) +1755 25 +fi=(41) +2869 50 +fi=(118) +80 25 +fi=(41) +2870 50 +fi=(118) +81 25 ++1 50 +fe=(74) ++16 100 ++1 50 +fi=(98) +1082 75 +-17 25 +fi=(44) +245 50 +0 25 +fi=(98) +1082 25 +-17 25 +fi=(44) +245 50 +fi=(18) +847 50 +0 25 +847 25 +cfi=(98) +cfn=(6132) +calls=37 2483 +* 500 +0 75 +847 25 +cfi=(98) +cfn=(5984) +calls=37 2373 +* 550 +0 25 +fi=(14) +454 25 +fe=(74) +104 100 +0 50000 +fi=(14) +454 25000 +fe=(74) +104 75000 +fi=(14) +454 25025 +fi=(33) +1865 25025 +fi=(14) +1663 50050 +0 100100 +fi=(98) +1052 125125 +fi=(14) +1663 150050 +fi=(118) +82 75025 +fi=(14) +1663 75025 +fi=(50) +180 75025 +0 75025 +fi=(98) +1082 225075 +-30 75025 +fi=(44) +238 150050 +0 75025 +fi=(98) +1082 75025 +-30 75025 +fi=(41) +743 150050 +fi=(45) +-74 150050 +fi=(111) +0 25025 +fe=(74) +131 100100 ++1 75075 +fi=(98) +1082 25025 +1607 25025 +fe=(74) +132 25025 +fi=(98) +1615 100100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 0 +* 1926925 +2552 50050 +-1 150150 +fi=(33) +3996 25025 +cfi=(117) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter.rs +cfn=(5946) > as alloc::vec::spec_from_iter::SpecFromIter, smallvec::IntoIter<[core::option::Option; 8]>>>::from_iter +calls=37037 32 +* 11517075 +0 25025 +fe=(74) +132 25025 +cfi=(33) +cfn=(5964) +calls=37037 1723 +* 7835597 +-2 125125 ++4 50050 +0 25000 +fi=(18) +847 25000 +cfi=(98) +cfn=(5984) +calls=37000 2373 +* 550000 +* 175175 +fi=(32) +425 50050 +631 25025 +fe=(74) +134 225225 + +fn=(5464) polyxml::deserialize +362 50 +cfn=(5466) +calls=37 +3 +* 284135282 + +fn=(5762) +30 150000 +fi=(41) +634 25000 +fi=(33) +3101 25000 +fe=(74) +38 25000 ++1 100000 +cfi=(98) +cfn=(5632) +calls=37000 2052 +* 4175000 +-7 25000 ++9 75000 +-4 125000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37000 -37 +* 1925000 +* 150000 ++8 150000 + +fl=(114) +fn=(5918) +45 75000 +-45 25000 +46 50000 +-46 50000 +46 100000 ++36 50000 +fi=(115) ++70 50000 +fe=(114) +-67 50000 ++22 25000 +fi=(116) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-parse-float-1.0.6/src/table_decimal.rs +-30 75000 +fi=(145) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/arith.rs +515 50000 +fe=(114) +100 75000 + +fl=(101) +fn=(5696) +0 75000 +fi=(100) +202 75000 +fi=(92) +380 150000 +fi=(100) +202 75000 +fi=(92) +384 150000 +fi=(43) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/mod.rs +1229 25000 +fi=(91) +424 75000 +fi=(100) +203 150000 +fe=(101) + +fl=(18) +fn=(5612) +847 700200 +fi=(32) +425 350100 +631 175050 +425 75000 +fi=(10) +1401 75000 +fi=(23) +175 150000 +cfi=(26) +cfn=(5682) +calls=111000 65 +* 2550000 +fe=(18) +847 1925550 + +fn=(6382) core::ptr::drop_glue:: +847 275 +fi=(14) +454 25 +fi=(13) +4049 25 +fi=(59) +2868 25 +fe=(18) +847 450 +cfn=(6383) core::ptr::drop_glue::'2 +calls=37 * +* 12447414 +* 200 +cob=(2) +cfi=(2) +cfn=(4868) +calls=37 0 +* 825 + +fn=(6383) +847 275 +fi=(32) +611 25 +fi=(33) +4358 25 +fe=(18) +847 125 +0 25 +847 50 +cfn=(6383) +calls=37 * +* 8314 +* 49950 +cfn=(6383) +calls=36963 * +* 12284032 +* 100000 +fi=(32) +631 50 +fe=(18) +847 175 +cob=(2) +cfi=(2) +cfn=(4868) +calls=37 0 +* 4368 +* 1700000 +fi=(32) +631 50000 +425 25000 +fi=(23) +312 25000 +fi=(14) +454 25000 +fi=(13) +4049 25000 +fi=(59) +2868 25000 +fe=(18) +847 900000 +cfn=(6383) +calls=111000 * +* 6176136 +* 525000 +cob=(2) +cfi=(2) +cfn=(4868) +calls=74000 0 +* 8992346 + +fl=(87) +fn=(5514) +57 1500500 +fi=(54) +473 450150 +fi=(13) +3994 300100 +fi=(78) +153 900300 +cfi=(84) +cfn=(5520) memchr::arch::x86_64::memchr::memchr3_raw::find_avx2 +calls=222073 1042 +* 4203450 +fi=(41) +2869 300100 +fi=(88) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/arch/generic/memchr.rs +0 150050 +fi=(54) +623 300100 +fe=(87) +59 300100 +fi=(54) +871 150050 +fe=(87) +59 625200 +fi=(13) +3994 25000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5520) +calls=37000 1042 +* 700000 +fi=(41) +2869 50000 +fi=(88) +0 25000 +fi=(54) +623 50000 +fe=(87) +59 50000 +fi=(54) +871 25000 +fe=(87) +59 375100 +-59 150050 +59 600200 +-59 150050 +59 200050 ++14 1350450 +fi=(88) +-73 25000 +fi=(54) +623 50000 +fe=(87) +59 50000 +fi=(54) +871 25000 +fe=(87) +59 75000 +fi=(13) +3994 25000 +fi=(78) +153 125000 +cfi=(84) +cfn=(5520) +calls=37000 1042 +* 700000 +fi=(41) +2869 50000 +fe=(87) + +fl=(90) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/reader/state.rs +fn=(5864) ::emit_end +197 525175 +fi=(91) +-68 150050 +fi=(43) +1229 75025 +fi=(91) +145 75025 +fi=(43) +1229 75025 +fi=(91) +262 75025 +0 300100 +fe=(90) +214 225075 +fi=(93) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/utils.rs +315 300100 +0 75025 +fi=(50) +402 150050 +fi=(93) +-87 75025 +fi=(33) +2873 225075 ++4 150050 +fi=(32) +611 75025 +fi=(18) +1755 75025 +fe=(90) +228 150050 +fi=(32) +611 75025 +fi=(33) +1865 75025 +fi=(92) +380 150050 ++4 150000 +fi=(43) +1229 75000 +fi=(91) +493 75000 +fi=(40) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs +1490 150050 +fi=(92) +380 450150 +fi=(32) +611 75000 +fi=(43) +1229 75000 +fi=(40) +1491 75000 +fi=(33) +1828 75025 +fe=(90) +257 375125 ++1 675225 +fi=(92) +384 225075 +fi=(91) +221 150050 +fi=(54) +871 75025 +fi=(77) +21 150050 +-21 75025 +157 600200 +cob=(2) +cfi=(2) +cfn=(5752) +calls=111037 0 +* 1617539 +* 450150 +fe=(90) ++73 75025 +fi=(92) +394 75025 +fi=(91) ++30 75025 +fe=(90) + +fn=(5552) ::emit_start +314 750250 +fi=(92) ++70 150050 +fi=(43) +1229 75025 +fi=(91) +493 75025 +0 75025 +221 150050 +fi=(76) +2736 150050 +fi=(77) +157 75025 +fi=(76) +2738 75025 +0 75025 +2738 75025 +fe=(90) +345 150050 +fi=(10) +1092 75025 +fi=(92) +380 150050 ++4 150050 +fi=(43) +1229 75025 +fi=(91) +424 75025 +0 225075 +fi=(93) +331 325175 +-4 650350 ++1 700350 +-13 350175 +0 50000 +fi=(33) +3101 25000 +1029 25000 ++3 50000 +fi=(32) +611 75025 +fi=(18) +1963 75025 +fi=(33) +1038 150050 +fi=(92) +380 150050 ++4 150050 +fi=(43) +1229 25000 +fi=(91) +424 25000 +fi=(33) +1033 100 +cfi=(32) +cfn=(5568) >::grow_one +calls=37 186 +* 2675 +* 75 +0 50025 +3101 50025 +1029 50025 ++3 100075 +fi=(91) +424 50025 +fi=(32) +616 75025 +fi=(33) +1461 75025 +fi=(10) +2689 75025 +fi=(32) +764 75025 +-94 75025 +0 75025 +fi=(20) +970 75025 +fi=(18) +573 300100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=111037 0 +* 1125375 +* 75025 +fi=(33) +2986 225075 +fe=(90) +0 450150 +356 675225 +fi=(32) +672 250 +cfn=(5530) +calls=74 -14 +* 5825 +* 50 +fi=(33) +3101 100 +fe=(90) + +fn=(5828) ::emit_text +63 50000 ++1 100000 ++11 200000 ++1 150000 + +fl=(30) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/backtrace.rs +fn=(5128) std::sys::backtrace::__rust_begin_short_backtrace:: +fi=(146) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/function.rs +cfi=(24) +cfn=(5130) xml_diagnostics::main +calls=1 43 +250 296585254 +fe=(30) + +fl=(117) +fn=(5946) +32 200200 +fi=(98) +2493 100100 +0 25025 +2498 50050 +1082 25025 +-30 25025 +fi=(37) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/spec_from_iter_nested.rs +0 25025 +26 225225 +fi=(98) +2506 25025 +fi=(10) +-10 75075 +fi=(19) +1051 75075 +fi=(10) +3212 25025 +fi=(37) +0 25025 +fi=(47) +478 75075 +fi=(98) +1052 25025 +fi=(54) +871 25025 +fi=(18) +1755 25025 +fi=(37) +24 50050 +fe=(117) ++10 200200 +fi=(32) +461 50050 +0 25025 +cfi=(6) +cfn=(5090) +calls=37037 0 +0 25025 +0 25025 +fi=(23) +130 75075 +cfi=(24) +cfn=(5092) +calls=37037 -89 +* 4837200 +fi=(32) +470 50050 +0 50050 +fi=(18) +1963 200200 +fi=(37) +36 100100 ++5 100100 +cob=(2) +cfi=(2) +cfn=(4488) +calls=37037 -41 +* 1926925 +fi=(98) +2493 125125 +0 50 +2493 50 +0 100000 +fi=(33) +4100 225000 +fi=(18) +1963 400000 +fi=(33) +4111 50000 +2224 50000 +fi=(98) +2493 150000 ++5 100000 +fi=(18) +1755 50000 +fi=(33) +4100 550000 ++2 100000 +fi=(98) +0 75000 +2493 50000 +0 25025 +fi=(18) +847 25025 +cfi=(98) +cfn=(5958) +calls=37037 2373 +* 525525 +fi=(37) +42 150150 +fe=(117) + +fl=(84) +fn=(5490) +659 350100 +fi=(78) +0 700200 +fi=(54) +623 350100 +fe=(84) ++40 350100 ++1 50100 +fi=(88) +1161 50050 +0 25025 +1162 25025 +fe=(84) +668 50050 +fi=(88) +1162 47250 +fe=(84) +668 239000 +fi=(54) +389 72250 +fi=(88) +1161 144500 +0 25000 +fi=(78) +86 75000 +fi=(18) +573 150000 +fi=(147) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/../../stdarch/crates/core_arch/src/x86/avx2.rs +699 300000 +2315 150000 +2163 150000 +fi=(148) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.8.3/src/vector.rs +147 150000 +fi=(88) +679 150000 +fi=(18) +573 25 +fi=(57) +920 50 +-25 25 +1569 25 +fi=(148) +147 25 +fi=(88) +679 25 +fe=(84) +0 450075 +fi=(78) +86 300100 +fe=(84) + +fn=(5520) +1042 400100 +0 1400350 +fi=(54) +623 400100 +fe=(84) +1046 400100 ++1 150 +fi=(88) +1161 50 +0 25 +1162 50 +fe=(84) +1051 25 +fi=(88) +1162 400 +fe=(84) +1051 1050 +fi=(54) +389 200 +fi=(88) +1161 400 +fi=(18) +573 199975 +fi=(147) +699 399950 +2315 199975 +699 199975 +2315 199975 +2163 199975 +fi=(148) +147 199975 +fi=(88) +972 199975 +fi=(18) +573 50 +fi=(57) +920 100 +-25 50 ++25 50 +-25 50 +1569 50 +fi=(148) +147 50 +fi=(88) +972 50 +fe=(84) +0 800100 +fi=(78) +86 400050 +-86 25 +86 50 +fe=(84) + +fl=(8) +fn=(4178) +fi=(146) +cfn=(5126) std::rt::lang_start::<()>::{closure#0} +calls=1 206 +287 296585254 +fe=(8) + +fn=(5126) +cfi=(30) +cfn=(5128) +calls=1 162 +206 296585254 + +fl=(75) +fn=(5468) +1006 2400600 +289 1400350 +fi=(76) +2635 50 +fi=(77) +157 125 +fi=(85) +24 25 +fe=(75) +306 25 ++45 300100 +fi=(33) +3101 150050 +fi=(76) +137 300100 +0 300100 +fi=(54) +871 150050 +fi=(13) +3994 300100 +fi=(78) +153 750250 +cfi=(84) +cfn=(5490) +calls=222073 659 +* 3301100 +fi=(41) +2869 300100 +fi=(85) +72 600200 ++7 100000 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 100000 +-94 50000 +fi=(20) +970 50000 +fi=(18) +573 200000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=74000 0 +* 705000 +* 100000 +fi=(33) +2986 100000 +fi=(85) +0 50000 +fi=(44) +549 100000 +fi=(142) +389 100000 +fi=(44) +544 50000 +fi=(85) +79 100000 +fi=(44) +544 150000 +90 100000 +fi=(85) +-4 150000 +cfi=(38) +cfn=(5180) +calls=74000 +3 +* 3700250 +* 100000 +-25 150000 ++14 100050 +fi=(142) +389 100050 +fe=(75) +-34 100050 +0 300150 +437 100050 +fi=(44) +544 200100 +fe=(75) +437 50000 +fi=(44) +544 100000 +fe=(75) +0 150050 +fi=(142) +389 300100 +fi=(44) +90 150050 +fi=(76) ++66 300100 +fi=(142) +389 300100 +fi=(76) +156 150050 +fi=(72) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/clone.rs +716 300100 +fe=(75) +440 600200 +0 75025 +464 225075 +cfi=(85) +cfn=(5502) +calls=111037 211 +* 19183725 +-1 150050 ++4 375125 +cfi=(90) +cfn=(5864) +calls=111037 197 +* 8894789 +* 75025 +0 75025 +488 225075 +cfi=(85) +cfn=(5502) +calls=111037 211 +* 22204750 +-1 150050 +0 250000 +cfi=(90) +cfn=(5828) +calls=74000 63 +0 500000 +fi=(27) +2177 50000 +0 200000 +2177 100000 +fe=(75) +0 300000 +323 50000 +491 375125 +cfi=(90) +cfn=(5552) +calls=111037 314 +* 9137500 +* 75025 +-91 750250 +1011 1800450 + +fl=(55) +fn=(5736) +1337 100000 +fi=(51) +-53 100000 +0 900000 +1287 200000 +241 200000 +cfi=(52) +cfn=(5740) +calls=148000 694 +* 18150000 +fi=(104) +47 300000 +fe=(55) +2452 800000 +0 100000 +fi=(18) +573 100000 +fi=(57) +1569 300000 +fi=(105) +40 200000 +-40 500000 +fi=(58) +628 100000 +fe=(55) +2032 200000 +fi=(20) +1054 300000 +fi=(77) +21 200000 +fi=(106) +157 400000 +cob=(2) +cfi=(2) +cfn=(5752) +calls=148000 0 +* 1948000 +* 100000 +fi=(47) +455 100000 +fe=(55) +1217 1000000 +fi=(51) ++76 100000 +fe=(55) + +fn=(6142) +3486 175 +2656 50 +2271 25 +3498 200 + +fl=(32) +fn=(5568) +186 100 +493 25 ++30 25 +fi=(19) +1051 75 +fe=(32) +529 150 +cfn=(5228) ::finish_grow +calls=37 +15 +* 2075 +fi=(27) +2177 50 ++1 25 +fe=(32) +773 25 ++1 25 +189 100 + +fn=(5228) +544 2600 +fi=(10) +3212 2600 +fi=(47) +478 975 +0 325 +fe=(32) +631 325 +fi=(10) +1401 300 +fi=(23) +228 1500 +cfi=(24) +cfn=(5538) +calls=1451 41 +* 54143 +fi=(27) +965 600 +fi=(23) +298 50 ++4 25 +cfi=(6) +cfn=(5090) +calls=39 0 +* 25 +130 75 +cfi=(24) +cfn=(5092) +calls=39 -89 +* 950 +fi=(27) +965 50 ++1 975 +fe=(32) +0 650 +564 1950 +-20 600600 +fi=(10) +3212 600600 +fi=(47) +478 225225 +fe=(32) +631 150150 +fi=(10) +1401 25 +fi=(23) +228 125 +cfi=(24) +cfn=(5538) +calls=1037 41 +* 1400 +fi=(27) +965 50 +fi=(23) +298 150100 ++4 75050 +cfi=(6) +cfn=(5090) +calls=111074 0 +* 75050 +130 225150 +cfi=(24) +cfn=(5092) +calls=111074 -89 +* 3152000 +fi=(27) +965 150100 ++1 225225 +fe=(32) +0 150150 +564 450450 +-20 400 +fi=(86) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/layout.rs +75 50 ++38 50 +0 50 +fe=(32) +631 100 +fi=(23) +298 100 +128 50 +cfi=(6) +cfn=(5090) +calls=74 0 +* 50 ++2 150 +cfi=(24) +cfn=(5092) +calls=74 -89 +* 1900 +fi=(27) +965 100 ++1 150 +fe=(32) +0 100 +564 300 + +fn=(5898) +447 225000 +fi=(10) +3212 175000 +fi=(47) +478 50000 +fe=(32) +-17 50000 +0 50000 +cfi=(6) +cfn=(5090) +calls=37000 0 +0 25000 +0 50000 +465 50000 ++13 75000 +0 50000 +483 175000 +fi=(23) +130 25000 +cfi=(24) +cfn=(5092) +calls=37000 -89 +* 10653953 +fe=(32) +470 50000 + +fn=(5660) >>::grow_one +186 300000 +493 75000 ++30 75000 +fi=(19) +1051 225000 +fe=(32) +529 450000 +cfn=(5228) +calls=111000 +15 +* 6225000 +fi=(27) +2177 150000 ++1 75000 +fe=(32) +773 75000 ++1 75000 +189 300000 + +fn=(6010) +186 900 +493 225 ++30 225 +fi=(19) +1051 675 +fe=(32) +529 1350 +cfn=(5228) +calls=333 +15 +* 40950 +fi=(27) +2177 450 ++1 225 +fe=(32) +773 225 ++1 225 +189 900 + +fn=(5506) +186 300 +493 50 ++30 50 +fi=(19) +1051 150 +fe=(32) +529 200 +cfn=(5228) +calls=74 +15 +* 3550 +fi=(27) +2177 100 ++1 50 +fe=(32) +773 50 ++1 50 +189 250 + +fn=(5530) +658 300 +512 150 +fi=(10) +938 75 +fi=(47) +478 75 +0 75 +fe=(32) +523 150 +fi=(19) +1051 150 +fe=(32) +159 525 +fi=(19) +1051 225 +fe=(32) +529 300 +cfn=(5228) +calls=1118 +15 +* 6775 +fi=(27) +2177 150 ++1 75 +fe=(32) +773 75 ++1 75 +668 300 +-10 150 +fi=(10) +938 50 +fi=(47) +478 50 +0 50 +fe=(32) +523 100 +fi=(19) +1051 250 +fe=(32) +529 350 +cfn=(5228) +calls=1074 +15 +* 4375 +fi=(27) +2177 100 ++1 50 +fe=(32) +773 50 ++1 50 +668 200 + +fn=(5684) +186 100 +493 25 ++30 25 +fi=(19) +1051 75 +fe=(32) +529 150 +cfn=(5228) +calls=37 +15 +* 20393 +fi=(27) +2177 50 ++1 25 +fe=(32) +773 25 ++1 25 +189 100 + +fl=(94) +fn=(5656) ::check_for_duplicates +1036 525000 ++5 150000 +0 150000 +fi=(33) +3101 75000 +fe=(94) +1042 150000 +0 300000 +fi=(32) +611 150000 +fi=(20) +970 300000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +fe=(94) +0 225000 +fi=(33) +1032 150000 ++1 75000 +cfi=(32) +cfn=(5660) +calls=111000 186 +* 8025000 +fi=(32) +611 150000 +0 225000 +fi=(18) +1963 225000 +fi=(33) +1038 225000 +fe=(94) ++16 225000 ++1 600000 + +fn=(5600) +601 1500300 ++1 1000200 +cfn=(5602) ::next +calls=370074 1123 +* 28202100 +* 1250250 ++1 350100 ++1 450000 +fi=(91) +129 525000 +fe=(94) +777 225000 +fi=(91) +129 150000 ++4 150000 ++12 150000 +fi=(43) +1229 150000 +fi=(91) +146 150000 +fi=(43) +1229 75000 +fi=(91) +262 75000 +129 375000 ++4 150000 ++12 150000 +fi=(43) +1229 75000 +fi=(91) +145 75000 ++1 150000 +fi=(43) +1229 75000 +fi=(91) +262 75000 +fi=(54) +871 225000 +fe=(94) +604 375000 ++3 1250250 + +fn=(5602) +1123 1750350 ++1 750150 +955 750150 ++2 250050 +1124 250050 +fi=(44) +544 500100 +fi=(14) +1663 500100 +fi=(50) +180 250050 +fe=(94) +1125 75000 +fi=(44) +90 375000 +-90 75000 +fe=(94) +1130 75000 +fi=(14) +627 75000 +fe=(94) +1130 75000 +fi=(93) +315 75000 +fe=(94) +1130 75000 +fi=(14) +627 75000 +fe=(94) +1130 75000 +fi=(93) +315 75000 +0 225000 +fi=(50) +180 75000 +fe=(94) +0 75000 +fi=(50) +180 75000 +fe=(94) +1138 175050 ++1 175050 +0 75000 +fi=(50) +180 75000 +fe=(94) +1143 300000 +fi=(14) +1663 150000 +fi=(50) +180 75000 +fe=(94) +1143 450000 +0 375000 +1188 525000 +0 175050 +1261 2250450 +-73 450000 +cfn=(5656) +calls=111000 1036 +* 12075000 +* 150000 +fi=(14) +1663 300000 +fi=(50) +180 75000 +0 225000 +fe=(94) +1199 150000 +fi=(93) +315 75000 +0 150000 +fe=(94) +0 225000 +fi=(14) +1663 150000 +fi=(50) +180 300000 +fe=(94) +1243 75000 +fi=(149) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/traits/iterator.rs +2490 75000 +fe=(94) +1243 216750 +fi=(149) +2490 216750 +fi=(14) +627 216750 +1663 433500 +fi=(50) +180 216750 +fi=(93) +0 150000 +fe=(94) +1243 75000 +0 150000 +1243 150000 +1113 150000 +0 375000 + +fl=(26) +fn=(5682) +65 75200 +cob=(2) +cfi=(2) +cfn=(4868) +calls=112323 -65 +* 2487000 + +fl=(45) +fn=(5926) +725 200200 ++1 100100 +0 25025 +735 225225 + +fl=(53) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hash/sip.rs +fn=(5290) as core::hash::Hasher>::write +256 250000 ++2 250000 ++4 750000 +0 500000 +278 250000 ++1 750000 ++3 500000 +0 625000 +fi=(18) +573 125000 +fe=(53) +288 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fe=(53) +78 125000 +fi=(47) +2215 125000 +fe=(53) +79 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fe=(53) +79 125000 +fi=(47) +2215 250000 +fe=(53) +78 125000 +290 125000 ++2 125000 +-10 250000 +0 500000 +126 500000 +fi=(18) +573 200000 +fe=(53) +132 400000 +0 300000 +132 450000 +fi=(54) +871 25000 +fi=(18) +573 25000 +fe=(53) +134 75000 ++1 25000 ++2 500000 ++2 150000 +298 25000 +0 25000 +300 50000 +-2 225000 +0 225000 +300 450000 + +fl=(78) +fn=(5840) +78 50000 +fi=(84) +184 100000 +0 150000 +fi=(54) +623 100000 +fi=(84) +188 100000 ++1 100000 +fi=(88) +1161 50000 +0 50000 +fi=(84) +193 1050150 +fi=(54) +389 350050 +fi=(88) +1161 700100 +0 100000 +fe=(78) +86 100000 + +fl=(24) +fn=(5092) +41 125250 +fi=(13) +3994 125250 +762 125250 +fe=(24) +16 125250 +fi=(25) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs +161 501000 +fi=(26) +30 250500 ++1 250500 +cob=(2) +cfi=(2) +cfn=(4226) +calls=186395 -31 +* 17149778 +fe=(24) + +fn=(6436) measured_region +79 9 +fi=(19) +2144 1 +fi=(34) +1100 1 +0 10 +fi=(26) +0 5 +fi=(150) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hint.rs +491 4 +fi=(13) +4029 1 +fi=(59) +2434 1 +fi=(26) +0 24 +fi=(150) +491 96 +fi=(13) +4029 24 +fi=(59) +2434 24 +fe=(24) +89 125 +cfi=(74) +cfn=(5464) +calls=25 362 +* 284135332 +fi=(27) +1230 50 ++1 200 +fe=(24) +89 50 +cfi=(18) +cfn=(6382) +calls=25 847 +* 12449239 +fi=(19) +2144 25 +fi=(34) +1100 25 +fe=(24) +94 8 + +fn=(5538) +41 25350 +fi=(13) +3994 25350 +762 25350 +fe=(24) +33 25350 +fi=(89) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs +-33 126750 +405 50700 +fi=(26) +70 50050 ++1 50050 +cob=(2) +cfi=(2) +cfn=(4458) +calls=37037 -71 +* 6884647 +-1 650 ++1 650 +cob=(2) +cfi=(2) +cfn=(4458) +calls=2488 -71 +* 50668 +fe=(24) + +fn=(5130) +cfn=(6436) +calls=1 79 +70 296585254 + +fl=(52) +fn=(5740) +694 750000 ++5 125000 +fi=(53) +203 250000 +fi=(48) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/hash/random.rs +84 125000 +fi=(53) +204 250000 +fi=(48) +84 625000 +fi=(10) +4058 375000 +fi=(53) +233 375000 +cfn=(5290) +calls=185000 +23 +* 6875000 +* 500000 +cfn=(5290) +calls=185000 +23 +* 3650000 ++81 375000 +-2 250000 ++4 250000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(47) +2215 250000 +fi=(53) +78 125000 +318 125000 ++2 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 250000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 250000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 125000 +fi=(10) +2652 125000 +fi=(53) +79 125000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(10) +2652 250000 +fi=(47) +2215 125000 +fi=(53) +78 125000 +fi=(47) +2215 125000 +fi=(53) +79 125000 +fi=(10) +2652 125000 +fi=(47) +2215 500000 +fi=(53) +323 375000 +fe=(52) +702 625000 + +ob=(1) /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 +fl=(1) ??? +fn=(0) 0x0000000000023340 +cob=(6) +cfi=(6) +cfn=(4126) +calls=1 0 +0 296585254 + +totals: 296585254 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-Cargo.toml b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-Cargo.toml new file mode 100644 index 0000000..7afbad6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-Cargo.toml @@ -0,0 +1,9 @@ +[package] +name="xml-diagnostics" +version="0.0.0" +edition="2021" +[workspace] +[dependencies] +polyxml={path="/home/bailey/github/PolyXML/crates/polyxml-core"} +[profile.release] +debug=1 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-allocations.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-allocations.txt new file mode 100644 index 0000000..da27eb0 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-allocations.txt @@ -0,0 +1,12 @@ +memcap: <=7843 MiB (60% of 13072 MiB available) [systemd MemoryMax, swap off] +operation=read,count=0,iterations=1,allocations=12,reallocations=5,requested_bytes=11093,input_bytes=94,output_bytes=94,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7857 MiB (60% of 13095 MiB available) [systemd MemoryMax, swap off] +operation=write,count=0,iterations=1,allocations=2,reallocations=2,requested_bytes=554,input_bytes=94,output_bytes=94,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7857 MiB (60% of 13095 MiB available) [systemd MemoryMax, swap off] +operation=read,count=1000,iterations=1,allocations=5010,reallocations=1014,requested_bytes=717402,input_bytes=63911,output_bytes=63411,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7856 MiB (60% of 13094 MiB available) [systemd MemoryMax, swap off] +operation=write,count=1000,iterations=1,allocations=1001,reallocations=2007,requested_bytes=158560,input_bytes=63911,output_bytes=63411,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7856 MiB (60% of 13094 MiB available) [systemd MemoryMax, swap off] +operation=read,count=10000,iterations=1,allocations=50010,reallocations=10019,requested_bytes=7774738,input_bytes=668911,output_bytes=663911,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 +memcap: <=7855 MiB (60% of 13092 MiB available) [systemd MemoryMax, swap off] +operation=write,count=10000,iterations=1,allocations=10001,reallocations=20011,requested_bytes=2376640,input_bytes=668911,output_bytes=663911,field_schema_bytes=160,scalar_type_bytes=32,value_type_bytes=32,poly_value_bytes=56 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-build.txt new file mode 100644 index 0000000..cf7b201 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-build.txt @@ -0,0 +1,37 @@ +memcap: <=7857 MiB (60% of 13095 MiB available) [systemd MemoryMax, swap off] + Compiling proc-macro2 v1.0.107 + Compiling quote v1.0.47 + Compiling unicode-ident v1.0.26 + Compiling syn v3.0.6 + Compiling serde_core v1.0.229 + Compiling memchr v2.8.3 + Compiling lexical-util v1.0.7 + Compiling serde v1.0.229 + Compiling serde_derive v1.0.229 + Compiling siphasher v1.0.4 + Compiling zmij v1.0.23 + Compiling phf_shared v0.14.0 + Compiling lexical-parse-integer v1.0.6 + Compiling lexical-write-integer v1.0.6 + Compiling aho-corasick v1.1.5 + Compiling thiserror v2.0.21 + Compiling regex-syntax v0.8.11 + Compiling serde_json v1.0.151 + Compiling fastrand v2.5.0 + Compiling phf_generator v0.14.0 + Compiling regex-automata v0.4.18 + Compiling lexical-write-float v1.0.6 + Compiling lexical-parse-float v1.0.6 + Compiling thiserror-impl v2.0.21 + Compiling memo-map v0.3.4 + Compiling itoa v1.0.18 + Compiling minijinja v2.24.0 + Compiling lexical-core v1.0.6 + Compiling regex v1.13.1 + Compiling phf_codegen v0.14.0 + Compiling quick-xml v0.42.0 + Compiling heck v0.5.0 + Compiling smallvec v1.16.2 + Compiling polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling xml-diagnostics v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected) + Finished `release` profile [optimized + debuginfo] target(s) in 1m 11s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-fixtures.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-fixtures.rs new file mode 100644 index 0000000..f231439 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-fixtures.rs @@ -0,0 +1,85 @@ +use std::hint::black_box; + +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize}; +use std::sync::Arc; + +fn build_sensor_fixture() -> (Arc, Vec) { + let schema = ModelSchema::builder("Sensor") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "temp", + b"temp", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .field(FieldSchema::new( + "status", + b"status", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "active", + b"active", + FieldKind::Element, + ValueType::Scalar(ScalarType::Bool), + )) + .build(); + + let xml = br#"23.75OPERATIONALtrue"#.to_vec(); + (schema, xml) +} + +fn build_catalog_fixture(count: usize) -> (Arc, Vec) { + let item_schema = ModelSchema::builder("Item") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "name", + b"name", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "price", + b"price", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .build(); + + let catalog_schema = ModelSchema::builder("Catalog") + .field(FieldSchema::new( + "items", + b"item", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Nested(item_schema))), + )) + .build(); + + let mut xml = String::with_capacity(count * 64 + 32); + xml.push_str(""); + for i in 0..count { + use std::fmt::Write; + write!( + xml, + r#"Part-{i}{:.2}"#, + (i as f64) * 1.25 + ) + .unwrap(); + } + xml.push_str(""); + + (catalog_schema, xml.into_bytes()) +} + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-harness.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-harness.rs new file mode 100644 index 0000000..1fbe95d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-harness.rs @@ -0,0 +1,94 @@ +// Fixture definitions are extracted verbatim from core_benchmarks.rs by run.py. +include!("fixtures.rs"); + +use std::alloc::{GlobalAlloc, Layout, System}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; + +struct CountingAllocator; +static COUNTING: AtomicBool = AtomicBool::new(false); +static ALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static REALLOCATIONS: AtomicUsize = AtomicUsize::new(0); +static BYTES: AtomicUsize = AtomicUsize::new(0); + +// Diagnostic instrumentation only. The benchmark consumers use System directly. +unsafe impl GlobalAlloc for CountingAllocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc(layout) } + } + unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + ALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(layout.size(), Ordering::Relaxed); + } + unsafe { System.alloc_zeroed(layout) } + } + unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { + unsafe { System.dealloc(ptr, layout) } + } + unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { + if COUNTING.load(Ordering::Relaxed) { + REALLOCATIONS.fetch_add(1, Ordering::Relaxed); + BYTES.fetch_add(new_size, Ordering::Relaxed); + } + unsafe { System.realloc(ptr, layout, new_size) } + } +} +#[global_allocator] +static ALLOCATOR: CountingAllocator = CountingAllocator; + +fn main() { + let args: Vec = std::env::args().collect(); + let operation = args.get(1).expect("read or write"); + let count: usize = args + .get(2) + .expect("0 for sensor, or catalog count") + .parse() + .unwrap(); + let iterations: usize = args.get(3).expect("iteration count").parse().unwrap(); + let mode = args.get(4).map(String::as_str).unwrap_or("allocations"); + let (schema, xml) = if count == 0 { + build_sensor_fixture() + } else { + build_catalog_fixture(count) + }; + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let root = if count == 0 { "Sensor" } else { "Catalog" }; + let output = serialize(root, &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + for _ in 0..10 { + if operation == "read" { + black_box(deserialize(&xml, Arc::clone(&schema)).unwrap()); + } else { + black_box(serialize(root, &value, &schema, None).unwrap()); + } + } + COUNTING.store(mode == "allocations", Ordering::Relaxed); + measured_region(operation, iterations, &xml, &value, root, &schema); + COUNTING.store(false, Ordering::Relaxed); + println!("operation={operation},count={count},iterations={iterations},allocations={},reallocations={},requested_bytes={},input_bytes={},output_bytes={},field_schema_bytes={},scalar_type_bytes={},value_type_bytes={},poly_value_bytes={}", + ALLOCATIONS.load(Ordering::Relaxed), REALLOCATIONS.load(Ordering::Relaxed), BYTES.load(Ordering::Relaxed), xml.len(), output.len(), + std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::(), std::mem::size_of::()); +} + +#[inline(never)] +#[no_mangle] +fn measured_region( + operation: &str, + iterations: usize, + xml: &[u8], + value: &polyxml::PolyValue, + root: &str, + schema: &Arc, +) { + for _ in 0..iterations { + if operation == "read" { + black_box(deserialize(black_box(xml), Arc::clone(schema)).unwrap()); + } else { + black_box(serialize(root, black_box(value), schema, None).unwrap()); + } + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-metadata.json new file mode 100644 index 0000000..26a5e12 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected-metadata.json @@ -0,0 +1,8 @@ +{ + "revision": "7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d", + "core_status": "", + "os": "Linux-6.18.40.1-microsoft-standard-WSL2-x86_64-with-glibc2.43", + "rustc": "rustc 1.99.0 (b940084d7 2026-09-28)\nbinary: rustc\ncommit-hash: b940084d7eb6a299eb4bfeb8e34901bc051e7ac4\ncommit-date: 2026-09-28\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.0\nLLVM version: 23.1.1\n", + "executable": "/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics", + "profile": "release debug=1; allocation instrumentation; not used for latency numbers" +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected.lock new file mode 100644 index 0000000..1614ee2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/selected.lock @@ -0,0 +1,317 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "xml-diagnostics" +version = "0.0.0" +dependencies = [ + "polyxml", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-annotated.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-annotated.txt new file mode 100644 index 0000000..00922d9 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-annotated.txt @@ -0,0 +1,92 @@ +-------------------------------------------------------------------------------- +Profile data file 'benchmarks/rust-runtime-investigation/target/evidence/selected-diagnostics/write-1000.callgrind' (creator: callgrind-3.26.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 27961426 +Trigger: Program termination +Profiled target: benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics write 1000 25 instructions (PID 394749, part 1) +Events recorded: Ir +Events shown: Ir +Event sort order: Ir +Thresholds: 95 +Include dirs: +User annotated: +Auto-annotation: off + +-------------------------------------------------------------------------------- +Ir +-------------------------------------------------------------------------------- +73,268,130 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir file:function +-------------------------------------------------------------------------------- +7,975,000 (10.88%) crates/polyxml-core/src/serializer.rs:::write_model::<&mut alloc::vec::Vec>'2 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] +6,239,550 ( 8.52%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs:core::str::converts::from_utf8 +5,451,300 ( 7.44%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/writer.rs:>>::write_event:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] +4,801,200 ( 6.55%) ???:0x0000000000197a00 [/usr/lib/x86_64-linux-gnu/libc.so.6] +2,962,775 ( 4.04%) ???:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] +2,500,200 ( 3.41%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::_escape::::{closure#0}, &str> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] +2,240,625 ( 3.06%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/algorithm.rs:::format_scalar_to +2,100,350 ( 2.87%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs:core::str::converts::from_utf8 [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] +2,100,000 ( 2.87%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:::write_model::<&mut alloc::vec::Vec>'2 +2,050,200 ( 2.80%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:quick_xml::escape::_escape::::{closure#0}, &str> +2,012,750 ( 2.75%) crates/polyxml-core/src/serializer.rs:::format_scalar_to [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] +1,800,700 ( 2.46%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:>>::write_event:: +1,726,575 ( 2.36%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>>::write_event:: +1,433,475 ( 1.96%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/jeaiii.rs:::format_scalar_to +1,325,400 ( 1.81%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:>>::write_event:: +1,187,750 ( 1.62%) ???:0x00000000000b4180 [/usr/lib/x86_64-linux-gnu/libc.so.6] +1,175,000 ( 1.60%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::write_model::<&mut alloc::vec::Vec>'2 +1,150,000 ( 1.57%) crates/polyxml-core/src/serializer.rs:::validate_scalar [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] +1,079,375 ( 1.47%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:>::reserve::do_reserve_and_handle:: [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] +1,062,650 ( 1.45%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 916,750 ( 1.25%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:quick_xml::escape::_escape::::{closure#0}, &str> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 877,975 ( 1.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::finish_grow [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 850,000 ( 1.16%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:::write_model::<&mut alloc::vec::Vec>'2 + 825,925 ( 1.13%) ???:free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 775,225 ( 1.06%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs:>>::write_event:: + 651,125 ( 0.89%) ???:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 600,150 ( 0.82%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/convert/mod.rs:>>::write_event:: + 500,000 ( 0.68%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::push_attribute::<(&str, &str)> + 466,750 ( 0.64%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 451,575 ( 0.62%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::finish_grow + 450,450 ( 0.61%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:core::str::converts::from_utf8 + 450,000 ( 0.61%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::push_attribute::<(&str, &str)> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 450,000 ( 0.61%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::write_model::<&mut alloc::vec::Vec>'2 + 425,425 ( 0.58%) crates/polyxml-core/src/schema.rs:::matches_variant [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 425,125 ( 0.58%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:>>::write_event:: + 425,000 ( 0.58%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::push_attr [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 402,925 ( 0.55%) crates/polyxml-core/src/serializer.rs:::write_model::<&mut alloc::vec::Vec> [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 400,000 ( 0.55%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::push_attr + 400,000 ( 0.55%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:::write_model::<&mut alloc::vec::Vec>'2 + 375,000 ( 0.51%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs:::write_model::<&mut alloc::vec::Vec>'2 + 351,225 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs:__rustc::__rust_realloc + 350,100 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs:>>::write_event:: + 350,000 ( 0.48%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs:::push_attr + 314,000 ( 0.43%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs:quick_xml::escape::_escape::::{closure#0}, &str> + 300,000 ( 0.41%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs:>::from [/home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics] + 300,000 ( 0.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs:::write_model::<&mut alloc::vec::Vec>'2 + 300,000 ( 0.41%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::write_model::<&mut alloc::vec::Vec>'2 + 280,300 ( 0.38%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs:::format_scalar_to + 262,500 ( 0.36%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/write.rs:::format_scalar_to + 250,875 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::finish_grow + 250,875 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs:>::reserve::do_reserve_and_handle:: + 250,875 ( 0.34%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:::finish_grow + 225,225 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs:::matches_variant + 225,000 ( 0.31%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs:::push_attr + 224,825 ( 0.31%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs:::format_scalar_to + 200,700 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs:__rustc::__rust_realloc + 200,000 ( 0.27%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs:::write_model::<&mut alloc::vec::Vec>'2 + 200,000 ( 0.27%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::push_attribute::<(&str, &str)> + 192,225 ( 0.26%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs:::format_scalar_to + 175,700 ( 0.24%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs:::finish_grow + 168,725 ( 0.23%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs:::format_scalar_to + 150,525 ( 0.21%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs:>::reserve::do_reserve_and_handle:: + 150,000 ( 0.20%) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/shared.rs:::format_scalar_to + 150,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs:::write_model::<&mut alloc::vec::Vec>'2 + 150,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs:::push_attr + 150,000 ( 0.20%) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs:::write_model::<&mut alloc::vec::Vec>'2 + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-valgrind.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-valgrind.txt new file mode 100644 index 0000000..ba06ebf --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-valgrind.txt @@ -0,0 +1,12 @@ +==394749== Callgrind, a call-graph generating cache profiler +==394749== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al. +==394749== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info +==394749== Command: benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics write 1000 25 instructions +==394749== Parent PID: 388927 +==394749== +==394749== For interactive control, run 'callgrind_control -h'. +==394749== +==394749== Events : Ir +==394749== Collected : 73268130 +==394749== +==394749== I refs: 73,268,130 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000.callgrind b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000.callgrind new file mode 100644 index 0000000..f25e677 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000.callgrind @@ -0,0 +1,1873 @@ +# callgrind format +version: 1 +creator: callgrind-3.26.0 +pid: 394749 +cmd: benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics write 1000 25 instructions +part: 1 + + +desc: I1 cache: +desc: D1 cache: +desc: LL cache: + +desc: Timerange: Basic block 0 - 27961426 +desc: Trigger: Program termination + +positions: line +events: Ir +summary: 73268130 + + +ob=(2) /usr/lib/x86_64-linux-gnu/libc.so.6 +fl=(2) ??? +fn=(4226) malloc +0 400 +cfn=(4232) 0x00000000000b2400 +calls=4089 0 +0 10525 +0 650725 + +fn=(4460) 0x00000000000b4180 +0 1182900 +cfn=(4232) +calls=163 0 +0 31900 +0 1675 +cfn=(4502) 0x00000000000b2300 +calls=2112 0 +0 8425 +0 1050 +cfn=(4942) 0x00000000000b0f70 +calls=109 0 +0 1650 +0 1325 +cob=(3) ??? +cfi=(3) ??? +cfn=(4486) 0x0000000004b296a0 +calls=162 0 +0 620850 +0 600 +cfn=(4502) +calls=162 0 +0 13900 +0 200 + +fn=(4128) (below main) +cfn=(4162) 0x000000000002a580 +calls=1 0 +0 73268130 + +fn=(4966) 0x0000000000198400 +0 103400 + +fn=(4458) realloc +0 2685850 +cfn=(4460) +calls=38275 0 +0 1864475 +0 276925 + +fn=(4942) +0 8275 + +fn=(4502) +0 2100 +cfn=(4508) 0x00000000000b20e0 +calls=2274 0 +0 19350 +0 875 + +fn=(4868) free +0 300 +cfn=(4508) +calls=4021 0 +0 3175 +0 825625 + +fn=(4508) +0 18350 +cfn=(4942) +calls=721 0 +0 3050 +0 1125 + +fn=(4488) 0x0000000000197a00 +0 4801200 + +fn=(4162) +cob=(6) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/target/release/xml-diagnostics +cfi=(6) ??? +cfn=(4176) main +calls=1 0 +0 73268130 + +fn=(4232) +0 20825 +cfn=(4942) +calls=36 0 +0 775 +0 15950 +cfn=(4942) +calls=749 0 +0 2800 +0 2075 + +ob=(3) +fl=(3) +fn=(4486) +0 200 +cob=(2) +cfi=(2) +cfn=(4488) +calls=208 0 +0 620650 + +ob=(6) +fl=(32) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/raw_vec/mod.rs +fn=(5228) ::finish_grow +544 201400 +fi=(10) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/uint_macros.rs +3212 201400 +fi=(47) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/intrinsics/mod.rs +478 75525 +0 25175 +fe=(32) +631 25175 +fi=(10) +1401 25175 +fi=(23) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/alloc.rs +228 125875 +cfi=(24) /home/bailey/github/PolyXML/benchmarks/rust-runtime-investigation/target/selected/src/main.rs +cfn=(5538) __rustc::__rust_realloc +calls=36276 41 +* 4179875 +fi=(27) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/result.rs +965 50350 ++1 75525 +fe=(32) +0 50350 +564 151050 +-20 200000 +fi=(10) +3212 200000 +fi=(47) +478 75000 +fe=(32) +631 50000 +fi=(10) +1401 25000 +fi=(23) +228 125000 +cfi=(24) +cfn=(5538) +calls=36002 41 +* 1400000 +fi=(27) +965 50000 ++1 75000 +fe=(32) +0 50000 +564 150000 + +fn=(5530) >::reserve::do_reserve_and_handle:: +658 100700 +512 50350 +fi=(10) +938 25175 +fi=(47) +478 25175 +0 25175 +fe=(32) +523 50350 +fi=(19) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/cmp.rs +1051 50350 +fe=(32) +159 176225 +fi=(19) +1051 75525 +fe=(32) +529 100700 +cfn=(5228) +calls=36258 +15 +* 5186875 +fi=(27) +2177 50350 ++1 25175 +fe=(32) +773 25175 ++1 25175 +668 100700 +-10 75000 +fi=(10) +938 25000 +fi=(47) +478 25000 +0 25000 +fe=(32) +523 50000 +fi=(19) +1051 125000 +fe=(32) +529 175000 +cfn=(5228) +calls=36004 +15 +* 2400000 +fi=(27) +2177 50000 ++1 25000 +fe=(32) +773 25000 ++1 25000 +668 100000 + +fl=(94) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/attributes.rs +fn=(6256) >::from +376 75000 ++2 50000 ++1 50000 +fi=(107) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/escape.rs +168 50000 +cfn=(6258) quick_xml::escape::_escape::::{closure#0}, &str> +calls=36000 +33 +* 1722500 +* 25000 +fe=(94) +377 25000 ++4 100000 + +fl=(26) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/alloc/unix.rs +fn=(5682) __rustc::__rust_dealloc +65 25000 +cob=(2) +cfi=(2) +cfn=(4868) +calls=42043 -65 +* 825000 + +fl=(45) /home/bailey/github/PolyXML/crates/polyxml-core/src/schema.rs +fn=(6196) ::matches_variant +182 200200 +fi=(14) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/non_null.rs +454 25025 +fi=(13) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/sync/atomic.rs +3994 25025 +fi=(97) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/sync/rwlock/futex.rs +54 50050 ++45 25025 +fi=(13) +4149 25025 +fi=(97) +97 25025 +fi=(13) +3994 25025 +fi=(33) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/vec/mod.rs +1865 25025 +fi=(14) +1663 50050 +fi=(50) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/iter/macros.rs +180 25025 +0 75075 +fi=(13) +4049 25025 +fi=(97) +111 25025 ++7 100100 +fe=(45) ++73 225225 + +fn=(6178) ::variants +143 350 +fi=(14) +454 50 +fi=(59) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/sync.rs +2454 50 +fi=(13) +3994 50 +fi=(97) +54 100 ++45 50 +fi=(13) +4149 50 +fi=(97) +97 50 +fi=(13) +3994 50 +fi=(33) +1865 50 +fi=(10) +3212 350 +fi=(47) +478 100 +fi=(32) +-17 100 +fi=(121) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/take.rs +0 50 +fi=(36) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/slice.rs +440 200 +fi=(13) +4049 50 +fi=(97) +111 50 ++7 200 +fe=(45) ++30 450 + +fl=(24) +fn=(5092) __rustc::__rust_alloc +41 25025 +fi=(13) +3994 25025 +762 25025 +fe=(24) +16 25025 +fi=(25) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/alloc.rs +161 100100 +fi=(26) +30 50050 ++1 50050 +cob=(2) +cfi=(2) +cfn=(4226) +calls=46080 -31 +* 661650 +fe=(24) + +fn=(5538) +41 50175 +fi=(13) +3994 50175 +762 50175 +fe=(24) +33 50175 +fi=(89) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/alloc/global.rs +-33 250875 +405 100350 +fi=(26) +70 100350 ++1 100350 +cob=(2) +cfi=(2) +cfn=(4458) +calls=72278 -71 +* 4827250 +fe=(24) + +fn=(6412) measured_region +79 9 +fi=(19) +2144 1 +fi=(34) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/range.rs +1100 1 +0 8 +fi=(26) +0 3 +fi=(19) +2144 25 +fi=(34) +1100 25 +fi=(131) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/hint.rs +491 50 +fe=(24) +91 175 +cfi=(111) /home/bailey/github/PolyXML/crates/polyxml-core/src/lib.rs +cfn=(6154) polyxml::serialize +calls=25 -51 +* 73263400 +fi=(27) +1230 50 ++1 100 +fi=(131) +491 50 +fi=(32) +631 50 +425 25 +fi=(26) +65 25 +cob=(2) +cfi=(2) +cfn=(4868) +calls=25 -65 +* 4100 +* 25 +fe=(24) ++29 8 + +fn=(5130) xml_diagnostics::main +cfn=(6412) +calls=1 79 +70 73268130 + +fl=(122) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/writer.rs +fn=(6214) >>::write_event:: +262 1600400 +fi=(142) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/convert/mod.rs +792 600150 +fe=(122) +264 600150 ++1 300100 ++53 75025 +0 75025 +318 75025 +-31 150000 ++26 50000 +fi=(32) +616 50000 +fi=(33) +1461 50000 +fi=(10) +2689 50000 +fi=(32) +764 50000 +-94 50000 +fi=(33) +2981 99850 +0 50000 +fi=(20) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mut_ptr.rs +970 50000 +fi=(18) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ptr/mod.rs +573 150000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=72000 0 +* 705300 +fi=(33) +2986 100000 +fe=(122) +0 250000 +272 300100 +fi=(41) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/option.rs +765 150050 +fi=(33) +1461 75025 +fi=(32) +764 75025 +-94 75025 +-59 75025 +fi=(18) +-38 75025 +fi=(33) +2986 150050 +fi=(32) +616 75025 +fi=(10) +2689 150050 +fi=(32) +764 75025 +-94 75025 +fi=(33) +2981 149900 +0 75025 +fi=(20) +970 150050 +fi=(18) +573 150050 +cob=(2) +cfi=(2) +cfn=(4488) +calls=108036 0 +* 1075375 +fi=(32) ++43 75025 +fi=(33) +2986 150050 +fi=(32) +764 75025 +-94 75025 +-59 75025 +fi=(18) +-38 75025 +fi=(33) +2986 150050 +fi=(41) +765 225075 +fi=(18) ++82 275100 +fe=(122) +0 75025 +fi=(32) +616 75025 +fi=(33) +1461 75025 +fi=(10) +2689 75025 +fi=(32) +764 75025 +-94 75025 +-59 75025 +fi=(18) +-38 75025 +fi=(33) +2986 150050 +fi=(32) +616 75025 +fi=(10) +2689 150050 +fi=(32) +764 75025 +-94 75025 +fi=(33) +2981 150050 +0 75025 +fi=(20) +970 150050 +fi=(18) +573 150050 +cob=(2) +cfi=(2) +cfn=(4488) +calls=108036 0 +* 1125375 +fi=(32) ++43 75025 +fi=(33) +2986 150050 +fi=(32) +764 75025 +-94 75025 +-59 75025 +fi=(18) +-38 75025 +fi=(33) +2986 150050 +fi=(18) +847 300100 +fe=(122) +0 100000 +cfi=(26) +cfn=(5682) +calls=36000 65 +0 850000 +fi=(41) +765 400100 +fe=(122) +308 1800450 +fi=(32) +672 450 +cfn=(5530) +calls=108 -14 +* 660025 +fi=(33) +3101 75 +2981 75 +fi=(32) +672 150 +cfn=(5530) +calls=36 -14 +* 18650 +fi=(33) +3101 50 +0 75 +fi=(32) +672 450 +cfn=(5530) +calls=108 -14 +* 39500 +fi=(33) +3101 150 +2981 75 +fe=(122) + +fl=(38) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/converts.rs +fn=(5180) core::str::converts::from_utf8 +89 750125 +fi=(39) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/str/validations.rs ++44 450075 ++12 300050 +0 1050175 +145 250 ++19 150150 ++1 300300 +fi=(10) +2689 300300 +3875 150150 +fi=(39) +222 150150 ++23 250 +-21 300050 ++17 300050 +0 150025 +241 1175200 ++1 587600 +-1 1325225 +fe=(38) +94 600100 +-94 150025 +98 600100 + +fl=(107) +fn=(6290) quick_xml::escape::_escape::::{closure#0}, &str> +201 500000 ++3 50000 +fi=(14) +1663 50000 +fi=(50) +180 50000 +0 250000 +180 250000 +0 150000 +fi=(14) +1663 675100 +fi=(50) +385 337550 +fi=(14) +1663 337550 +fi=(50) +180 337550 +379 675100 +fe=(107) +109 337550 +0 712650 +218 250000 ++7 200000 ++2 450000 + +fn=(6258) +201 225000 ++3 50000 +fi=(20) +970 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 225000 +fi=(14) +1663 144500 +fi=(50) +385 72250 +fi=(14) +1663 144500 +fi=(50) +379 144500 +fe=(107) +169 72250 +0 144500 +218 75000 ++7 125000 ++2 225000 + +fl=(100) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/events/mod.rs +fn=(6244) ::push_attribute::<(&str, &str)> +256 175000 +fi=(101) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/borrow.rs ++28 75000 +fi=(32) +611 25000 +fi=(126) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/char/methods.rs +2558 25000 +fi=(40) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/string.rs +1440 25000 +fi=(33) +2224 75000 +fi=(142) +781 50000 +cfi=(94) +cfn=(6256) +calls=36000 376 +* 2097500 +fe=(100) +261 75000 +cfn=(6266) ::push_attr +calls=36000 +41 +* 5899500 ++1 200000 +fi=(101) ++23 50000 +fi=(47) +478 25000 +fi=(32) +0 25000 +461 25000 +0 100000 +cfi=(6) +cfn=(5090) __rustc::__rust_no_alloc_shim_is_unstable_v2 +calls=36000 0 +0 25000 +0 25000 +fi=(23) +130 75000 +cfi=(24) +cfn=(5092) +calls=36000 -89 +* 950000 +fi=(32) +470 50000 +fi=(36) +0 25000 +fi=(18) +573 100000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 375000 +* 50000 +fi=(101) +286 75000 +fi=(32) +672 175000 +cfn=(5530) +calls=36000 -14 +* 5375000 +* 75000 +fe=(100) + +fn=(6266) +302 225000 +fi=(101) +-18 75000 +fi=(33) +1461 50000 +fi=(103) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quick-xml-0.42.0/src/name.rs +222 50000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +fi=(33) +2981 50000 +0 25000 +fi=(20) +970 25000 +fi=(18) +573 75000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 450000 +fi=(33) +2986 50000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +-59 25000 +fi=(18) +-38 25000 +fi=(33) +2986 50000 +fi=(101) +0 75000 +fi=(10) +2689 50000 +fi=(32) +764 25000 +-94 25000 +fi=(33) +2981 50000 +fi=(20) +970 50000 +fi=(18) +573 50000 +cob=(2) +cfi=(2) +cfn=(4488) +calls=36000 0 +* 449500 +fi=(33) +2986 50000 +fi=(32) +764 25000 +-94 25000 +fi=(126) +2558 25000 +fi=(40) +1440 25000 +fi=(33) +2224 25000 +fi=(18) +847 75000 +fe=(100) +309 200000 +fi=(32) +672 100000 +cfn=(5530) +calls=36000 -14 +* 3125000 +-56 25000 +fi=(33) +3101 50000 +fe=(100) + +fl=(111) +fn=(6154) +40 50 +fi=(120) /home/bailey/github/PolyXML/crates/polyxml-core/src/serializer.rs +180 125 +cfn=(6156) ::serialize_with_options +calls=36 +3 +* 73263125 +* 25 +fe=(111) +47 75 + +fl=(6) +fn=(5090) +0 25025 + +fn=(4126) (below main) +cob=(2) +cfi=(2) +cfn=(4128) +calls=1 0 +0 73268130 + +fn=(4176) +cfi=(8) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/rt.rs +cfn=(4178) std::rt::lang_start_internal +calls=1 152 +0 73268130 + +fl=(30) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/std/src/sys/backtrace.rs +fn=(5128) std::sys::backtrace::__rust_begin_short_backtrace:: +fi=(143) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/function.rs +cfi=(24) +cfn=(5130) +calls=1 43 +250 73268130 +fe=(30) + +fl=(8) +fn=(4178) +fi=(143) +cfn=(5126) std::rt::lang_start::<()>::{closure#0} +calls=1 206 +287 73268130 +fe=(8) + +fn=(5126) +cfi=(30) +cfn=(5128) +calls=1 162 +206 73268130 + +fl=(120) +fn=(6156) +183 350 +cfi=(6) +cfn=(5090) +calls=36 0 +* 25 +fi=(23) +-53 75 +cfi=(24) +cfn=(5092) +calls=36 -89 +* 11950 +fi=(32) +470 50 +fi=(33) +969 75 +fe=(120) +192 50 +fi=(41) +0 25 +743 25 +0 25 +fi=(122) +124 75 +fe=(120) ++73 50 +0 50 +199 75 +cfn=(6166) ::build +calls=36 22 +* 7000 +fi=(41) +743 75 +0 25 +743 75 +0 50 +fe=(120) +202 225 +cfn=(6194) ::write_model::<&mut alloc::vec::Vec> +calls=36 302 +* 73242200 +* 25 +fi=(27) +2177 50 +fe=(120) +212 150 +fi=(18) +847 125 +fe=(120) +0 25 +213 200 + +fn=(6166) +22 250 +fi=(33) +462 100 +fe=(120) +27 50 +cfn=(6168) ::collect_namespaces +calls=36 +60 +* 6150 +fi=(33) +3126 25 +fe=(120) +29 25 +fi=(41) +709 50 +fe=(120) +0 25 +30 25 +fi=(32) +425 50 +631 25 +fe=(120) +85 225 + +fn=(6232) ::format_scalar_to +216 600000 ++4 300000 +0 75000 +220 225000 ++7 25000 +fi=(144) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/f64.rs +1264 25000 +886 100000 +fi=(115) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/num.rs +1037 50000 +fi=(32) +611 50000 +fe=(120) +223 25000 +fi=(19) +2144 25000 +fi=(145) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/api.rs +50 25000 +fi=(123) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/jeaiii.rs +310 50000 ++2 50000 +118 22500 ++2 45000 ++1 45000 +fi=(124) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-util-1.0.7/src/digit.rs +-60 22500 +fi=(123) ++16 22500 +-39 45000 ++76 67500 +fi=(44) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/index.rs +219 22500 +fi=(123) +68 22500 ++20 22500 ++1 22500 +-21 22500 ++21 45000 +314 22500 +0 125000 +fi=(128) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/ops/bit.rs +178 50000 +fi=(19) +2105 25000 +fi=(125) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/write.rs +121 25000 +fi=(10) +0 25000 +fi=(127) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/algorithm.rs +292 50025 +0 50 +fi=(128) +282 50 +fi=(10) +154 25 +fi=(146) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-integer-1.0.6/src/decimal.rs +32 50 +fi=(44) +186 25 +fi=(19) +2150 25 +fi=(146) +108 25 +fi=(127) +-54 25 +fi=(147) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/shared.rs +181 100 +fi=(128) +282 49950 +fi=(10) +154 24975 +fi=(146) +32 49950 +fi=(44) +186 24975 +fi=(19) +2150 24975 +fi=(146) +108 24975 +fi=(127) +-54 24975 +fi=(147) +181 99900 +fi=(123) +0 25000 +fi=(147) +186 50000 +fi=(127) +53 50000 +fi=(123) +310 50000 ++2 24500 +118 9375 ++2 18750 ++1 28125 +fi=(124) +-60 3350 +fi=(123) ++16 3350 +-39 6700 ++76 10050 +fi=(44) +219 3350 +fi=(123) +68 3350 ++20 3350 ++1 3350 +-21 3350 ++21 6700 +fi=(127) +225 3350 ++3 9500 +fi=(44) +0 99900 +fi=(127) +352 24975 +0 49950 +fi=(128) +178 24975 +fi=(115) +1057 74925 +fi=(19) +2105 24975 +fi=(115) +1057 99900 +fi=(148) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/num/int_macros.rs +2261 24975 +fi=(127) +875 24975 +456 49950 +fi=(44) +219 24975 +fi=(148) +2261 24975 +fi=(44) +219 49950 +fi=(149) /home/bailey/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lexical-write-float-1.0.6/src/index.rs +13 24975 +fi=(127) +883 24975 +457 24975 +1381 149850 +fi=(149) +13 24975 +fi=(127) +461 49950 ++12 74925 +836 99900 +-6 74925 ++7 49950 +-7 99900 +968 24975 +fi=(10) +2728 24975 +fi=(127) +484 24975 ++13 49950 +-51 24975 ++54 24975 +fi=(123) +314 5000 +fi=(44) +-95 2250 +fi=(123) +68 2250 ++20 4500 +fe=(120) +-88 12750 +fi=(123) +319 38250 ++2 25500 +fi=(124) +61 250 +fi=(123) ++16 500 +314 250 +0 4500 +314 8625 +fi=(44) +-95 2350 +fi=(123) +68 4700 ++20 2350 ++1 4700 +fi=(127) +225 2350 ++3 7000 +fi=(44) +-9 6025 +fi=(123) +68 12050 ++20 6025 ++1 6025 +-51 12050 ++76 18075 +-46 6025 ++20 6025 ++1 6025 +-21 6025 ++21 12050 +fi=(127) +225 6025 ++3 12675 +fi=(123) ++98 25500 +fi=(124) +61 525 +fi=(123) ++16 525 +fi=(127) +225 1575 +0 24975 +1398 74925 +535 24975 +1404 149850 ++2 124875 +0 24975 +fi=(10) +2728 24975 +fi=(127) +1088 24975 +1412 74925 +0 36050 +fi=(10) +2728 36050 +fi=(127) +1088 36050 +1412 108150 +fi=(10) +2728 24975 +fi=(127) +1088 24975 +1421 124875 +-32 49950 +fi=(123) +328 38250 +118 12750 ++2 25500 ++1 25500 +fi=(124) +-60 10250 +fi=(123) ++16 10250 +-39 30750 ++76 30750 +fi=(44) +219 10250 +fi=(123) +68 10250 ++20 10250 ++1 10250 +-21 10250 ++21 10250 +-51 10250 ++76 30750 +-46 10250 ++20 10250 ++1 10250 +-21 10250 ++21 20500 +fi=(127) +225 10250 ++3 20500 ++19 37500 +fi=(44) +102 18750 +fi=(34) +1142 37500 +0 18750 +1142 18750 +fi=(19) +2144 18750 +0 18750 +2144 18750 +fi=(127) +251 56250 +fi=(34) +1142 18750 +fi=(19) +2144 12500 +fi=(127) +251 37500 +fi=(34) +1142 12500 +fi=(127) +248 18750 ++7 18750 +fi=(125) +154 18750 +fi=(10) +1092 18750 +fi=(44) +219 2500 +fi=(123) +68 5000 ++20 2500 ++1 2500 +-51 7500 ++76 7500 +-46 2500 ++20 2500 ++1 2500 +-21 2500 ++21 2500 +-51 2500 ++76 7500 +-46 2500 ++20 2500 ++1 2500 +-21 2500 ++21 5000 +fi=(127) +225 2500 ++3 5000 +fi=(10) +1096 12500 +fi=(44) +102 12500 +fi=(150) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/slice/specialize.rs +-68 18750 +cob=(2) +cfi=(2) +cfn=(4966) +calls=9000 -34 +* 103400 +fi=(127) +236 6250 ++3 6250 +fi=(125) +-85 12500 +0 31250 +cfi=(38) +cfn=(5180) +calls=9000 89 +0 403500 +0 175000 +cfi=(38) +cfn=(5180) +calls=63000 89 +0 2609250 +fi=(27) +714 100000 ++1 50000 +fe=(120) +0 100000 +234 400000 +0 50000 +234 200000 + +fn=(6194) +302 300 ++9 125 +0 25 +324 100 +0 25 +fi=(14) +454 25 +fi=(59) +2454 75 +fe=(120) +325 75 +cfi=(45) +cfn=(6196) +calls=36 182 +* 950 +* 50 +fi=(50) +0 75 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 575 +fi=(41) +634 50 +fe=(120) +353 50 +0 25 +251 350 ++2 50 +-2 50 +fi=(27) +0 50 +fi=(14) +1663 25 +fi=(50) +180 25 +0 25 +fi=(41) +634 50 +fe=(120) +361 25 +fi=(23) +0 75 +fe=(120) +409 25 +cfi=(38) +cfn=(5180) +calls=36 89 +* 2600 +fi=(27) +0 50 +2177 50 +fi=(111) +0 25 +fe=(120) +410 50 ++3 75 +fi=(100) +124 100 +0 25 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 500 +fi=(14) +1663 25 +fi=(50) +180 25 +fe=(120) +434 125 ++33 50 ++21 200 +cfi=(122) +cfn=(6214) +calls=36 262 +* 2050 +* 25 +0 25 +fi=(27) +965 50 +fi=(111) +0 25 +fe=(120) +492 50 ++30 50 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 475 +fe=(120) +616 125 +0 25 +345 50 +fi=(44) +184 50 ++2 50 +fi=(41) +743 50 +0 50 +fi=(129) /home/bailey/github/PolyXML/crates/polyxml-core/src/value.rs +59 25 +fe=(120) +618 25 +fi=(41) +743 75 +fi=(27) +0 25 +fi=(41) +743 50 +fi=(33) +0 25 +fe=(120) +624 225 +0 50 +656 50 +fi=(33) +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 25075 +fi=(14) +1663 25000 +fi=(50) +180 25000 +fi=(28) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/alloc/src/boxed.rs +2415 25000 +fe=(120) +658 175000 +fi=(41) ++85 50000 +fi=(14) +454 25000 +fi=(41) +743 50000 +fi=(23) +0 25000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fi=(59) +2454 25000 +fe=(120) +714 200000 +cfn=(6195) ::write_model::<&mut alloc::vec::Vec>'2 +calls=36000 302 +* 72453100 +* 25000 +fi=(27) +2177 50000 +fi=(118) /rustc/b940084d7eb6a299eb4bfeb8e34901bc051e7ac4/library/core/src/iter/adapters/enumerate.rs +0 50 +fi=(14) +1663 50 +fi=(50) +180 25 +fi=(101) +350 50 +fe=(120) +756 175 +cfi=(122) +cfn=(6214) +calls=36 262 +* 2025 +fi=(27) +965 50 +fe=(120) +760 200 +0 25 +759 25 ++1 25 +fi=(18) ++87 50 +fi=(23) +0 25 +fi=(18) +847 75 +fe=(120) + +fn=(6195) +302 300000 ++9 125000 +0 25000 +324 100000 +0 25000 +fi=(14) +454 25000 +fi=(59) +2454 75000 +fe=(120) +325 75000 +cfi=(45) +cfn=(6196) +calls=36000 182 +* 950000 +* 50000 +fi=(50) +0 75000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 575000 +fi=(41) +634 150000 +fe=(120) +353 150000 +0 75000 +251 750000 +353 150000 +fi=(27) +0 150000 +fi=(14) +1663 75000 +fi=(50) +180 75000 +0 25000 +fi=(41) +634 50000 +fe=(120) +361 25000 +fi=(23) +0 75000 +fe=(120) +409 25000 +cfi=(38) +cfn=(5180) +calls=36000 89 +* 1475000 +fi=(27) +0 50000 +2177 50000 +fi=(111) +0 25000 +fe=(120) +410 50000 ++3 75000 +fi=(100) +124 100000 +0 25000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 550000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 100000 +fi=(14) +1663 50000 +fi=(50) +180 50000 +fe=(120) +434 375000 +0 25000 +345 50000 +fi=(44) +184 50000 ++2 50000 +fi=(41) +743 50000 +0 50000 +fi=(129) +59 25000 +fe=(120) +436 25000 +0 25000 +fi=(32) +611 25000 +fi=(33) +1865 25000 +fe=(120) +437 50000 +cfi=(38) +cfn=(5180) +calls=36000 89 +* 1225000 +fi=(27) +0 50000 +2177 50000 +0 25000 +fe=(120) +410 25000 ++28 25000 ++3 75000 +-3 25000 +0 25000 +443 100000 ++1 100000 +cfn=(6232) +calls=36000 216 +* 2805750 +* 125000 +295 25000 +-9 100000 +445 50000 +295 150000 +-9 75000 +fi=(101) ++64 25000 +fe=(120) ++96 175000 +cfi=(100) +cfn=(6244) +calls=36000 256 +* 16322000 +fi=(18) +847 125000 +fe=(120) +286 125000 +467 50000 ++21 200000 +cfi=(122) +cfn=(6214) +calls=36000 262 +* 2944050 +* 25000 +0 25000 +fi=(27) +965 50000 +fi=(111) +0 25000 +fe=(120) +492 50000 ++30 50000 +fi=(33) +1865 25000 +fi=(14) +1663 25000 +fi=(50) +180 25000 +0 475000 +fe=(120) +616 375000 +0 50000 +345 100000 +fi=(44) +184 100000 ++2 100000 +fi=(41) +743 100000 +0 100000 +fi=(129) +59 50000 +fe=(120) +618 50000 +fi=(41) +743 150000 +fi=(27) +0 50000 +fi=(41) +743 100000 +fi=(33) +0 50000 +fe=(120) +624 450000 +fi=(41) +0 100000 +fe=(120) +626 200000 ++1 200000 +cfn=(6232) +calls=72000 216 +* 8087575 +* 150000 +0 100000 +627 100000 +fi=(32) +-16 50000 +fi=(33) +1865 50000 +fe=(120) +628 250000 +cfn=(6284) ::validate_scalar +calls=72000 285 +* 1150000 +fi=(27) +2177 100000 +fi=(32) +611 50000 +fi=(33) +1865 50000 +fe=(120) +629 100000 +cfi=(38) +cfn=(5180) +calls=72000 89 +* 3075000 +fi=(27) +0 100000 +2177 100000 +0 50000 +fe=(120) +410 50000 +630 50000 +fi=(33) +0 50000 +fe=(120) +633 150000 ++4 400000 +cfi=(122) +cfn=(6214) +calls=72000 262 +* 4121050 +fi=(27) +965 100000 +fi=(107) +108 200000 +cfn=(6290) +calls=72000 +93 +* 5613050 +fi=(100) +564 250000 +fe=(120) ++80 200000 +cfi=(122) +cfn=(6214) +calls=72000 262 +* 3765775 +fi=(27) +965 100000 +fe=(120) +649 350000 +cfi=(122) +cfn=(6214) +calls=72000 262 +* 4068850 +fi=(27) +965 100000 +fe=(120) +653 50000 +fi=(18) +847 100000 +fi=(23) +0 50000 +fi=(18) +847 100000 +fi=(118) +0 150000 +fi=(14) +1663 150000 +fi=(50) +180 75000 +fi=(101) +350 50000 +fe=(120) +756 175000 +cfi=(122) +cfn=(6214) +calls=36000 262 +* 2025000 +fi=(27) +965 50000 +fe=(120) +760 200000 +0 25000 +759 25000 ++1 25000 +fi=(18) ++87 50000 +fi=(23) +0 25000 +fi=(18) +847 75000 +fe=(120) + +fn=(6284) +285 200000 ++10 50000 +-9 150000 ++9 200000 +-9 350000 ++13 50000 ++1 150000 + +fn=(6168) +87 225 ++1 100 +fi=(33) +-88 25 +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 150 +180 25 +fi=(14) +454 25 +fi=(59) +2454 50 +fe=(120) +0 25 +cfn=(6169) ::collect_namespaces'2 +calls=36 87 +0 3225 +0 25 +fi=(14) +1663 25 +fi=(50) +180 25 +fe=(120) +-86 50 ++5 225 +fi=(28) +2415 25 +fe=(120) +102 75 +fi=(14) +454 25 +fe=(120) +102 25 +0 25 +109 50 +0 50 +125 25 +cfi=(45) +cfn=(6178) +calls=36 +18 +* 1200 +fi=(33) +3101 25 ++25 50 +fe=(120) +126 25 +fi=(32) +425 50 +631 25 +fe=(120) +134 200 + +fn=(6169) +87 225 ++1 100 +fi=(33) +-88 25 +1865 25 +fi=(14) +1663 25 +fi=(50) +180 25 +0 150 +180 25 +fe=(120) +0 75 +fi=(14) +1663 75 +fi=(50) +180 75 +fe=(120) +-86 150 ++5 525 +-99 25 +109 50 +0 50 +125 25 +cfi=(45) +cfn=(6178) +calls=36 +18 +* 1200 +fi=(33) +3101 25 ++25 50 +fe=(120) +126 25 +fi=(32) +425 50 +631 25 +fe=(120) +134 200 + +ob=(1) /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 +fl=(1) ??? +fn=(0) 0x0000000000023340 +cob=(6) +cfi=(6) +cfn=(4126) +calls=1 0 +0 73268130 + +totals: 73268130 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/prototype-confirmation.tar.gz b/docs/benchmarks/data/2026-10-03/runtime-optimization/prototype-confirmation.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8342e60e51a5df7649586d63e9f0ff59b8a465b7 GIT binary patch literal 367345 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%0D7%;St6 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%0D7?j0>$Pj5hQb^*IP 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%0DZWN2pqIT7bOPJnhrJ@BlMYuoNAGE!{UPvWc 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
  • ~3>xF^LjhL}#dz%1n#wH3!&1BGYW0Cu~7 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%0DEf(>%2-gl0y=q8fjngBa};+nA%?0DzJsi2L;SRh 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%0A1I9gv7-aFoSmvKf>L!3d|#PJ+5}vwE-pY zUwJnVme-#_=-qMaJJu`^Q4|#^zJ>wdmMD5RrK+G_ z8os#=yq&ZhHqQYcwE@MmD_|>D_2K1hY)Ry2apwwn`QP&FnW{axOU+Lp+tPlbv48Dv zqb6D!=yXihg#a?x3{gQD^p$T;*OuB7A0#>y9UcKaXSGu5SV4%W+=~oj$2wpy%!B5- zy3+CkDDhd`|L;0>ksshJbNt$~@Y+L~*mnJqaq~a%{MiE_FThiiswnzO`ZnW6<2YR~ zsCN)xqItZ3OL0}$87K@c89Kuliw)U~W)p?JasIf#ZvLLpm?{V(m(~rZ$4{qAmthT$ zyq2obHAcn-SQMkD%{QYJIgoYU?Hf19t1FtIn`-nMCfiE5u4o>>(b-O>Vl_XssqIne z`tl-?iYnnl=zJM=>;ZO?M6BOhK`O37*1pC9vW6pA>JK)}2|xAMt<2r{Tm*#6q%>K<|!E7}#{A&`-o1K4qPKl}2GrT`vXmE9e^?9Pb)1!s)8=UNLDW{)DL*+y#Ze$3J z&$m-S1jtHwQ~r)s-h#4@GVBz)l_QtTl%nipg>6JdPyj^Fr829sg@auDh4 zwASLRf?(~u+Pq1U(`hJ()f}_b@EDSV<}Jc;OG@f@;NDdTmDNhVCctUg5p3z$lG>UEPk!@*nqmLUsA7n_d1UFKJ4p_Om&} zs4T`xocj*-&?b02U6zV2-;jND64$8M2$ys69tW$&wL(s>HHE4-=H=eZT;{L$!&~pJ z3_IKSsqJhMzGV!^Y2WNIdxgYQNQnykv)!n(;E-;hBrtPRXnUDt@7ibY zT4bmET2AqWnRP_7RZ#%TIh9v|$E;eQrSv}hB!Eb-;wg_WoP6iHXYl4={dh}3VCKo= zN{~RZH^vxx>~Y0b_u=cZf^29t%SZWUoWeiO<+>ux&yPVO7G!$$(7lZJ4kpYuK?p6@ z8B4d#*zBn-{3Kl+FrHtpMa?|}MYIuQ==k~Rx>%cBM8tmZwlzH|Y-Z2Z2JNz{Us9=*7K#~t;lNij6;J2jnk~?rjy4ht>zmed|=&e z^Mozv&#t9VL|$=7**y7(48W0|vo8$ZcLs5Tp~7FGTLOy3TXCyx!t%ukH{Nq@K1-hu z2YO@idu|f3)t0TN=5^Omjv@WN##8(nBQ36Qpi$SO4m_G-uiWaDrwoq6mI&%y7{DC|kh3pkD}UcV;5(S98pY;(r@ zN)3x;_e95ju=hf2+Izlo+886fhrHM)=Ivmq)h$k!f@&PsMms6@gpv>t9D&|}%kS@G zn*yA$Ftv&qa1a4QV{&6o5(}MD3>HVNGg)7|n(YO4n3w@ytHdz_n<_HPaC5!dR=ZyWk&8kGK%+S(0B~g0KLL{ z&9VezC1v_H52hLXg&uhDT+%lNb z-65}2;nfv`pRFn?%~3`0e=rD?jed_>?Ih2VbC$o^reZHz|GZ`R#13ju948djf8}|d z7YX*UKHh!Hpa8^xL8h(8MThW-S=Yc`V&G$~*BU7ho1^fw$pFo{>2V|n0Gxfgkj)-) z>uDQ28Sb{V-O(+^D5w5? zip2rKUWw}yiA=@sw5CZ5722Er?*F4h0KXCJ4~$v*U#@kzvqO(-pD%36o-x_H^J0yZ zMtBn#7cvLEBuwICfq!w4?0u-&hGDZEOAL*^djCJvdV!ZO5wzf=qxY-=hjT+mA@fn+ zjIrXUmRS|1IuG@<7Do`cJ&OV+r3hn;7Ov9~1k1xlKR^x^wvHH$G%x97N@}{#$xN|l zPT9-fJlK&9YvE$6(VIE*e^DY^o$9R+cpN8IhkTgu4%r3|A0IiAdeeK#t#n7#?59wLD(G@(_&-F`(_utsVncJjc2ib9eQko2l!=8#eqR=Y{ivEK^(HBf z7#$adL$+NE>JVx&SM!etz2-1-vl67CP0{9fl4y%&YB;6(EAiSzc+vE26}ed)l(R(Y zu6<)GrMX=vIMGi?bI32c?)>One@34@)hI4^EcT}+9lYDzD4*W&jlI(rB?rv@>TDq% zxhAA;OtsIss&Fq_T2Tt@l4bvqOe@Wj!{z@DH+&^@wyg=!O=1ix3*qtmeTP1GF7@;2 zHdYCl+`$BErGz11C}2M?+D`vhae2PQj2KN;&7$OQDw`rRLw>{WHADiz-HHE)WonC2 zHH@mxz4xa#tTb#KK_JrnIfR3R#3VrTnUQ5RCUro$LqE#_TSox(%a(V1DIOeVbiq8^;yqliQ6U6&i zZOKr*#>D^Qm{L_$iL*3?9>4kKT3*4HuP=5pR0uqm|8I`z)&`zIr8wdnTNJKfI4N%% zH?a#7joAU0B@v%1n$g~Pq5d6jV%>YiQcH$t+?B-al$ZykimuiEmZMkj8KXf>AEIul z1Q*k9v3*8995jqtqdrd6g0jPN#s&XUMM0 z-AFCZJ8@DH82;VNG9vX96OsWv?7m!#BktYP_*sQoC<82@dvHR~D2EE#eR+R6vTfAn^2ZEOW`W4v{hK8EE-cC@g| z{#OkqgA<{V@Gx;2U&6N9`ThQfetCIWkLzf5-+rMg#ak=yG*vGrU;E;*+^4UFM#4N^sFesI zB3e?K|i^O=paOku(0-c zUT}Dkb(U)r2$27egh^tAk;!|x-S*`griG!D(2{=;CkVF`_hj__J~O*Rk*-OR6>=)N z^!|m^_blH>72e(DV!sk};WPrcMpSm9#L}d`g&58E>cl}rXuW6(I{(ALge{hlHwxF` z_SA)I;#@>KO#WXSOqTOM!Q|dSXj!hbjuGz$k(AU^J|Tnk>VviN;6wi?q)rOxL?QVi z4JXZCTo~ALR(l@8Xls=$dVC>T((TZ}OJ-FPjj`GeCw<=*;1b=3(IfPZa)HQ97rCGn zhp5}1iZF<5-bkBA45rY%*^~m^;42?Pt8RU|ROrqcPd!JEF?q``&%wL=k~=* zz;qCvP|Ug>QnV)%tjwqm<~sysroQ(+RMqV5zM4-&FiVMZ)NPwsv@t!r$>HA$cxhx2 zz5@@0iE6^DKFQyfl77Z_K*@Ej{J#2buc#&pOMF2Lr%!=2H>n8Y%beW#SC5Mr(@Wl| z=EdDu9B6VF4X!i-8g7w8nYXz-pHVR?EJ0dB`40L7gU^614Zh7+ef%GTMJ!Z?3)AlU zZ&paVHcKQxbEpZ@f_o7ps*7(WY*oo8*kIdT=@$~6gNpNjcftZnS*Q>(&@4ocp4tW4_NQcV{k zym{LN*}Fx!m3BRTLL#v*_|yiitwWUSjDddnTly&`p0Dqak7msN`2P)3m=g2Rs*54u zv?dvN*kbEt{7_()A4614T+1o@$;LC`L8Y1_VEw($9S{{C`#@k_{dg4On18^2)B8LH zOIM#uiodlMpPZG38SN+upIuqdayKerH!p_wJzHVB@o14hr_@1P*K}ZpBz@LC?=uN; z$-EcY^Ua5taGoNr5`_W+A#&UA1oCne1F#}+-0waUzNudBc}U)?oTGMS3^LpYqD|H1 z`z@PY+CH zKu5=!sAu&l)6jgE*r(!uaS2(KCkGbZoZT}4dcJcv*22?ikpBluKgiPLRXwYf=mZ%w zren9~sPt*|)mZMz761MPTvI~7NBzI#!q)3s729kGBVn(vCTpmCCht_V`w>yIA8dvH z?{Zv}iIuq3z$s`c^&jZNC|fgqk|v3>XUG(xo!)OrwdNyA`)NfK8dth?udPtL)Fe|=x$$8M4Q37HJne{ zQMkxlETS);@~wax@R}ZO7MID?>tyig_1H!;LJ_v|gjB!W~^}|*v z+t0A;(->@Ho7XkUBs3|CR{Zbn1S1eA%sdVS7_V$%mXxyJqs ztY02o6KrVml3Y~w?d~8+$vW%s-rm20>FOpqh$=Du-ef{@(g#|)9sniSDq*f}u0=uL zQvNoLy6%qQ-5)}6U6^7t-fZP>U+EQY_^DRiNtXn^>2U25Q!?3IX}D`hCCep~CBO7+ zHethjz>>x5h+MF%co)9FY(kYI__)Eu6=&}giJk_)#ReuNdZ1Pixp z7_?$;kWuTePlZiEp_lKLuQ!V2bMAKW$}o2DieK$VSVln`;vEt>UR>|wQa{*; zh`sFAgTu&93bR6V3aUrPpO)BE!@sh2W+pJ%6@OYh_p%2{m}9|9hQ-2C_&k;v8XnIc z4VvArZm5bAeFdu4uJrB`MH|GjYdM1qMyGFLN6Cab(FG~pS{>tP)I#><#+<=Ot4ws! z4t|mcCRCI^cVWZHdN$>l)NF9PgOhHp*icmc58&evfXXf=pKi2u>u%T!}KRi_lt4zXQ0;DP5HlSi*hmh43a1SGrddV3Tt z>Xhg(dm66ZCWT6so?U>j5_2uev|_F}o%YonGEFa*&}|m-7_pu>nhfYxP&RS44|x;+ z>~>@v`n^GDOF%3S^NuDQb=WVTisK5^l$9W#I%@XmrRPd(zP)%D$4tK9Y^rpcbBxc=O?INIvCQZb={5XkP9> zrlS*s4(OQ*Ak$yQ_;rx;7K9FOswa}3J#+}3glm!F>y!5FbhkKW;d%`=n^is&(DeQ3mept%-s zY#j##AC|?Jxsr4MlrN=xb?Fqe0Sk5S{-LG!!~rRZvV+eg%jN9{^+vOZeGbF{7?$#Q zCHbhpDm%hhF#dA`dKAdHH7~(1r!YH|(D`>#ROPpJL7Vibad}vHs+`tT;8>sKZ3&Uy zSezJ+5q${lJpok09s$%mC~NZND4GLuh>PKCq86%U4xZ++C3?s4 ziGm(p;v+U?m6ycNh`?JLfEHdPm?BT`h=pSZKowH*CLl``4h9nM z{tW)x1*VTf%H>mV3TmcD&9B4VF;4>;r9>7s`AIS;Ir!IAj+2I>!kw35%vBC*t6Xjh%(vLB9%*zcbUx-V!4E(g z#R$%GFZlo{i$uCOV!y)c{>sJ_dmzG!j*cd?!l&grhh#_e?VD(E{UCVrim2@t47wcg z#DLmAyjCt^jP3G43w*3R!LQ-mR{bF7UEk}St;Ef5)sdAK>^<&zVB&M_d zug2LLPEYr}@M&hfXO;JL-CA1pwf7ew2jANACr!^cdA%~uFP$3}GMgRFv#n0=A*WLR zuz3{lTuY<)Sapi{ZB8t|Dt%kJoeI6SS_WOOvvJl))k zkg=G@R$njFc-0^fb!^ro^BOy7O`g|Urqgq?vcYNh5gmJwz&DV6mwL(ggJXq8Ghguq zRuo!9!)0&7tM|Q`@VZq6naf_6m*Q?OWWdT%mWHi=vBr83f=PKNKrxLn;jM#?3l zyY6H}n?v21XTV3%A((dL6kE2#SgXy=03gdv4@*Y8xzjl z9T~do%|^SU%#a1CUU)^?8Cta9UK`(!d~NmdSr+d8clJkJ`rjdJ61i(8B3?d5O9a{P z&gh4A>z+xTWhqRC-N3P-Y8<*k$Yq~~5deQvA$#+6TvNc<7?-VKLA6^DNzEOewPS}y zO`-I4Y5df=Vq@G~GCm}I=7kO$Ofy*4oFeFo8snvk90wn@WWT{4g+Yuke?SMNLNz*rpz zLGot%))ol_zn*A5bsxIo#jd%Y2F0pNETz-I+2?Mz#*5&N7TH;O64Q^}d6!V4?%737 zG8aRMLT4U#1#?e<3e@l7h3u8A{pQ zR{Lb^m@5oA|Jc><1$6S8#1H9h?5ATAo7DfXOCYU!yJIrg)2)eBc@imKwRJ)Wim&G* zjZ(cl2@V3jLr1kde8q7us6}b-JKMup0*M-nh@Bb=iL<6v+OXT=i$%h z?2`nFTnO_~eQ;K&zTUem%7kl=!={0he}y@I)W({2xR<<{O@K{7EhtlT#oU>O-dXXI zCv(yR7^TWw<8ypJv+_j?wQ97Bc~di;$ z!axp_X;k{~s-Fw#CZJ?;pMiMj>JRV+?mYHEo%`+^ffq*ua%$k(ty{UDAsXBwJQP1w z)(zb@u?AZ&pPX7g?}hAP5MvoKUr(D!42oFlthSBfc`bXYCAkaC@|?%rl)7GI3zLn) zh1F~1WY|v$nkJTV8S@XIDrR9UnCUa!#9UcpCwn6P5+8{axsz&pwe41GqU^E(x zAM;^Hfrte}A-zH8AplyQy(u@F5Y!daUuyGcTWnKfTuPdV=w8^iX3*_B`P5K^?MYLl zCNj-bRl%(G&AFuQcU;XmElHmta=JgNP za_VgRU0HalADdM9B9((}K7BKV^m$W~Tks7we<$=jeud}K_)|m|o#c3(SAmQYyBjD)(&A%G(q3JLM&!hj_%9+yje(wh z_+2dIxYLyvW?n6h@dok4;f6}~4bGx2X1Am-Wn99_>VaMTc~Qp_rdP>>uPG-pzj3N$bZ@iFr^1z?x2&IG1V$BcQ6KyT4Tm#RCO2Csvz`doK+?}BzrsHhJ6DcbXNTJN+I1k zOi(IwrieDs#y+w#QLo=qz9>@Y7PfdjxqB)y9&E3f)c4@7xri~d!PEK=gVey+$!Q?} zn~&Bl?C{1 z)DQcu!2P%|INZ})U7X{R*(oqs^dkA$`Q^Wm!wUD(+cI|<>{MMV8WRjkg|whC6Z^Sv zKbQ8`I6_^gaGDt0>0`DT>6p@76Ib;kb;Ml;(P-?nl5xc;n7X#ocH69fOlxkN=h@Cf z1C%F!7T^D~L~oDG>1mdHI`b&zuW+|NsSh4tioV5r=c|bV{-t;|r&;_b^3$zi9ySYy zueGP?iGX;^sSn*h37E1tJ#@}(CR;x4dNQt$3He6Pnig62Yvtd?zjSh{J++T17#)G4jvB@9$cJi0(}s<2`*CVrf{GVCwhz3g$DF>;YwQG^T>0saZ{$8I(5@tkp^n zA6tI5LNBBCO4y(f<3BLyW7jc)aZkQWi7)Fim70ewQkih~Fr7Xadk6y|txA0p^y3_g zn6;nme)w>vx#4j*vVbn8BuPyyKNj@;)Jtods|)V` zOY|jLx))6)b*UPs*af!w4IQ=8R88?2J+j!lc5%wN5m4*1A|X*c|8sYixuMuwu}Xql z%BYjhiJt_s7!O~GtVE$96u!#L6-m^G-q+?ff>UtYv~4gxi+nMuO!_Z4U@T>$Dva(R z8)3Q2J9q0aC%czofoOmeU)oh*rtOdY=*J_Db8gkO+f3!36@)~HA8{z)G2FH0Dpjl9 zuESW|^|%_p1Xxrlwl_Vndrj~$>kbm7X zjgx#XjJnR|4e{$0W`!(AWVrz$LIJPBm6C;qBwt86th24RnyE#xX@24)ZjBQ9mgS8ih4euseQSuD zypenQsMP1us*3kn-2`RF-2oT=N=K*Uc#oRGk_;jA5;=Y*crm>})yQDtt+Rd(5B_ay zd*-mp@vV}#G^4);^fjA)R2|S55LPfT*^7v9;~WH7?*@A3J`Rrf6>>Dk9rViNw9yn+ zY8v|R?M)yJ>dd^9C%?hAb_{7>DwDn}V=AR6rxPWQBg^deGUy|vvys$@;aiZknk4*k z?=WE#&b6B?FL(R=$$i`=9)mH{FOD)0E7(ViaxR5`&HbFwnv0M4;_9Df9Wtc0Cj17o z*xSUwa-UJp{Z5l1R622snqQ`hvt*kiORGuJR#;qLn~|=8C@*)Mn!*70UE%Duml;lH z$on@X;b5`f0fI^Q98yZ=_iN_zdhsOw-O^@jkIF#SZ4JdDCbXk49YUo~Hs7$nyl0vX z*hQ;B^oYc~|N7+=yfrlx4 z*l)|>_G2)ZlLgWKQOOYe^+e zl7_SBr8+*F9Lg(-O!H%Kqg41z_&@&OR4OF`RB-P8l&}mV`;F2lr%7?;UJ^5kCSKDv zviGl~q6v%S0hc`=BdZ^9LBaZq{L@K{$nPzCBSh~7KxgR>Af=a{2Qc|hJsCK{)wlt( zl2dCh(hGp`LW_y7fCb~4p8zKI68HoSUx%_Wu$%*&@hUGp8^iZvP{ff|M_rt?ppfri za@aN!VXd9tAzvm)Qnnrck(gq9AfqNbb*U8LV(1-20&-9yxN_XS$+DJSf1^N$k(O^0 zu)v^(hWBQQ#diI?68)JByleGK1p2=1p(aP)h_cTjwQ8V#_yh|Wm%eN9kJ@0n0th#e z33wNU{2-LWPfXo>>wTb%f-f!Rw0h!trQPOX72xzJq;-YD~*t)Py6^sq-@1UBUT99z*8F9>(F&{)em&cB@HGgVt~(0kjLJ3_-Lq?KCY35 zL>#hqKv0;zjFwQ=?q|IFbmrFlZdRL>ZUJ+g<3`P+Lp# zQ<^n?@IM&EL2^uzCNHCZk=SCvTH(kNz@-Brp^CHDjTKJ}x4vJP2$#H89GDm>&$aF| z{m?4@?}UCgbXn_N$PyAERiI7H2S5qzi~-mZIn=WH_k%76JlUXvaBy3vTcQj809+2w ze`jK09ALCJi&iMuI`GdHI)skcSIpamE7t~p@W=kZYIQ8=8(3wuH$rm4)GZV+Z1Ty_ zIKhO3&#($DQj(EviIxTEyB$bBZN9AeS-l5F!=BK?xHNac7Vz5{+PD@w1vLeUpL4y3<5kAZdg;%NdX z70XX1o7lw*b5c-e+wy}LlZuq7j)^30gcLmWmc@4U$6WGaqgjT2d;2KQz-hRd5 zf6tP1v_gNAMuM`|e&wYU{&WX?HY`qp{#j%`cVSbd;9A!5t}2>3ns`BJt~LjOM|DFu zsHl=MDkC)=_))~*ai@oi9foWK1lzoLHU*mL1qCzE(m@`1sv`jB9Uub?49nj?JOLt5 z`j^jc)ZdcV6yT7uWMDmP9!};5x*cPUpi#raJx$54JIC`al1Qy%-4X{%^%*W|rwjh? z60n6Syn8ZzE_1id{ez!Wt2hg&cjFPLQzBy5EYK&@3gi+$9~;a zkpsMOM$i~2UT%FcD1%X#W0K8a-+YL#9$b|FJi>P=HU7qCvEZB)?>1+D=C-9otkA{g z-jhUof_{~VIRXYT`IT4|6Hw;&`Ui3NIi$L+72`|=b`xHkjw3j3pr`Bq0MP*8^}jbX zVg-m=XR8z(3b$UY0w8pRKf5mg2AJIQ_O-=g9tyO$DnVkgf!#rX?^;y(|62r)4g&u? zmi}+m|EEz}|3C!bx&z7tlhZ**{&x}d%YFsmJ_lA-0n1|{|I5U5u;@lOQ#)|#6lhqS zamj1_XBP}*3%k-h2a~4_f_Y(J=Akt$u9&i8PHYLWqF)S5;-?RRWCMbSo_NbFm(~E> z3yaPC8xQ5vhQ0B7j8i2~b=n+l-th&D9P7>L_9Zcv_0dHY=vts#7dm;qA??Um z9MzSNPeN6*c#JKbE4jxwg`V8e$k>?n(=s#fvZov63f%j} zhESS?oeNrs*q-bfGq|a^woU$HfTPy!r?1Ulxq*5Er}zhA73z^3|1dEw+Y$aB@;?Kw z{tM%rl?9QP27$aZOho4jHLiPhBOZuE2Yp}UI^P1f@i zfkNMcE5J7h#vJ1_G(-h*>3sMWTgkcaru4=yBXp^~P4f)?F(T5`kM;zlBH^58maLG? z4UDHbMzqnW{18wyn5qzY*J_opyD~Eb)`ffg^vKT%9{7)(2v$5R3=wry1HZ> zHxEIF<=Y!vW&3dNFyCv?5#X}Xt-I+%I@ zt4`p>ys+{%^j8oW_~j!*+dF^^W7_97v!Ty@2e@qya5@j#jQtnRQAo%j&sa&c3+#Ts znuz#|!rKpwG|isBC`MfYu6Q~G60g!vKxaKQOwYmkR~TEqf(Q3@-R zxGjFmw0M)rmQwcK|L!6czHGX6Bpj?oO&|MM%36j>1snE0)dBu5A7D&@n9yjuUtYQa2#eE#RipMw+Z!uG z@t$R4+L=-`c<$>OCz=gr*apm_&P%Ow^=Lp6`?1(CH(PiVB@ypLhU;0I-AKBXDhP;k z&Tf8?T9v8S-IP^jhKt zT^LKQ5HEzAN8`+3;4B6(OhW*aAfUG(9XqrDLw(E8!tRc;PjE9lJpAq|n5^NU?p6Zo z75bUd?tpP0!tVORJM#9y(Fy~5$-BdJ;y}Rj<|7%An7Z?Td4e79FW~20hm^8}uNPTv z(&_s|g0~RNk73Gpp`&l{l=faBW!QgZ)4gGgzcKs#f zCM~U2;A-i`_2HXcLos|I>5!4^01xWT$1OA2k8H4Fd#*wB4DhQ~eajyyU;*7-J?}#q zq@BE#WV7|(uniLL`a$e(?7HGIsrSH#@Ss?!nSXeIoP@!>{M+)WhWyL10CGuMA9BOb z6?4`M#=r}vT5K7)&PkksI~`W&83GMc^6+v@G!KE|G1r=9u5-*otrH_D1ZOD)Rd!_> z{H}7o<8k7eW^V3?ZhP7(72f&k`@#=UQ}L%O|B}nePl?$Pg{z%bAGvph9QxNLj$D%` z&d5h4@Imbh3x~ZmT_G|ortCVBGnob8X`cu!T%KRR8wtwR=7_+E3PK0xgjGw;IyR&X zW}7KtqMET{mLBdN0QD0!Ix-8lDNVyJy{jVc11UY3ob?+RlK@To64UdYR;YmIF#}q~ zo+TEM>2+SM1z;io-X&NdJOXB#5d_nr<(H*IV* z@E`8kAeGNsqWX9Z5eWWfC%$y4?He@d)e!}!0sBYkNWCC=*sCQ9z)40-5{k2OY1)k~ z^g`I%5bhq(gAaE2^ql>(J0areg%obAM((bwC5$7^Uxj+}5@Ym{K>g81LV0Z?oIAq` zwU{u(cG$%1K3k^?@YL-}AS-wrJa{Eo>Zk+!o}rH=?dUy#<0D9creym;#6ac|loJAZ z!LJzs)-QmAHN`jT!7%qVNCmQq4LlA4!v8--I&8pe-thlg{l6PoBV*7(FCzfI9UvRr z^S_HwhH6`2sS&8?0Tf)5eZPPG+u6VC$dz{xcT!QDckGVAS8NDo1%{&h1w0r#tE~_79XHr>4Gr1b^#( zouGy+1PI9rj#nT3fk`gTyr1@|?7;YK$Wsw)@ZKIFKXYws)>MJ(kp5J=_=APdP;Qy0~k; zzNSo$pL1Xxdp1#!qSQ3CmBK`Co>juluB^x?%#adG_9BL>*IPquiUY!__5#{%5Qlc(61d&2)I_V8( zkJAC#h=8o4_{|rCIu3B&I7RL$Y9#f#)zWw14=txpQ@GBaXvPG&^rvyXGJg zzHB!a@A|oAM8N+ab<4Oz=Wu9YX^*rh$bR)i);uOq3QYMLz`Q#}ewG#og1Qfa9lNH6 z;?Org{HWgC_qXADJYSrTk>Bgh<}NV1#G}?%ce80Rsu94Lt252;c;$NTdyW|6gI?4Q zgtx_(9)Cb1+i33@B0d*ZD7cgtDy~XNA&+fKQ+d(Dy?e4~TB(m)GgiO~7!+vEiATph zxIb|-OCc>oTR8CK^Q(W(G^#%lqTd$`4xa+gVB-!^{^Fg{ep$WQ zqKdrSM%Qy8uU9jRcIj!m_A+bJAv1Tn`*_yunEbn-bsA>1Z5RCy#U!xoRp~$KYudGz zDXa{g4=4q?%Eo+}Wo^QjiM}`{*v}1i%H6t<_E+gvigL`E8J645`<)~`oLdfeX!~7Q z+7-omT)D^4dT9wljNdKT@*kPVx(o|Tc(%D3F#yA)m0j0Do`H)UyM*`8wp~#xIw?eS zFCUN&)Xe4r=exhzDC81Pb>6JFEEPo;Z?7PK(ELa;m4tH5mqmKuyj!6C{MRjSu+5tf=1;dV>E>K zOzpdNl{>14{O`pTqi|n2LAoT3blssJ{(sShIsJcV85OO$tRu{rb^86NBU!JJEDXoJ z@4lKsE~UqsH-D`-=E`>wAyAj@c{-BHt5Rw@)wS^kO_>;-$#pTKYV%kI2(ov&Y|^*c&!nC#^jW+_NTKMEl_g6ea#BhEE zylqK*4V=bhh>tN7`@JO|t0btc$crj2uRGWBDY|(lG3(~m%o>phPaTg~_&;rj#u4dN z$&7IJe?+fxhq)7XAiXEP`Ou3igjfEfKLkDw(ZwmkL|FHI!L2)!}zb78tB}jq=4-#Ag1Hs)PI0SbH0fG+h9wg`lcSvw2 zL4&)yyE_ciJNNxQ@7Z&9&)H8~#RsUNrn;-I>FT+De~HXB>36q_!#23AKsO;z%B2;O z>g070oz`>hPv=$W@G4FUB$KNGIf(jxu&W1^+9O7qRzBvEx|F9JWXg<1EY}mKdMDBk z2E1Fv(YLL;;F<`d^y=7eo@>0zH4aALB{ZF=T^a5tsKtKX;VlhZrLSdckHt2SqwQ%R z-MA*rX_KdNoH8cd%*brr{%^oecFu*_tJOW#6JZf5UJ?T zrmv>@tD{(Ye#3Z|ux$~Ltt>!@BkP{Sl#eTWgmy?Mx%hk(;*m~|VPQY>&EI9Yqksvr zbJ+XrydP1ZSoYyAG~8haO5_BYsUeLiNV_WB8LQ*|zKaVl!^e?mQGe2buOjs5&L!k# zD1Dfl7Es&!;X2bAu`jzQ$7?R9QHLi45<*eBb-~>W87P>W_2*wG$kKwWe!VUS#m5?y zuCtl>8Ci&F$k`sKakItETQGblT4uE`{A7r|fsdmXdXE&Q_vc9AX7?92F|}}V87$$O zf_H$P+h#>d0W!lBtRgMM!+U=?Q&m{eI^ZQ@S95B>Y^%I=9d4f6Zoqp(=DmeoX3rI0 z&f}EQxkOadjDYZFa7XMiVJ9_r@Pdy;z;kj zFAW#+jXCKbrjl?|6*aE*#E?Kfr?D$=swTquY@QwXXV9)C+a6h_sS0Z@P?$r|Ts?WC-2;aTsf~D--l0}Nyv(U}?bO6>h z@J_O`C9u?jxJ5*Bj}!v@dj`SNn)LWsD<7BXz^CVv%pJJUgsHdP;K?}v-CrUfqWlC} z8-&YhrQRRxdRY1PSq1Fu|4A>fm1VS&xub@!f|91pPc_Y^|CqmX`zg5LXv%Dk`+6un ze}T~ZttS2aAM?;QQ3ei#!M0y7;%{R1JGz#T5G&t*bx3IR*!YzzpLFUP(3WdO9Grk4 zAm%PZh3P`5)VdfUsLezC3q+FJTPk#B^nFIGg7pF+;&FVn zMHIwD?-5*7?36%{&=H%JRc2MBrQV-v%60AHXSqT)?&d}Ft8U3jaF?Xe$-~R{WYcZD z7jd&He8L;+%~EGvj~sTpyeDZQzEve|lAv`zeKgUpRTs;`YpG*T-Fsn!)cOcx=?P1F zt^QKah*oOqWT~3Cs0m@ax%spR)dKiG{CPC^k$92)n8nL1Q*2Q~UZW?hVwEqxeMyO) zaLVjViFiFN9^kziV)f%~9erRnwTD7GDDW|J8{^JYiAxy1TGF$o(M^lvq{H1gyXi6{vj2&mJN zjN+&qo!efe!4GM;oAaXpM`3GSffbALalAr0Kl>kfrtw?RQqjWmZQBUMq~eU)h?fvA zq8=N4&7+TYpGalO19pPG-x0iPR#w)Fu_qwVG_tcXD2b1WI8Yhx+Q4{4#Isa`k*PoB zZaoaB-aB`}i^iGEx_$^7Mjk-J?>2VDpaLHUR!ao)p`4SvfUM*E)jFD(kF{$_v;Jf|W?IG7$0Pyjt;aB*6;yEOd9Y!P* zw*j(M!W!K-NFaa~JA}96Gska&*bI(QON7IKFC~bDG`$ECXi!<|8x+J`nF|O>L+_7S zYz-Qy?D1i2fSva`J}}WR6wnz$)eA;vr}W)9M(8Af+0(F!rqSQyoeUZH+J@aHoI^fW z40Oh?dEcu(R{1W*Y=B;yisgt1NU7|5UTa`g4x``ZIT5sl>S*8+yx9Obd9j)HT|i9P z#gpwKXyn}roe=3zoy_mgY%uq|c!_3$#DeWxSb~7}BP1X9kJO>EYv&UAeXgnV@&x9u zktX3fVX@^O%I}@17@RJs#b2=}$M2OiMiBYaU2nnFz2gz35oQgzfGu3fTE!R!P@qVo z{q9lA+b=-Ll`4m0p+63z!i#Uod%^6R+rsnkwGws9VpqXxFkt%ifM*ZBWkLu_BFO3$ zvDgb_+uvHWS_cqHD`A>L!Wd}zNp_1q!QtCy7X2m{);Iu( z^}~SDVNCQ^Cu!6~+y|%AZg9@`FBWh4)wE`_0;udE^zm>#_J^OcXPFX@A;7wA2DCH{ z4X$DyV?Mq>`qf6+4OVD4iZ{efB$`GNCjCKzzy&9k@qG64znQ$z@h7YXFLV%KuGj!e zv3^9U?E0%mWv>}Jxt(zP1YV~SLL70b($HLD!&bS{7*GRj&$duE-n?Pu5rV#UL~R5F zC-0D!tgQqC`{mYW{e@b140LugTg~EzpC`Ib^3|1rW*xVDNFM22L7m$_Suy6+ZZX zk@Dcu?}~1)KQ<8BgDmA1?#wp0RPV(mPy?HL@ikl;8AjBimr-zq1OK37V42i;@6GQ& zLTt&<3HVQLA*Yo9`5Z>c#0`iIsi%OwsQV{;&y|8a^mA%;PMt=)B?28e_wS<#8(P9>zKw=czO;^yT-ut35r)t!2;0-;pfRaV>Sj_qmEWFvC;DlIwvKgpUs@=BTC+LY z*|8ov^IutJ2-DiEsy?^RF?x~lzzMgv__zD;jd#QR>)Rea)!I4T-Fufimx{~nt)U|U zPU@pc=SNt1lFnd2_D0kn7Wc*khw%P_^H1k!QrJTyiA^R!yrkr+A%NQ(K5kNWv%*(+ z`H${j+THo=GCJt-NDsb`y%D%t5=S*M(w%l7D^HlRB>WnX=>USA4~g8(6ptnCK^knq zz8A++uMY$xQ)f;T9 z^)3gB9S3_pf+&fk-5P=4#8?IpfYBAAc1BF*cPvo(&V0-q*-l@2w=RhOnDDbbyFElBpDSqL@nHB;* zRFjFuOPtoPlbnpt;s@Ll3Ha_;@*Yr|yOH{)48wWx&PL)opP7Wo%KEC% zu4}O;$A$rps0bP98n#IX9K(-zwpIN#_jl`;RRGe1_8V&6Tyr;gl1d@@7wQ_BAft)cW;3sARVUp~nB3AI`-u zHyUa;#?$23n@G{FxC-NYEimgs%T;C*#M*95y5RmZ@o%nTs;`u_Fum1tt_P%SR^R{S z=tJX7uX8!{^hob=;pTH-$<~-l1iFa--JRa$QrW0!jZY%_%90FoY%z_bzpg{lYi+;T zgM$|)VZYHv^Gek&ucPgL8CT_ut`jcRNt%uq3Yqx&h0X@9gSC5iEUmF~#Ozfnuogmz zIf&4GmkVYs9}i;6LIqESiOnj+lMxK{WA7uij)J~$&^EfS7j%?V9jSIxiahUUX>GZx z_4OSY8HY{Fi6-c)a^fzN7%{b07|RL}D3HhiWsA#|q!=lumo*iCjl%7Go7m>wKK!Kk z)s#JpGUd(tYZm%inW4hwjUw>cnOpI60?5_wk^X$7?NVRJ&$787w>ezNx&&QzVMV@2rb$ z)I82xvkkSFTewvw?B736TM8WC$w)XOK&_TpChF}|`hsJ9!i(nmPK{r2TB7XrDDZAF zs#3IpjCjtDyYmGu?fFJos`z4x=eJ5EM51SwU?EsV5-y_b6CbM4RWPXyWFADxaLgY*5MDg2L=C=l z@}Fm%$6GF8wymGP%TrFO-3I7h9@-0L1RBTB#vmblEiyyxM8Cs3BBOdCM9M0;#P8$( zrftSkAhulIxn`*xGv^921N!E7_5ew+^R-Tyq z!@rSmnh5QzjPl`j?jJkaQ5oo~S;dKn2fWiAUTD5FgYbu@*XI|+8f5&ryD+&c@`HU* zT>30lv;g@VVk|&>u2Lf@da$zDO7bP^!*8Qx0q)!2_U>pApShSXZ>GOFVP=GZ7v-!t zZ7@pTAH}y(6ybLX4EQF7EEZMzEeiy^nG|@Py@KA7n(J7p(w%yy(ykz8_^Xg?@ z^htskC}t^KOP%U2ye58NcgJ!PGM6d6`p7Aa+75gYBz@*iC+b$CZjJqq{-@z+8KeD` ztn(FNVX>Tr4Q$`_rKmxqC+^H2nPoh_mV@PP=`i*TtfJl5CI7f-R=HYlgyr(<<^OTh zto-YyvGR81>uiolt|xK|m=`Y0MJB#|hrLrw)=qPN$b}9?dj3`kQ`+26xir@pE4QED zE0!>5ArMe(L5yOOyE&++?LE>#GJ}d%u9mKOu-=IVPTU>dbSU8J)Q*-zhyrlQLTQv+ zi-(-?MU5wpVZEU6t^B=0F-Uc=q`o$|GqZZVyh}}9>{0SzVwC6Esv4x2%o>n;qGhwZIlwi@P)_9V^3We5ka+PlAO^Z!UKF~&1gX(@JsVLeERTa@EYxk zr{JNE{-<6o_7pkfxLO(TUi{;G2A3c~Zh`n?z`9R)4GgacFMR?qGX1Z@yr|ZIv4fDs z?q?vV+!g?qn#AN_TRXlue|?P@?gd(x-a6NewEeBB1`FPEuh%-<+;IC{N?eBHL~^9w zTmLF0Wso@CVf}AM%@s~i`1L^Jj9sh^p|PH**X2%Hquzz`t^3W4u4;>R^zqK6*DpiM zBd?2*shoSwoJ%c`UyboDInR0uBui~X;>%5^S7(`p*=~iDvqFTF`&SKU$@kulMJ5N?>wPqtNth13Wgzpq zy_S#64g5mZ`##_|Cj|fMQ2FBX&6nHl@(YSta)oU6!S=;St>WY1dba&B~fm$9toT@TS zGV%54eRW+`joiXsrlrRZ?YBFp!=aw_gz09|#M8%#Q9C6fXUv<4 zQFb7!wVO(7q)TW-aMVzq}aEAR_1-m=9sD%o;I8(OLz zDrFL7T+96*>^zHx)6(klXjsWu*4jq7Lfn;F+N3IEGidv0Eatt#a%3Bnb{qK)J{ zO8>F*7|#CGqgsKGcOP(lHrehN#a7Df;ey8_)hZCD9&lGHIGz1Md6qceUmU_@FspoP z%kEjFWjH6K#j|Ir{)ZO}mBC~ArM5&jgKR9%_gF$Y847=ewDybtn0aDeR&#e}*Ze#w zY*>~1$ISC(6_TJp=CzBe)XMIcO=h_ht*=e)0MfO5MmTW{j(#5hQ+T-?sD5%;v5Okh zPQdrxL0#`9r4>4H3oFudr9yYL&LVFt7tR=?_`T%1TV-6sppPgmUsoNg5SI20{nTcOaa*0FMb& z)ngp-L$)Xa(yB*MiE_H6E4HqX-at(L@~VChVGz9&vwCe!1wNAA0qPjlm?)cX6(%*7 za^`JuE~!=0R))t@4K9S4ZW*-C;SXD6&9N`$8PUr&&`cwtGPccXL?18L|E+5glvc$p zZA_eQ9TkCrZ&6yop=6|+UtdU3XKK07B-K*upI%vZ`L*5CS=4)^mQ?_WfEGV=R4`0y zBesf!xb`~bFMF3K+6tdgxqFV#cS23#u8#-Fv}j2a8P2qQM_Mf@Ue^@)-3ntNl~M-` zcV3nSm+mQPZNu6-3XI&B4>`EL^p-_UA8BZkSikA*_VM|McKW4Pn!LUuISHQ$Z;&nA z3e*k|@=GJ`I@P0Izrp!1H@T9K+u2?0F~*|$h@~7}v>)GgtNU@p7S@K?18ZRIqNX%G z|9S3NpipiZcwtzP`YFP0zB!m&uzj!#wk>r0X8I=`W+s)9Hc~r{KTrLLLRwnt)dzT2 z54n?VJ*AQLv_v7>i5w%Jb98XPywx!{zKq;opNaGQkA(+-`;D zsG+5NK@_n8lsR10Ml4DjD2DOLZNp`G99KyMjb~p4=jQrtP%~X!xa#RO{dY0Dq`Uq< zoIn$1j^yevR++u>?&j2dlI6^7;h(6v#$!tZH5H!r&)uKC`GHk~kB#4}onNV{nkLxA znx$j?la%zaBNaOko|Ht!-;Izkx{#6UiXefgan5DUFal3>A#%Y$PHqcXXWdF<2f3APYW zYvPAe(V=yLTJCSmO>Qq+Qi&ITdwV6$MPz-KIv-`zrnyB`(WD?~t@voMTXP{}0Gfj? zIDGv-T7r~&z|Gg8>K{r738Z%mM@>@-$GC03GfD2nX+70>H)zD0Xs)y4sItZk^C~6R zG;h`qAhs#xVD$XWB0=?3QyH*V;b~4yJv3y95T(_a@_Sl-$QYjky*(}Wj?h3;4->ol z{gx^a(TL<+;P*nP`TpmwvDuHRn;sExiO6;p}G2vnyHnwgz9sEsBN#Kosv(GZXol`S8ZcC8vEiK{%|d3V#n}C zj=io>=AQ+Z@cybO?e%a!(d2lpUgRxSHeCt0ya6wqEoa%Pb{C z^Ib|6?+?mPmb{Ta7L-v4Dx~gW1%5X`#}2mgi4GV3ih5ffDYyxG^*oN!saT|Y7>c{O zWq4T0OgE6CeyOQwD`dbcRgV1?u`fiX678CK71rlrLV^~zyBuYVS%~P6g?seA?h+$5 zoR1`FXqg#po1UF6%upl2j6jUu?!&mnx>XF^7lbZ%BBan*Hmmg*>=IYFHAVXB1NEmp z^iOfTW?bvRsUmk&rN93QFboBx*CgrIyw%d14r2~rU{g#VcpJX)_o{6e^92HGV})A| zn>I1}U;q*L&>c1pf4qSkgig)?jZ$qxnn6EncaN4)&z08yA+yH&S7y!leWLx@qzCv@ zkOP-t4@%Rpw6-gW!Fq(t{}++9{%b7H8fSGc;o=*;%bmyYo1zw$Z)4?|JBQ(8wP)4? zkFCd~oYNzFd!6vR_-`f4%QefJ6EG8cY}alL=Najc!N-gT(D}Zuygc>H7}?EbIm!v( zUZ2~IzZV@6_rnDA;PxbaCG5NBp5FGgxvkWg*J!-u?DTknOlUJIO<>_L^CtQ%wcNQX zO|RL1f{J~dN*|gh)N=pi9(g&jdVXU`mo)PEn-LRP-m@53RPmz*`>9hG9*UKeUyzA? zltMYmpAjoQP9%EF6A57GbF=)SDsv(g_>z3Hso<3iaU@OCZ=Xz7znZx&=+Dq*pA%9i zmEFSKh4{84XUV1%!>oCI+S>)yP3bAJ?i0uuZi`1~i)7JU`_kyEFC|apo+X4YUJbtW zDHh?)diD5Yb^C~g>;Az|6AJ1Dp6{v0Q~svLl6h0?!i6O!P-f5ys+YX;G+7)Rp*Oaz5#8!%9oeGJA#M_LDijrKdS4F6F>Wpv?9Cvlm6}?vrv$+ z98U%S&hb9}e*vdg>X5Bp!4e|A4py^^zaJR|M?B%$*66TyqaqEQra5GwRjV>!-60vs zUeFO&6deROgoD0{72MIoKqT{(%&20+A6^7jVGlRIgMn-v`e~Tqa#kTUN-XG6Rwe-q z#1Z0{!vjx|8Ev*(Bl9>n47+o`>wu@>?0q0=&S8k_M+DPc0OZA#Fp%YoGa{f>{lx7A z?&A@~!;Y9NSjNUcN(>`Y;YAugfWQ4-vNMX>BK#LlBw1QZ+Ax&B@mJN7^a^?6)H`s= zdSpTnsbr8iQ4PKkDcnvKU#BOxlP#kf&r@=xqQGjazQhb)$Mv>iOu`&qRzh5+SwOpG)*R+7%_y*%8vQW+9ery(6;QQHUX@jFZmGl0LSI&c zpTY|srh+@9R7RPa(ZPi}$(zmsc?PB3cZ#r@bXM%PqU|NDl# zdFA@`B$xF7;FVLMUrd5)1mN4MGzu@ZB^uYHhu*o;8Q~Pgk7xAkZ@pEuV9pU z0^}&dUyGj+;7exv9~d%X*ETn3*OdQ=M)i-j$RV-e_HU@U@3{1)g8d(*^~3XoqMSLnxsC(5YF zIcnt6XPr1i*D_BEz(vja@TZD&<9dbf`x5*WvA zb;>BPKx){%W7k2p%EzwPw!!Ol=u7;sTv{J^Dy{0i0WqMWvRzB>p&+aUAMrw&UXue0 zxPTs`*Ke@HzZ+~g33bDXs$sdZf&-Gsb|J<3_aQbRK#T)*EuwewHUH6SgHsc14+)ls z+CjQ_Tn%`w{FY2nc-I4#Gpvtfd-vNo1Sr^H7rc^*TL(q{4M9O)eEBX6C^#YA!#9Lq z!2@B$3=O!tTZ8vrwb1)}Xc0FrRtQSx{r)5M9S)5COE(;usN;0x&!p4Bj<#A6{pq25 zhT&t^g0OEzUL4T|(l7tHO;4RqvBXx27 z)3M;_;wH!@C4#OM7szer`($Syw*?wOHOs%y?!pBm6bltoDAOieKa=C3@a5z$RJv+Z zP#eT9ZG!6b1}#u(9p?ZS#GCW{`!R1UdU|O4{aAVO5c;N;K~JeWW@yA_CmMr3dyp9% z39HE#sdISZ!OY9_+TX_kg7s+;rVa4$BA<7j)G+#MDH}i#7F?^^P7IgrTaz|~J~6|v zJYp&9$YLhoC%DOI!?xrcjSOW9$|4YRr%PSM1zeGjM$O@d$qYo(Slp=)SLj?(IKL~? zI*6usy7^@spNNpY`dXC;E)@7DxoWN-oH0NQgtzCABCLh~GYV@Iu&pS*duL(bsnQT{ z6|l_|{m!jz7Xje^I42GMQxsDP@FA#Pll}F+kN1pk7G8d>@C3@Nm+ffuo;3ibUNvd$ z;)_ngRM(CH3zvLk7n%F9eY7lsIto)xe}qvq1UM;w*P<-3pboWOMExL4V*dpwPHa>D zv+(CK2lrgX{ahuk3P1$vSkTA%&rO^GMmPlBifSASf8xOa1`xPjWyje5^8$E}#t)NU z$oVd9l4A*eD{yQC&A?gvTG$M&KBWO*UL>tDZD4)`9&TI`LCo*J1M?H%)V0BV9$5tJ zZJM8((B$F7${97_M)tx4y+RVx?t3UL;*90Q?{jomaM|K?xvNE^0g(T9>A~j~YzODT z^cpoJv*=QeWhbIX;3%PV5uf~ya6Hy(y?$e>@33~@gj|yL5}7-UNEzO{ zsfu##)Oss&4iLdI&)3eOc!~zqjQ@bo;*HMT;HR0#kxRiizy^{iEC?V=kF_h>G^#1*&cXD8~LW}ahhEz38>SZ?6Mkd%A9~frf?aEYSgd0qFvACHt*VMR`PJTPY_X=baavoQ^ZrjJ&YrECVefzA zt3vu74o)!CG1TPh*c*mNd>nncS8j4<%s{s?^gq(7T;7taml+$QRSoh@9tg5piy}?k z3MAT&QYf722BY{x6&0<3Iq|>+%({_?em{+My`dJ&TqbHNezr0npEQ$@slgnAEBlb~ zc1thEn&*4TyscQS7LVZyOZQfZRZ$3F2`*pBu0~vEh=^*)!Aw8lld3YwVzjE&sNf@+2Z?wQS z7I$l@1=lkyqH}ehrtEbo=`3SC;Zat1-EoIr$>l9aDhl}R3+ftoO-yRuq)V0OaV^L)_$_gS6-*iVMbCrs?KM#oXA)=;Y(7G=SNt_({bYhV=FVA z<+5t?e9C4>G9dbW@TgPVpG5w(U9-a8QTe82gB@YqJ|jwLbH~S3EwWz4f>gDq>a@8v zo%S?5AG12fYuHbW@OpI5q(h2^V#w1!Q0QXxaF7Ul_!G|>)aBPA-^T)*Cmf~7_?X{C z|5L6N`7J6vE=g5HFLx{M*8b)KzaBTu%6U}GLpTL$nYuk`hIt{Uzv2tik)*MzG_0lq zP`7>;)AQ+B?RKMfw%NzKW#W~kmg>Hkx^SwK`?#f4==#w5g{gcCGB>60X)(|IApgqx zyOwKHs;Y5rd}wu9Q(MTYjzD83b&lARog(KdRr{B8eA|b(<)SKgG8yjYecm6=;GZC2C1ENO|IAeas6dT|XRo4IS$ zmIz!sgIzyux2Ao$o^tfjm}}646kYXN$s4ZIw_O=gn}pT}MxStA3p`Y63TLT=tVo;E z{%KV{@vyyVmz+vA7}1Z1iwy1aac}a=3vNmSWnQa#{#x#*HuCc>OQrkTZr6uqhcBag zWI?S7%DgiVb6C#u;5S`1xhY3AP=43#k#L3+m~$I{e{{N7udtQgHv*orH}|ZLOXDUy z?StbVm@4xtmPb7K(j(=(k|HVIe|9ku+Fx019nW)pLwq19&TpYeb z_mr|W^CDC@8J%cQ>k_S=|MMT6v9ySqGaaoym#c36KmKq!DPP{(f#sN##Q>0*shV_8 zU|)OJS#3XWq=u0!%Yuv!g12b;KUmrp51**DAZ~CF1z9$!#6h2Kv2Yq0x`ar_L>4V9u=uwytdj}@T{mIMbQRV7a=Li%AeygE^G7zy5)E^>Erur-}t(ey_8y_?U)7Up_qVO{;; zcBO`H=9o&=%&y_ZiwT*xBR}Cm!9M4JYGWPemic7C-xw7E^nc(F|G)63E|ad)$VGtr zFt`v7e-!6pT>l6Bd1=LIh*5e>>$4dVevXq(PhpqYkm|a2ohY~F@P(9~W@fbilmU7e z@*xp8WIXej@$xVY;%Eqdfc{s6+6kT|wdcst(5%V`-6fD>w5I*63$Hv+8!(J|B}}<3 z@~0Mp_(Vb z=6OYurS+0=Ko-mlT5K*@J0`1tMQgAE{_2z)+|T2yWC(BppPiW;ByY++W?`EPqBvgH zv2X)i#=GzTdf{FSzq~&0Gsxm@I*aXwekk$zglR_I?Xjm~UutvS4Ra#PQdP1SY&{od zh@38r4Wm}ewn{B@#TStV%T*dzD>-u=e8^CJYRkBh)hKl;JDi*HpO$SZdS07?oh3f6 z^}&5O7k*7Di-7X?n@oW*xaHg#+H-~slN}lUpYzj@jwoRxr~E^i4m_MSM@R5r+Awfx zWruN*DjW*^q@Cy`1m5yX9UF$#XJ|r;ca0hceY63(69x(v*Pf6@nCR?drPm% zt>)H?0n1pBF@n>l4w~GJn0xmy6ql+?V!k@CxX?0MI8;BHqS0Js;q-Br%0D%Uq=JLn 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%0Al@$k}rG-2BsUP>si`F2|se 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

  • ?880$u9bk%_jL{F2r#TKu_(p!Y9_mWkwHQw}9 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۫W-zfMgp{BeF3DmZyrONj9@4)%x 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%0A=w>x4f^zVdcF*6(yPQ4kQx*R^F4 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ɀlE_@T)#4&cD*gK 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 (Arc, Vec) { + let scalar = match kind { + "enum" => ScalarType::Enum((0..16).map(|i| format!("STATE{i}")).collect()), + "pattern" => ScalarType::Pattern( + Box::new(ScalarType::String), + vec!["[A-Z]{3}[0-9]{3}".into()], + ), + "restricted" => ScalarType::Restricted( + Box::new(ScalarType::String), + Box::new(RestrictionFacets { + patterns: vec!["[A-Z]{3}[0-9]{3}".into()], + length: Some(6), + ..Default::default() + }), + ), + "list" => ScalarType::List(Box::new(ScalarType::Int)), + "content" => ScalarType::String, + _ => unreachable!(), + }; + let mut builder = ModelSchema::builder("Root").field(FieldSchema::new( + "values", + b"Value", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Scalar(scalar))), + )); + if kind == "content" { + builder = builder + .content_pattern(polyxml::schema::compile_content_pattern("(?:Value;)*").unwrap()); + } + let schema = builder.build(); + let mut xml = String::from(""); + for i in 0..count { + let value = match kind { + "enum" => format!("STATE{}", i % 16), + "pattern" | "restricted" => format!("ABC{:03}", i % 1000), + "list" => format!("{i} {} -1", i + 1), + _ => format!("record-{i}"), + }; + xml.push_str(&format!("{value}")); + } + xml.push_str(""); + let value = deserialize(xml.as_bytes(), Arc::clone(&schema)).unwrap(); + let values = value.get("values").unwrap().as_list().unwrap(); + assert_eq!(values.len(), count); + for (i, value) in values.iter().enumerate() { + match kind { + "enum" => assert_eq!(value.as_str(), Some(format!("STATE{}", i % 16).as_str())), + "pattern" | "restricted" => { + assert_eq!(value.as_str(), Some(format!("ABC{:03}", i % 1000).as_str())) + } + "list" => assert_eq!( + value, + &PolyValue::List(vec![ + PolyValue::Int(i as i64), + PolyValue::Int(i as i64 + 1), + PolyValue::Int(-1) + ]) + ), + _ => assert_eq!(value.as_str(), Some(format!("record-{i}").as_str())), + } + } + let output = serialize("Root", &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + (schema, xml.into_bytes()) +} +fn benchmarks(c: &mut Criterion) { + for operation in ["constraint_read", "constraint_write"] { + let mut group = c.benchmark_group(operation); + group.sampling_mode(SamplingMode::Flat); + for kind in ["enum", "pattern", "restricted", "list", "content"] { + let (schema, xml) = fixture(kind, 1000); + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + group.throughput(Throughput::Bytes(xml.len() as u64)); + group.bench_function(BenchmarkId::new(kind, 1000), |b| { + if operation == "constraint_read" { + b.iter(|| { + black_box(deserialize(black_box(&xml), Arc::clone(&schema)).unwrap()) + }); + } else { + b.iter(|| { + black_box(serialize("Root", black_box(&value), &schema, None).unwrap()) + }); + } + }); + } + group.finish(); + } +} +criterion_group!(benches, benchmarks); +criterion_main!(benches); diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/metadata.json new file mode 100644 index 0000000..30a54e6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/metadata.json @@ -0,0 +1,19 @@ +{ + "revisions": { + "baseline": "bbbd087a9a8e9838a32912973cd4029c30f29c08", + "current": "7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d" + }, + "core_status": { + "baseline": "", + "current": "" + }, + "sample_size": 100, + "warmup_seconds": 3.0, + "measurement_seconds": 5.0, + "rounds": 3, + "filter": "", + "order": "alternate baseline/current per round", + "os": "Linux-6.18.40.1-microsoft-standard-WSL2-x86_64-with-glibc2.43", + "cpu": "11th Gen Intel(R) Core(TM) i5-11600K @ 3.90GHz", + "rustc": "rustc 1.99.0 (b940084d7 2026-09-28)\nbinary: rustc\ncommit-hash: b940084d7eb6a299eb4bfeb8e34901bc051e7ac4\ncommit-date: 2026-09-28\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.0\nLLVM version: 23.1.1\n" +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/samples.tar.gz b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/samples.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..680d1935d7013eb8d401b45d1908b583017271d9 GIT binary patch literal 72214 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 literal 0 HcmV?d00001 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/summary.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/summary.json new file mode 100644 index 0000000..c743f65 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-constraints/summary.json @@ -0,0 +1,712 @@ +{ + "constraint_read/content/1000": { + "baseline_ns": 192784.15205426357, + "candidate_ns": 193025.3596875, + "delta_percent": 0.12511797814611647, + "speedup": 0.9987503837131715, + "process_deltas_percent": [ + -0.3556982090925809, + 0.2755387924475938, + 1.0358564732894981 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 192011.47114922488, + "upper_bound": 193690.13464437993 + }, + "point_estimate": 192784.15205426357, + "standard_error": 429.961938727426 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 191663.15066085276, + "upper_bound": 193501.35719961242 + }, + "point_estimate": 192494.96139534877, + "standard_error": 470.1195098363425 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 192420.04543190668, + "upper_bound": 193470.14142704284 + }, + "point_estimate": 192910.69249027234, + "standard_error": 269.3503261614119 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 191728.831957529, + "upper_bound": 192515.09873841706 + }, + "point_estimate": 192098.42227799224, + "standard_error": 200.6790523442683 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 192337.85522070312, + "upper_bound": 193830.82442089845 + }, + "point_estimate": 193025.3596875, + "standard_error": 380.6987096060202 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 193333.53452220085, + "upper_bound": 196964.945715251 + }, + "point_estimate": 194908.9703861004, + "standard_error": 939.046062603845 + } + ] + } + }, + "constraint_read/enum/1000": { + "baseline_ns": 351978.5340714285, + "candidate_ns": 194919.055703125, + "delta_percent": -44.6218911567007, + "speedup": 1.805767695732714, + "process_deltas_percent": [ + -44.21725494287344, + -45.473257800854185, + -44.6218911567007 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 350550.511975352, + "upper_bound": 353306.45720246487 + }, + "point_estimate": 351846.80852112663, + "standard_error": 703.2671500408054 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 352065.6845950706, + "upper_bound": 363429.09119718306 + }, + "point_estimate": 356968.63415492955, + "standard_error": 2920.4875416446152 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 350123.51167678577, + "upper_bound": 354521.87073571427 + }, + "point_estimate": 351978.5340714285, + "standard_error": 1140.7750724277478 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 195404.80860236226, + "upper_bound": 197206.3291043307 + }, + "point_estimate": 196269.8081889763, + "standard_error": 459.18322771458924 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 194070.0746699605, + "upper_bound": 195304.9188774704 + }, + "point_estimate": 194643.3668774704, + "standard_error": 316.2353254878659 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 193941.41461621094, + "upper_bound": 196268.41965234376 + }, + "point_estimate": 194919.055703125, + "standard_error": 603.4608105845159 + } + ] + } + }, + "constraint_read/list/1000": { + "baseline_ns": 282412.5136871508, + "candidate_ns": 268777.48951612896, + "delta_percent": -4.828052409223749, + "speedup": 1.0507297846838606, + "process_deltas_percent": [ + -4.315803850402666, + -10.10115823763339, + -4.623796423950866 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 279724.9669928978, + "upper_bound": 282199.2758352274 + }, + "point_estimate": 280900.60880681814, + "standard_error": 631.7159788317759 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 291091.6212286931, + "upper_bound": 306690.0491122158 + }, + "point_estimate": 298094.52153409086, + "standard_error": 4013.9514461347862 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 281311.55979469273, + "upper_bound": 283711.85325977637 + }, + "point_estimate": 282412.5136871508, + "standard_error": 615.8407858633855 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 267268.3925456989, + "upper_bound": 270665.38852956996 + }, + "point_estimate": 268777.48951612896, + "standard_error": 868.6841123701857 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 266716.7653337839, + "upper_bound": 269680.6977324324 + }, + "point_estimate": 267983.5222162162, + "standard_error": 763.4517783543566 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 267050.2594139786, + "upper_bound": 273077.0408870968 + }, + "point_estimate": 269354.3339784946, + "standard_error": 1631.8889530253089 + } + ] + } + }, + "constraint_read/pattern/1000": { + "baseline_ns": 10165972.410000002, + "candidate_ns": 230008.7672811059, + "delta_percent": -97.73746417947335, + "speedup": 44.19819526955522, + "process_deltas_percent": [ + -97.75111812666964, + -97.75568272245698, + -97.7325047421401 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 10141748.657949999, + "upper_bound": 10193074.248800002 + }, + "point_estimate": 10165972.410000002, + "standard_error": 13149.645414607558 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 10230447.092900004, + "upper_bound": 10323129.420400003 + }, + "point_estimate": 10271818.862, + "standard_error": 23888.554917080884 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 10112120.2727, + "upper_bound": 10178805.768599998 + }, + "point_estimate": 10143737.521999996, + "standard_error": 17007.00632616697 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 227934.89719178076, + "upper_bound": 229520.11902739733 + }, + "point_estimate": 228620.71077625564, + "standard_error": 409.11904790238225 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 229054.34856105977, + "upper_bound": 232267.8773536866 + }, + "point_estimate": 230532.20543778807, + "standard_error": 823.6387146109047 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 228562.77638248855, + "upper_bound": 232007.16450115215 + }, + "point_estimate": 230008.7672811059, + "standard_error": 894.4887261618319 + } + ] + } + }, + "constraint_read/restricted/1000": { + "baseline_ns": 10279245.064, + "candidate_ns": 243833.60565853666, + "delta_percent": -97.62790356548176, + "speedup": 42.15680212019258, + "process_deltas_percent": [ + -97.62509847502601, + -97.60353199729835, + -97.63657490177884 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 10195968.201049998, + "upper_bound": 10257092.893349996 + }, + "point_estimate": 10224827.685999995, + "standard_error": 15643.48242136762 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 10250724.5489, + "upper_bound": 10313707.164000003 + }, + "point_estimate": 10279245.064, + "standard_error": 16180.30230027165 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 10243154.13675, + "upper_bound": 10405363.819749998 + }, + "point_estimate": 10316959.307999996, + "standard_error": 41546.65486789841 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 242335.7666917476, + "upper_bound": 243423.11083131062 + }, + "point_estimate": 242829.5886407767, + "standard_error": 277.6900711383286 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 244778.24533414625, + "upper_bound": 248285.3462121951 + }, + "point_estimate": 246338.8188780486, + "standard_error": 901.7468871209679 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 242979.6416841465, + "upper_bound": 244774.59950853663 + }, + "point_estimate": 243833.60565853666, + "standard_error": 459.0387312247824 + } + ] + } + }, + "constraint_write/content/1000": { + "baseline_ns": 48652.90011764704, + "candidate_ns": 37219.495173945215, + "delta_percent": -23.499945359998755, + "speedup": 1.307188608826311, + "process_deltas_percent": [ + -23.471029676822585, + -23.843474987272927, + -23.322316539897535 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 48523.848510039206, + "upper_bound": 48769.40897257592 + }, + "point_estimate": 48634.51712047012, + "standard_error": 63.03099978701998 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 48406.46254289218, + "upper_bound": 48955.31484485293 + }, + "point_estimate": 48652.90011764704, + "standard_error": 141.00254748735813 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 48620.898187438186, + "upper_bound": 48960.625864243324 + }, + "point_estimate": 48777.92458951531, + "standard_error": 87.04739079917228 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 37002.76390377497, + "upper_bound": 37491.108981680234 + }, + "point_estimate": 37219.495173945215, + "standard_error": 125.80220737947377 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 36884.13980753524, + "upper_bound": 37255.50575092797 + }, + "point_estimate": 37052.358047512986, + "standard_error": 95.19461631667714 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 37220.737900817236, + "upper_bound": 37606.885702080246 + }, + "point_estimate": 37401.78261515603, + "standard_error": 98.95960702051671 + } + ] + } + }, + "constraint_write/enum/1000": { + "baseline_ns": 69107.85810439564, + "candidate_ns": 53181.97295116775, + "delta_percent": -23.044969978913166, + "speedup": 1.2994602168642972, + "process_deltas_percent": [ + -23.474002980167608, + -23.06544890499511, + -22.281722343628196 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 68748.3373385989, + "upper_bound": 69577.05103708793 + }, + "point_estimate": 69107.85810439564, + "standard_error": 214.0495325958438 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 68822.09968428375, + "upper_bound": 69603.15337726008 + }, + "point_estimate": 69126.25367176632, + "standard_error": 207.6133072545296 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 68647.59167906336, + "upper_bound": 69263.02710743803 + }, + "point_estimate": 68933.88318181818, + "standard_error": 157.729643166622 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 52664.844984824274, + "upper_bound": 53183.825820021295 + }, + "point_estimate": 52885.4774334398, + "standard_error": 133.91920778421817 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 52946.81040366241, + "upper_bound": 53501.033257165596 + }, + "point_estimate": 53181.97295116775, + "standard_error": 143.54169957289216 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 52755.5215380724, + "upper_bound": 54808.05200372738 + }, + "point_estimate": 53574.22673056444, + "standard_error": 542.8918021806168 + } + ] + } + }, + "constraint_write/list/1000": { + "baseline_ns": 232458.26257009353, + "candidate_ns": 191602.29132575757, + "delta_percent": -17.57561585147639, + "speedup": 1.213233208025021, + "process_deltas_percent": [ + -13.991713070968636, + -17.92600836313144, + -19.204531360684506 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 220267.68714351847, + "upper_bound": 226110.526582176 + }, + "point_estimate": 222771.89578703707, + "standard_error": 1516.6126964134764 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 231608.84587266337, + "upper_bound": 233427.2197324767 + }, + "point_estimate": 232458.26257009353, + "standard_error": 463.83703181049367 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 233233.74181162787, + "upper_bound": 243579.52593488392 + }, + "point_estimate": 237276.4200465117, + "standard_error": 2741.4506043360634 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 190686.22409564396, + "upper_bound": 192684.6898219697 + }, + "point_estimate": 191602.29132575757, + "standard_error": 510.5381288029201 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 190151.26949904938, + "upper_bound": 191480.99621577948 + }, + "point_estimate": 190787.77498098853, + "standard_error": 339.87984564104255 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 190979.97200471684, + "upper_bound": 192552.80349433955 + }, + "point_estimate": 191708.59554716985, + "standard_error": 403.1152679872416 + } + ] + } + }, + "constraint_write/pattern/1000": { + "baseline_ns": 9603202.148333333, + "candidate_ns": 92220.86494464944, + "delta_percent": -99.0396863096269, + "speedup": 104.1326402012943, + "process_deltas_percent": [ + -99.00204290931394, + -99.0587072021266, + -99.04133622823704 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 9451347.930458333, + "upper_bound": 9585143.830125 + }, + "point_estimate": 9513021.858333332, + "standard_error": 34258.357194274584 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 9718157.326208336, + "upper_bound": 9904496.882541668 + }, + "point_estimate": 9797255.98166666, + "standard_error": 48148.50860444387 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 9527952.328458337, + "upper_bound": 9689721.79883333 + }, + "point_estimate": 9603202.148333333, + "standard_error": 41353.86454159899 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 92712.16177125697, + "upper_bound": 97926.8694385397 + }, + "point_estimate": 94935.87617375235, + "standard_error": 1351.4178106433126 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 91824.3200193727, + "upper_bound": 92713.13078228779 + }, + "point_estimate": 92220.86494464944, + "standard_error": 229.45224577482114 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 91809.24058271032, + "upper_bound": 92360.91219672895 + }, + "point_estimate": 92062.41992523367, + "standard_error": 141.7752341310761 + } + ] + } + }, + "constraint_write/restricted/1000": { + "baseline_ns": 9557318.668333333, + "candidate_ns": 103450.17048936168, + "delta_percent": -98.91758165569881, + "speedup": 92.38572177429289, + "process_deltas_percent": [ + -98.92695475051941, + -98.92486400018623, + -98.91425610002929 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 9443962.078624997, + "upper_bound": 9506008.997624997 + }, + "point_estimate": 9471042.083333332, + "standard_error": 15924.625444093057 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 9597078.327791667, + "upper_bound": 9649585.701416671 + }, + "point_estimate": 9622054.373333333, + "standard_error": 13430.221780022812 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 9474193.988166666, + "upper_bound": 9669412.452041669 + }, + "point_estimate": 9557318.668333333, + "standard_error": 50444.16554886872 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 101140.82658888891, + "upper_bound": 102189.1773075758 + }, + "point_estimate": 101628.56715151516, + "standard_error": 267.938288281019 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 102780.65178936171, + "upper_bound": 104440.732693617 + }, + "point_estimate": 103450.17048936168, + "standard_error": 433.88242535341345 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 102388.3408230223, + "upper_bound": 105422.43375000003 + }, + "point_estimate": 103768.00444219066, + "standard_error": 776.2119541271966 + } + ] + } + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-0.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-0.txt new file mode 100644 index 0000000..ac0adea --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-0.txt @@ -0,0 +1,63 @@ +memcap: <=7712 MiB (60% of 12854 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0023 s (4.8M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0397 µs 1.0438 µs 1.0487 µs] + thrpt: [85.478 MiB/s 85.880 MiB/s 86.224 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 5 (5.00%) high mild + 4 (4.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 8.1109 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [800.95 µs 809.87 µs 820.95 µs] + thrpt: [74.243 MiB/s 75.259 MiB/s 76.097 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 4 (4.00%) high mild + 6 (6.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.6895 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.9707 ms 8.0125 ms 8.0717 ms] + thrpt: [79.032 MiB/s 79.616 MiB/s 80.034 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 5 (5.00%) high mild + 4 (4.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0012 s (18M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [277.86 ns 278.64 ns 279.67 ns] + thrpt: [320.54 MiB/s 321.72 MiB/s 322.63 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 6 (6.00%) high mild + 3 (3.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.6112 s (25k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [221.19 µs 222.19 µs 223.37 µs] + thrpt: [270.73 MiB/s 272.17 MiB/s 273.40 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 2 (2.00%) high mild + 6 (6.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 5.0121 s (2200 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [2.2436 ms 2.2557 ms 2.2700 ms] + thrpt: [278.92 MiB/s 280.69 MiB/s 282.20 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 3 (3.00%) high mild + 7 (7.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-1.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-1.txt new file mode 100644 index 0000000..f361ff6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-1.txt @@ -0,0 +1,63 @@ +memcap: <=7799 MiB (60% of 12998 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0037 s (4.7M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0418 µs 1.0489 µs 1.0580 µs] + thrpt: [84.730 MiB/s 85.467 MiB/s 86.048 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 5 (5.00%) high mild + 6 (6.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 8.0372 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [795.52 µs 798.95 µs 803.13 µs] + thrpt: [75.891 MiB/s 76.288 MiB/s 76.617 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 6 (6.00%) high mild + 5 (5.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.6229 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.9206 ms 7.9408 ms 7.9631 ms] + thrpt: [80.110 MiB/s 80.335 MiB/s 80.540 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 6 (6.00%) high mild + 6 (6.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0000 s (18M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [279.13 ns 280.57 ns 282.39 ns] + thrpt: [317.45 MiB/s 319.51 MiB/s 321.17 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 2 (2.00%) high mild + 9 (9.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.5997 s (25k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [221.00 µs 222.48 µs 224.63 µs] + thrpt: [269.21 MiB/s 271.82 MiB/s 273.64 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 2 (2.00%) high mild + 9 (9.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 5.0150 s (2200 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [2.2343 ms 2.2532 ms 2.2801 ms] + thrpt: [277.69 MiB/s 281.00 MiB/s 283.38 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 4 (4.00%) high mild + 5 (5.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-2.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-2.txt new file mode 100644 index 0000000..7898391 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-2.txt @@ -0,0 +1,64 @@ +memcap: <=7803 MiB (60% of 13006 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0002 s (4.5M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0398 µs 1.0439 µs 1.0499 µs] + thrpt: [85.385 MiB/s 85.875 MiB/s 86.214 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 6 (6.00%) high mild + 5 (5.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 8.1008 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [793.60 µs 796.31 µs 799.29 µs] + thrpt: [76.256 MiB/s 76.541 MiB/s 76.802 MiB/s] +Found 4 outliers among 100 measurements (4.00%) + 3 (3.00%) high mild + 1 (1.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.6160 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.9615 ms 8.0115 ms 8.0717 ms] + thrpt: [79.032 MiB/s 79.626 MiB/s 80.126 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 6 (6.00%) high mild + 6 (6.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0008 s (18M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [277.96 ns 278.74 ns 279.72 ns] + thrpt: [320.48 MiB/s 321.60 MiB/s 322.51 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 1 (1.00%) low mild + 5 (5.00%) high mild + 3 (3.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.6002 s (25k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [221.15 µs 223.78 µs 227.58 µs] + thrpt: [265.73 MiB/s 270.23 MiB/s 273.45 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 3 (3.00%) high mild + 7 (7.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 5.2011 s (2300 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [2.2336 ms 2.2408 ms 2.2494 ms] + thrpt: [281.48 MiB/s 282.55 MiB/s 283.47 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 8 (8.00%) high mild + 4 (4.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-build.txt new file mode 100644 index 0000000..70e0ce1 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline-build.txt @@ -0,0 +1,3 @@ +memcap: <=7606 MiB (60% of 12678 MiB available) [systemd MemoryMax, swap off] + Compiling core-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/core-baseline) + Finished `bench` profile [optimized] target(s) in 2.58s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline.lock new file mode 100644 index 0000000..78a11b2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/baseline.lock @@ -0,0 +1,633 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "core-regression" +version = "0.0.0" +dependencies = [ + "criterion", + "polyxml", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "num-traits", + "oorandom", + "page_size", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-0.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-0.txt new file mode 100644 index 0000000..acb2db4 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-0.txt @@ -0,0 +1,64 @@ +memcap: <=7782 MiB (60% of 12971 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0026 s (5.0M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0248 µs 1.0384 µs 1.0553 µs] + thrpt: [84.948 MiB/s 86.327 MiB/s 87.480 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 7 (7.00%) high mild + 5 (5.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 7.9777 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [783.17 µs 785.61 µs 788.56 µs] + thrpt: [77.293 MiB/s 77.583 MiB/s 77.825 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 4 (4.00%) high mild + 5 (5.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.5413 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.8378 ms 7.8695 ms 7.9092 ms] + thrpt: [80.656 MiB/s 81.063 MiB/s 81.390 MiB/s] +Found 3 outliers among 100 measurements (3.00%) + 3 (3.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0004 s (22M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [226.75 ns 227.46 ns 228.32 ns] + thrpt: [392.63 MiB/s 394.12 MiB/s 395.34 MiB/s] +Found 6 outliers among 100 measurements (6.00%) + 3 (3.00%) high mild + 3 (3.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.4073 s (30k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [178.35 µs 179.74 µs 181.57 µs] + thrpt: [333.07 MiB/s 336.46 MiB/s 339.07 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 4 (4.00%) high mild + 5 (5.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s + +Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 9.2s, enable flat sampling, or reduce sample count to 50. +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 9.2071 s (5050 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [1.7955 ms 1.8067 ms 1.8201 ms] + thrpt: [347.87 MiB/s 350.45 MiB/s 352.63 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 6 (6.00%) high mild + 5 (5.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-1.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-1.txt new file mode 100644 index 0000000..e6cd8d7 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-1.txt @@ -0,0 +1,65 @@ +memcap: <=7795 MiB (60% of 12992 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0030 s (4.9M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0024 µs 1.0062 µs 1.0107 µs] + thrpt: [88.693 MiB/s 89.096 MiB/s 89.428 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 6 (6.00%) high mild + 4 (4.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 7.8958 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [780.50 µs 783.58 µs 787.04 µs] + thrpt: [77.442 MiB/s 77.785 MiB/s 78.091 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 6 (6.00%) high mild + 4 (4.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.5023 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.8955 ms 7.9463 ms 8.0029 ms] + thrpt: [79.711 MiB/s 80.279 MiB/s 80.796 MiB/s] +Found 16 outliers among 100 measurements (16.00%) + 6 (6.00%) high mild + 10 (10.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0010 s (22M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [226.75 ns 227.72 ns 228.94 ns] + thrpt: [391.56 MiB/s 393.67 MiB/s 395.35 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 4 (4.00%) high mild + 6 (6.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.3973 s (30k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [177.52 µs 179.83 µs 183.65 µs] + thrpt: [329.29 MiB/s 336.28 MiB/s 340.65 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 4 (4.00%) high mild + 5 (5.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s + +Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 9.1s, enable flat sampling, or reduce sample count to 50. +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 9.0671 s (5050 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [1.7927 ms 1.7997 ms 1.8086 ms] + thrpt: [350.07 MiB/s 351.82 MiB/s 353.19 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 10 (10.00%) high mild + 3 (3.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-2.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-2.txt new file mode 100644 index 0000000..a3f0e00 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-2.txt @@ -0,0 +1,65 @@ +memcap: <=7805 MiB (60% of 13009 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0028 s (5.0M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0073 µs 1.0135 µs 1.0215 µs] + thrpt: [87.759 MiB/s 88.448 MiB/s 88.992 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 7 (7.00%) high mild + 6 (6.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 7.9062 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [783.97 µs 791.07 µs 802.60 µs] + thrpt: [75.941 MiB/s 77.048 MiB/s 77.746 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 4 (4.00%) high mild + 4 (4.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.5341 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.9004 ms 7.9325 ms 7.9721 ms] + thrpt: [80.019 MiB/s 80.418 MiB/s 80.746 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 5 (5.00%) high mild + 6 (6.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0005 s (22M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [226.79 ns 227.53 ns 228.55 ns] + thrpt: [392.23 MiB/s 394.00 MiB/s 395.29 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 3 (3.00%) high mild + 5 (5.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.4104 s (30k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [178.32 µs 180.09 µs 183.03 µs] + thrpt: [330.40 MiB/s 335.80 MiB/s 339.14 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 4 (4.00%) high mild + 4 (4.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s + +Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 9.1s, enable flat sampling, or reduce sample count to 50. +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 9.1209 s (5050 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [1.7935 ms 1.8057 ms 1.8226 ms] + thrpt: [347.39 MiB/s 350.63 MiB/s 353.03 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 5 (5.00%) high mild + 5 (5.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-build.txt new file mode 100644 index 0000000..450f377 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current-build.txt @@ -0,0 +1,4 @@ +memcap: <=7578 MiB (60% of 12631 MiB available) [systemd MemoryMax, swap off] + Compiling polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling core-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/core-current) + Finished `bench` profile [optimized] target(s) in 26.30s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current.lock new file mode 100644 index 0000000..78a11b2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/current.lock @@ -0,0 +1,633 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "core-regression" +version = "0.0.0" +dependencies = [ + "criterion", + "polyxml", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "num-traits", + "oorandom", + "page_size", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/harness.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/harness.rs new file mode 100644 index 0000000..073ad98 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/harness.rs @@ -0,0 +1,172 @@ +use std::hint::black_box; + +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize}; +use std::sync::Arc; + +fn build_sensor_fixture() -> (Arc, Vec) { + let schema = ModelSchema::builder("Sensor") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "temp", + b"temp", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .field(FieldSchema::new( + "status", + b"status", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "active", + b"active", + FieldKind::Element, + ValueType::Scalar(ScalarType::Bool), + )) + .build(); + + let xml = br#"23.75OPERATIONALtrue"#.to_vec(); + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let output = serialize("Sensor", &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + (schema, xml) +} + +fn build_catalog_fixture(count: usize) -> (Arc, Vec) { + let item_schema = ModelSchema::builder("Item") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "name", + b"name", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "price", + b"price", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .build(); + + let catalog_schema = ModelSchema::builder("Catalog") + .field(FieldSchema::new( + "items", + b"item", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Nested(item_schema))), + )) + .build(); + + let mut xml = String::with_capacity(count * 64 + 32); + xml.push_str(""); + for i in 0..count { + use std::fmt::Write; + write!( + xml, + r#"Part-{i}{:.2}"#, + (i as f64) * 1.25 + ) + .unwrap(); + } + xml.push_str(""); + + let xml = xml.into_bytes(); + let value = deserialize(&xml, Arc::clone(&catalog_schema)).unwrap(); + assert_eq!(value.get("items").unwrap().as_list().unwrap().len(), count); + let output = serialize("Catalog", &value, &catalog_schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&catalog_schema)).unwrap()); + (catalog_schema, xml) +} + +fn bench_deserialization(c: &mut Criterion) { + let mut group = c.benchmark_group("deserialization"); + + // 1. Sensor Telemetry (Micro) + { + let (schema, xml) = build_sensor_fixture(); + group.throughput(Throughput::Bytes(xml.len() as u64)); + group.bench_function("sensor_micro", |b| { + b.iter(|| { + let res = deserialize(black_box(&xml), Arc::clone(&schema)).unwrap(); + black_box(res); + }); + }); + } + + // 2. Catalog Batch (1,000 and 10,000 items) + for &count in &[1_000, 10_000] { + let (schema, xml) = build_catalog_fixture(count); + group.throughput(Throughput::Bytes(xml.len() as u64)); + group.bench_with_input(BenchmarkId::new("catalog_items", count), &count, |b, _| { + b.iter(|| { + let res = deserialize(black_box(&xml), Arc::clone(&schema)).unwrap(); + black_box(res); + }); + }); + } + + group.finish(); +} + +fn bench_serialization(c: &mut Criterion) { + let mut group = c.benchmark_group("serialization"); + + // 1. Sensor Telemetry (Micro) + { + let (schema, xml) = build_sensor_fixture(); + let val = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let expected_bytes = serialize("Sensor", &val, &schema, None).unwrap(); + group.throughput(Throughput::Bytes(expected_bytes.len() as u64)); + group.bench_function("sensor_micro", |b| { + b.iter(|| { + let res = serialize( + black_box("Sensor"), + black_box(&val), + black_box(&schema), + black_box(None), + ) + .unwrap(); + black_box(res); + }); + }); + } + + // 2. Catalog Batch (1,000 and 10,000 items) + for &count in &[1_000, 10_000] { + let (schema, xml) = build_catalog_fixture(count); + let val = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let expected_bytes = serialize("Catalog", &val, &schema, None).unwrap(); + group.throughput(Throughput::Bytes(expected_bytes.len() as u64)); + group.bench_with_input(BenchmarkId::new("catalog_items", count), &count, |b, _| { + b.iter(|| { + let res = serialize( + black_box("Catalog"), + black_box(&val), + black_box(&schema), + black_box(None), + ) + .unwrap(); + black_box(res); + }); + }); + } + + group.finish(); +} + +criterion_group!(benches, bench_deserialization, bench_serialization); +criterion_main!(benches); diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/metadata.json new file mode 100644 index 0000000..30a54e6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/metadata.json @@ -0,0 +1,19 @@ +{ + "revisions": { + "baseline": "bbbd087a9a8e9838a32912973cd4029c30f29c08", + "current": "7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d" + }, + "core_status": { + "baseline": "", + "current": "" + }, + "sample_size": 100, + "warmup_seconds": 3.0, + "measurement_seconds": 5.0, + "rounds": 3, + "filter": "", + "order": "alternate baseline/current per round", + "os": "Linux-6.18.40.1-microsoft-standard-WSL2-x86_64-with-glibc2.43", + "cpu": "11th Gen Intel(R) Core(TM) i5-11600K @ 3.90GHz", + "rustc": "rustc 1.99.0 (b940084d7 2026-09-28)\nbinary: rustc\ncommit-hash: b940084d7eb6a299eb4bfeb8e34901bc051e7ac4\ncommit-date: 2026-09-28\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.0\nLLVM version: 23.1.1\n" +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/samples.tar.gz b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-core/samples.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..41bd561b403fa3468897f6c9afc7f2259f24284f GIT binary patch literal 55440 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 ek*xntNl8gbNl8gbNl8h$hWsB`zFxHehz) -> Result<()> { + let mut depth = 1; + loop { + match reader.read_event()? { + Event::Start(_) => depth += 1, + Event::End(_) => { + depth -= 1; + if depth == 0 { + break; + } + } + Event::Eof => break, + _ => {} + } + } + Ok(()) +} + +#[allow(dead_code)] +pub(crate) fn read_element_text<'a>(reader: &mut Reader<&'a [u8]>, tag_name: &str) -> Result> { + let mut text = Cow::Borrowed(""); + loop { + match reader.read_event()? { + Event::Text(t) => { + let raw = match t.into_inner() { + Cow::Borrowed(b) => match quick_xml::escape::unescape(b)? { + Cow::Borrowed(s) => Cow::Borrowed(s), + Cow::Owned(s) => Cow::Owned(s), + }, + Cow::Owned(s) => Cow::Owned(quick_xml::escape::unescape(&s)?.into_owned()), + }; + if text.is_empty() { + text = raw; + } else { + text.to_mut().push_str(&raw); + } + } + Event::CData(c) => { + text.to_mut().push_str(c.as_ref()); + } + Event::GeneralRef(r) => { + if r.is_char_ref() { + if let Some(ch) = r.resolve_char_ref()? { + text.to_mut().push(ch); + } + } else if let Some(val) = quick_xml::escape::resolve_xml_entity(r.as_ref()) { + text.to_mut().push_str(val); + } else { + text.to_mut().push_str(r.as_ref()); + } + } + Event::End(e) if e.local_name().as_ref() == tag_name => break, + Event::Eof => break, + _ => {} + } + } + Ok(text) +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct BatchType<'a> { + #[serde(rename = "Sensor", default, skip_serializing_if = "Vec::is_empty")] + pub sensor: Vec>, +} + +impl<'a> BatchType<'a> { + pub fn from_xml(xml: &'a str) -> Result + { + let mut reader = Reader::from_str(xml); + loop { + match reader.read_event()? { + Event::Start(e) => return Self::decode_xml(&mut reader, &e), + Event::Empty(e) => return Self::decode_xml_empty(&e), + Event::Eof => break, + _ => {} + } + } + Err(PolyXmlError::SchemaError("Unexpected EOF while parsing BatchType".into())) + } + + pub fn from_xml_bytes(xml_bytes: &'a [u8]) -> Result + { + let s = std::str::from_utf8(xml_bytes)?; + Self::from_xml(s) + } + + pub fn decode_xml(reader: &mut Reader<&'a [u8]>, start: &BytesStart<'_>) -> Result + { + let mut var_sensor = Vec::new(); + + loop { + match reader.read_event()? { + Event::Start(e) => match e.local_name().as_ref() { + "Sensor" => { + let val = SensorType::decode_xml(reader, &e)?; + var_sensor.push(val); + } + _ => { + skip_xml_element(reader)?; + } + }, + Event::Empty(e) => match e.local_name().as_ref() { + "Sensor" => { + let val = SensorType::decode_xml_empty(&e)?; + var_sensor.push(val); + } + _ => {} + }, + Event::End(e) if e.local_name().as_ref() == start.local_name().as_ref() => break, + Event::Eof => break, + _ => {} + } + } + + Ok(Self { + sensor: var_sensor, + }) + } + + pub fn decode_xml_empty(start: &BytesStart<'_>) -> Result { + let var_sensor = Vec::new(); + + Ok(Self { + sensor: var_sensor, + }) + } + + pub fn to_xml(&self) -> Result> { + let mut buf = Vec::new(); + let mut writer = Writer::new(std::io::Cursor::new(&mut buf)); + self.encode_xml(&mut writer, None)?; + Ok(buf) + } + + pub fn to_xml_string(&self) -> Result { + let bytes = self.to_xml()?; + String::from_utf8(bytes).map_err(|e| PolyXmlError::Utf8Error(e.utf8_error())) + } + + pub fn from_json_str(json_str: &'a str) -> std::result::Result + { + serde_json::from_str(json_str) + } + + pub fn from_json_slice(bytes: &'a [u8]) -> std::result::Result + { + serde_json::from_slice(bytes) + } + + pub fn to_json_string(&self) -> std::result::Result { + serde_json::to_string(self) + } + + pub fn to_json_vec(&self) -> std::result::Result, serde_json::Error> { + serde_json::to_vec(self) + } + + pub fn encode_xml(&self, writer: &mut Writer, tag_name: Option<&str>) -> Result<()> { + let tag = tag_name.unwrap_or("BatchType"); + let mut start = BytesStart::new(tag); + writer.write_event(Event::Start(start))?; + for item in &self.sensor { + item.encode_xml(writer, Some("Sensor"))?; + } + writer.write_event(Event::End(BytesEnd::new(tag)))?; + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct SensorType<'a> { + #[serde(rename = "Id")] + pub id: Cow<'a, str>, + #[serde(rename = "Value")] + pub value: i32, +} + +impl<'a> SensorType<'a> { + pub fn from_xml(xml: &'a str) -> Result + { + let mut reader = Reader::from_str(xml); + loop { + match reader.read_event()? { + Event::Start(e) => return Self::decode_xml(&mut reader, &e), + Event::Empty(e) => return Self::decode_xml_empty(&e), + Event::Eof => break, + _ => {} + } + } + Err(PolyXmlError::SchemaError("Unexpected EOF while parsing SensorType".into())) + } + + pub fn from_xml_bytes(xml_bytes: &'a [u8]) -> Result + { + let s = std::str::from_utf8(xml_bytes)?; + Self::from_xml(s) + } + + pub fn decode_xml(reader: &mut Reader<&'a [u8]>, start: &BytesStart<'_>) -> Result + { + let mut var_id = None; + let mut var_value = None; + + loop { + match reader.read_event()? { + Event::Start(e) => match e.local_name().as_ref() { + "Id" => { + let text = read_element_text(reader, "Id")?; + var_id = Some(text); + } + "Value" => { + let text = read_element_text(reader, "Value")?; + let s = text.trim(); + let val = s.parse::().map_err(|_| PolyXmlError::ScalarParseError { field: "value".into(), expected: "i32", value: s.into() })?; + var_value = Some(val); + } + _ => { + skip_xml_element(reader)?; + } + }, + Event::Empty(e) => match e.local_name().as_ref() { + "Id" => { + var_id = Some(Cow::Borrowed("")); + } + "Value" => { + } + _ => {} + }, + Event::End(e) if e.local_name().as_ref() == start.local_name().as_ref() => break, + Event::Eof => break, + _ => {} + } + } + + Ok(Self { + id: var_id.ok_or_else(|| PolyXmlError::SchemaError("Missing required field 'Id'".into()))?, + value: var_value.ok_or_else(|| PolyXmlError::SchemaError("Missing required field 'Value'".into()))?, + }) + } + + pub fn decode_xml_empty(start: &BytesStart<'_>) -> Result { + let mut var_id = None; + let mut var_value = None; + + Ok(Self { + id: var_id.unwrap_or(Cow::Borrowed("")), + value: var_value.unwrap_or_default(), + }) + } + + pub fn to_xml(&self) -> Result> { + let mut buf = Vec::new(); + let mut writer = Writer::new(std::io::Cursor::new(&mut buf)); + self.encode_xml(&mut writer, None)?; + Ok(buf) + } + + pub fn to_xml_string(&self) -> Result { + let bytes = self.to_xml()?; + String::from_utf8(bytes).map_err(|e| PolyXmlError::Utf8Error(e.utf8_error())) + } + + pub fn from_json_str(json_str: &'a str) -> std::result::Result + { + serde_json::from_str(json_str) + } + + pub fn from_json_slice(bytes: &'a [u8]) -> std::result::Result + { + serde_json::from_slice(bytes) + } + + pub fn to_json_string(&self) -> std::result::Result { + serde_json::to_string(self) + } + + pub fn to_json_vec(&self) -> std::result::Result, serde_json::Error> { + serde_json::to_vec(self) + } + + pub fn encode_xml(&self, writer: &mut Writer, tag_name: Option<&str>) -> Result<()> { + let tag = tag_name.unwrap_or("SensorType"); + let mut start = BytesStart::new(tag); + writer.write_event(Event::Start(start))?; + writer.write_event(Event::Start(BytesStart::new("Id")))?; + writer.write_event(Event::Text(BytesText::new(self.id.as_ref())))?; + writer.write_event(Event::End(BytesEnd::new("Id")))?; + writer.write_event(Event::Start(BytesStart::new("Value")))?; + writer.write_event(Event::Text(BytesText::new(&self.value.to_string())))?; + writer.write_event(Event::End(BytesEnd::new("Value")))?; + writer.write_event(Event::End(BytesEnd::new(tag)))?; + Ok(()) + } +} + +pub type Batch<'a> = BatchType<'a>; diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed.lock new file mode 100644 index 0000000..f8e578e --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-borrowed.lock @@ -0,0 +1,320 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "xml-regression" +version = "0.0.0" +dependencies = [ + "polyxml", + "quick-xml", + "serde", + "serde_json", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-build.txt new file mode 100644 index 0000000..8e4990c --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-build.txt @@ -0,0 +1,16 @@ +memcap: <=7882 MiB (60% of 13137 MiB available) [systemd MemoryMax, swap off] + Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.07s +Parsing schema: /home/bailey/github/PolyXML/benchmarks/workloads/sensor-batch/batch.xsd + Types: 2 total (2 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 1 +Code generation complete. +memcap: <=7879 MiB (60% of 13133 MiB available) [systemd MemoryMax, swap off] + Compiling xml-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/baseline-borrowed) + Finished `release` profile [optimized] target(s) in 0.86s +Parsing schema: /home/bailey/github/PolyXML/benchmarks/workloads/sensor-batch/batch.xsd + Types: 2 total (2 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 1 +Code generation complete. +memcap: <=7863 MiB (60% of 13105 MiB available) [systemd MemoryMax, swap off] + Compiling xml-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/baseline-owned) + Finished `release` profile [optimized] target(s) in 0.82s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-0.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-0.csv new file mode 100644 index 0000000..8251406 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-0.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,795800,314.169,65 +xml_read,1,1,808700,309.175,65 +xml_read,1,2,806300,310.086,65 +xml_read,1,3,795000,314.491,65 +xml_read,1,4,799800,312.604,65 +xml_read,1,5,803200,311.266,65 +xml_read,1,6,679800,367.770,65 +xml_write,1,0,1299700,192.353,65 +xml_write,1,1,1127600,221.723,65 +xml_write,1,2,1345300,185.840,65 +xml_write,1,3,1446700,172.817,65 +xml_write,1,4,1435300,174.185,65 +xml_write,1,5,1426900,175.216,65 +xml_write,1,6,1449400,172.488,65 +json_read,1,0,3104600,80.528,40 +json_read,1,1,2964900,84.321,40 +json_read,1,2,3072900,81.357,40 +json_read,1,3,3089700,80.916,40 +json_read,1,4,3107300,80.456,40 +json_read,1,5,3097000,80.725,40 +json_read,1,6,2966200,84.284,40 +json_write,1,0,6843900,36.529,40 +json_write,1,1,6830500,36.601,40 +json_write,1,2,6689900,37.370,40 +json_write,1,3,6625400,37.734,40 +json_write,1,4,6724400,37.178,40 +json_write,1,5,6806600,36.730,40 +json_write,1,6,6752400,37.024,40 +xml_read,1000,0,1100,234881.526,53795 +xml_read,1000,1,1100,232710.566,53795 +xml_read,1000,2,1100,232065.497,53795 +xml_read,1000,3,1100,235787.408,53795 +xml_read,1000,4,1100,235067.604,53795 +xml_read,1000,5,1100,234370.285,53795 +xml_read,1000,6,1100,232179.158,53795 +xml_write,1000,0,3100,81013.157,53795 +xml_write,1000,1,3200,79743.778,53795 +xml_write,1000,2,3200,80072.897,53795 +xml_write,1000,3,3100,82935.047,53795 +xml_write,1000,4,3100,82070.360,53795 +xml_write,1000,5,3100,83177.319,53795 +xml_write,1000,6,3200,80072.844,53795 +json_read,1000,0,4200,59714.763,31792 +json_read,1000,1,4300,59379.771,31792 +json_read,1000,2,4300,58643.805,31792 +json_read,1000,3,4300,58791.488,31792 +json_read,1000,4,4200,59602.864,31792 +json_read,1000,5,4200,59559.660,31792 +json_read,1000,6,4300,58540.260,31792 +json_write,1000,0,10300,24357.375,31792 +json_write,1000,1,10300,24389.013,31792 +json_write,1000,2,10200,24526.810,31792 +json_write,1000,3,10400,24212.869,31792 +json_write,1000,4,10300,24354.440,31792 +json_write,1000,5,10400,24253.103,31792 +json_write,1000,6,10200,24699.049,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-1.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-1.csv new file mode 100644 index 0000000..eeaaf14 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-1.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,800200,312.455,65 +xml_read,1,1,805100,310.521,65 +xml_read,1,2,800400,312.357,65 +xml_read,1,3,774800,322.684,65 +xml_read,1,4,798600,313.057,65 +xml_read,1,5,794300,314.759,65 +xml_read,1,6,793500,315.095,65 +xml_write,1,0,1424300,175.526,65 +xml_write,1,1,1430400,174.784,65 +xml_write,1,2,1442300,173.344,65 +xml_write,1,3,1444200,173.111,65 +xml_write,1,4,1417100,176.423,65 +xml_write,1,5,1426200,175.296,65 +xml_write,1,6,1440000,173.617,65 +json_read,1,0,3126400,79.967,40 +json_read,1,1,3080000,81.170,40 +json_read,1,2,3100200,80.641,40 +json_read,1,3,3134100,79.768,40 +json_read,1,4,3134300,79.764,40 +json_read,1,5,3082100,81.114,40 +json_read,1,6,3030600,82.493,40 +json_write,1,0,6963900,35.900,40 +json_write,1,1,6682900,37.409,40 +json_write,1,2,6274500,39.846,40 +json_write,1,3,6711000,37.253,40 +json_write,1,4,6535400,38.253,40 +json_write,1,5,6875500,36.361,40 +json_write,1,6,6886300,36.304,40 +xml_read,1000,0,1100,234531.013,53795 +xml_read,1000,1,1100,234375.853,53795 +xml_read,1000,2,1100,232379.026,53795 +xml_read,1000,3,1100,241694.761,53795 +xml_read,1000,4,1100,237494.745,53795 +xml_read,1000,5,1100,233017.616,53795 +xml_read,1000,6,1100,232677.723,53795 +xml_write,1000,0,3100,81040.227,53795 +xml_write,1000,1,3200,80491.116,53795 +xml_write,1000,2,3200,79598.096,53795 +xml_write,1000,3,3200,79972.305,53795 +xml_write,1000,4,3200,80028.895,53795 +xml_write,1000,5,3100,81490.317,53795 +xml_write,1000,6,3200,80084.668,53795 +json_read,1000,0,4300,58916.820,31792 +json_read,1000,1,4200,60601.782,31792 +json_read,1000,2,4300,58870.787,31792 +json_read,1000,3,4300,58786.729,31792 +json_read,1000,4,4300,59110.761,31792 +json_read,1000,5,4000,63461.367,31792 +json_read,1000,6,4100,61018.687,31792 +json_write,1000,0,10400,24218.739,31792 +json_write,1000,1,10400,24265.931,31792 +json_write,1000,2,10200,24527.493,31792 +json_write,1000,3,10300,24288.611,31792 +json_write,1000,4,10300,24277.874,31792 +json_write,1000,5,10300,24370.849,31792 +json_write,1000,6,10300,24369.074,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-2.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-2.csv new file mode 100644 index 0000000..7dd1f2d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-2.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,795300,314.359,65 +xml_read,1,1,788400,317.125,65 +xml_read,1,2,794400,314.716,65 +xml_read,1,3,803300,311.238,65 +xml_read,1,4,799300,313.611,65 +xml_read,1,5,766900,326.015,65 +xml_read,1,6,789800,316.561,65 +xml_write,1,0,1448600,172.590,65 +xml_write,1,1,1424300,175.529,65 +xml_write,1,2,1433600,174.395,65 +xml_write,1,3,1439100,173.729,65 +xml_write,1,4,1441500,173.441,65 +xml_write,1,5,1445400,172.974,65 +xml_write,1,6,1423400,175.640,65 +json_read,1,0,2893600,86.399,40 +json_read,1,1,2958900,84.492,40 +json_read,1,2,3084800,81.044,40 +json_read,1,3,3042500,82.171,40 +json_read,1,4,2863900,87.296,40 +json_read,1,5,3035300,82.365,40 +json_read,1,6,3059200,81.721,40 +json_write,1,0,6902200,36.220,40 +json_write,1,1,6863500,36.425,40 +json_write,1,2,6941100,36.018,40 +json_write,1,3,6952700,35.958,40 +json_write,1,4,6926600,36.093,40 +json_write,1,5,6893300,36.267,40 +json_write,1,6,6949400,35.975,40 +xml_read,1000,0,1100,234565.702,53795 +xml_read,1000,1,1100,236103.058,53795 +xml_read,1000,2,1100,233371.684,53795 +xml_read,1000,3,1100,232632.681,53795 +xml_read,1000,4,1100,233462.384,53795 +xml_read,1000,5,1100,235375.129,53795 +xml_read,1000,6,1100,236087.523,53795 +xml_write,1000,0,3200,80047.011,53795 +xml_write,1000,1,3200,80506.778,53795 +xml_write,1000,2,3200,80528.736,53795 +xml_write,1000,3,3200,80257.470,53795 +xml_write,1000,4,3200,79730.535,53795 +xml_write,1000,5,3200,79775.233,53795 +xml_write,1000,6,3200,80083.359,53795 +json_read,1000,0,4300,58966.840,31792 +json_read,1000,1,4300,58748.036,31792 +json_read,1000,2,4300,58818.102,31792 +json_read,1000,3,4300,58892.167,31792 +json_read,1000,4,4300,58822.587,31792 +json_read,1000,5,4300,58624.143,31792 +json_read,1000,6,4300,58870.936,31792 +json_write,1000,0,10500,23927.814,31792 +json_write,1000,1,10500,23934.693,31792 +json_write,1000,2,10000,25063.577,31792 +json_write,1000,3,10300,24493.627,31792 +json_write,1000,4,10500,23898.855,31792 +json_write,1000,5,10100,24844.458,31792 +json_write,1000,6,10500,23863.931,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-3.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-3.csv new file mode 100644 index 0000000..111f9fd --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-3.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,794200,314.790,65 +xml_read,1,1,797400,313.543,65 +xml_read,1,2,803400,311.206,65 +xml_read,1,3,804800,310.671,65 +xml_read,1,4,787400,317.539,65 +xml_read,1,5,800900,312.174,65 +xml_read,1,6,789800,316.559,65 +xml_write,1,0,1445800,172.925,65 +xml_write,1,1,1353900,184.659,65 +xml_write,1,2,1427600,175.124,65 +xml_write,1,3,1418300,176.269,65 +xml_write,1,4,1449000,172.539,65 +xml_write,1,5,1390400,179.816,65 +xml_write,1,6,1445000,173.012,65 +json_read,1,0,3099200,80.666,40 +json_read,1,1,3118100,80.178,40 +json_read,1,2,3084300,81.057,40 +json_read,1,3,3103600,80.553,40 +json_read,1,4,3125000,80.002,40 +json_read,1,5,3120000,80.130,40 +json_read,1,6,3103400,80.559,40 +json_write,1,0,6954000,35.951,40 +json_write,1,1,6883900,36.317,40 +json_write,1,2,6959300,35.923,40 +json_write,1,3,6925300,36.100,40 +json_write,1,4,6920500,36.125,40 +json_write,1,5,6725500,37.172,40 +json_write,1,6,6926700,36.093,40 +xml_read,1000,0,1100,238280.059,53795 +xml_read,1000,1,1100,238401.529,53795 +xml_read,1000,2,1100,237285.868,53795 +xml_read,1000,3,1100,238183.975,53795 +xml_read,1000,4,1100,241714.864,53795 +xml_read,1000,5,1100,237900.462,53795 +xml_read,1000,6,1100,235393.416,53795 +xml_write,1000,0,3200,80058.641,53795 +xml_write,1000,1,3200,80004.085,53795 +xml_write,1000,2,3200,80455.277,53795 +xml_write,1000,3,3200,80079.414,53795 +xml_write,1000,4,3200,79957.538,53795 +xml_write,1000,5,3200,80159.280,53795 +xml_write,1000,6,3200,80319.059,53795 +json_read,1000,0,4300,58557.430,31792 +json_read,1000,1,4300,59034.481,31792 +json_read,1000,2,4200,60622.545,31792 +json_read,1000,3,4100,61531.300,31792 +json_read,1000,4,4200,60303.164,31792 +json_read,1000,5,4300,58856.163,31792 +json_read,1000,6,4200,62115.064,31792 +json_write,1000,0,10500,24023.045,31792 +json_write,1000,1,10000,25024.962,31792 +json_write,1000,2,10300,24376.999,31792 +json_write,1000,3,10300,24422.748,31792 +json_write,1000,4,10500,23998.653,31792 +json_write,1000,5,10500,23991.090,31792 +json_write,1000,6,10400,24199.072,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-batch.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-batch.rs new file mode 100644 index 0000000..1b02437 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned-batch.rs @@ -0,0 +1,297 @@ +// @generated by PolyXML Compiler (https://github.com/polyxml/PolyXML) +#![allow(dead_code, unused_imports, unused_mut, unused_variables, unused_assignments, non_camel_case_types, non_snake_case)] + +use std::borrow::Cow; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; +use quick_xml::events::{BytesEnd, BytesStart, BytesText, Event}; +use quick_xml::{Reader, Writer}; +use polyxml::{PolyXmlError, Result}; + +#[allow(dead_code)] +pub(crate) fn skip_xml_element(reader: &mut Reader<&[u8]>) -> Result<()> { + let mut depth = 1; + loop { + match reader.read_event()? { + Event::Start(_) => depth += 1, + Event::End(_) => { + depth -= 1; + if depth == 0 { + break; + } + } + Event::Eof => break, + _ => {} + } + } + Ok(()) +} + +#[allow(dead_code)] +pub(crate) fn read_element_text(reader: &mut Reader<&[u8]>, tag_name: &str) -> Result { + let mut text = String::new(); + loop { + match reader.read_event()? { + Event::Text(t) => { + let unescaped = quick_xml::escape::unescape(t.as_ref())?; + text.push_str(&unescaped); + } + Event::CData(c) => { + text.push_str(c.as_ref()); + } + Event::GeneralRef(r) => { + if r.is_char_ref() { + if let Some(ch) = r.resolve_char_ref()? { + text.push(ch); + } + } else if let Some(val) = quick_xml::escape::resolve_xml_entity(r.as_ref()) { + text.push_str(val); + } else { + text.push_str(r.as_ref()); + } + } + Event::End(e) if e.local_name().as_ref() == tag_name => break, + Event::Eof => break, + _ => {} + } + } + Ok(text) +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct BatchType { + #[serde(rename = "Sensor", default, skip_serializing_if = "Vec::is_empty")] + pub sensor: Vec, +} + +impl BatchType { + pub fn from_xml(xml: &str) -> Result + { + let mut reader = Reader::from_str(xml); + loop { + match reader.read_event()? { + Event::Start(e) => return Self::decode_xml(&mut reader, &e), + Event::Empty(e) => return Self::decode_xml_empty(&e), + Event::Eof => break, + _ => {} + } + } + Err(PolyXmlError::SchemaError("Unexpected EOF while parsing BatchType".into())) + } + + pub fn from_xml_bytes(xml_bytes: &[u8]) -> Result + { + let s = std::str::from_utf8(xml_bytes)?; + Self::from_xml(s) + } + + pub fn decode_xml(reader: &mut Reader<&'_ [u8]>, start: &BytesStart<'_>) -> Result + { + let mut var_sensor = Vec::new(); + + loop { + match reader.read_event()? { + Event::Start(e) => match e.local_name().as_ref() { + "Sensor" => { + let val = SensorType::decode_xml(reader, &e)?; + var_sensor.push(val); + } + _ => { + skip_xml_element(reader)?; + } + }, + Event::Empty(e) => match e.local_name().as_ref() { + "Sensor" => { + let val = SensorType::decode_xml_empty(&e)?; + var_sensor.push(val); + } + _ => {} + }, + Event::End(e) if e.local_name().as_ref() == start.local_name().as_ref() => break, + Event::Eof => break, + _ => {} + } + } + + Ok(Self { + sensor: var_sensor, + }) + } + + pub fn decode_xml_empty(start: &BytesStart<'_>) -> Result { + let var_sensor = Vec::new(); + + Ok(Self { + sensor: var_sensor, + }) + } + + pub fn to_xml(&self) -> Result> { + let mut buf = Vec::new(); + let mut writer = Writer::new(std::io::Cursor::new(&mut buf)); + self.encode_xml(&mut writer, None)?; + Ok(buf) + } + + pub fn to_xml_string(&self) -> Result { + let bytes = self.to_xml()?; + String::from_utf8(bytes).map_err(|e| PolyXmlError::Utf8Error(e.utf8_error())) + } + + pub fn from_json_str(json_str: &str) -> std::result::Result + { + serde_json::from_str(json_str) + } + + pub fn from_json_slice(bytes: &[u8]) -> std::result::Result + { + serde_json::from_slice(bytes) + } + + pub fn to_json_string(&self) -> std::result::Result { + serde_json::to_string(self) + } + + pub fn to_json_vec(&self) -> std::result::Result, serde_json::Error> { + serde_json::to_vec(self) + } + + pub fn encode_xml(&self, writer: &mut Writer, tag_name: Option<&str>) -> Result<()> { + let tag = tag_name.unwrap_or("BatchType"); + let mut start = BytesStart::new(tag); + writer.write_event(Event::Start(start))?; + for item in &self.sensor { + item.encode_xml(writer, Some("Sensor"))?; + } + writer.write_event(Event::End(BytesEnd::new(tag)))?; + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct SensorType { + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "Value")] + pub value: i32, +} + +impl SensorType { + pub fn from_xml(xml: &str) -> Result + { + let mut reader = Reader::from_str(xml); + loop { + match reader.read_event()? { + Event::Start(e) => return Self::decode_xml(&mut reader, &e), + Event::Empty(e) => return Self::decode_xml_empty(&e), + Event::Eof => break, + _ => {} + } + } + Err(PolyXmlError::SchemaError("Unexpected EOF while parsing SensorType".into())) + } + + pub fn from_xml_bytes(xml_bytes: &[u8]) -> Result + { + let s = std::str::from_utf8(xml_bytes)?; + Self::from_xml(s) + } + + pub fn decode_xml(reader: &mut Reader<&'_ [u8]>, start: &BytesStart<'_>) -> Result + { + let mut var_id = None; + let mut var_value = None; + + loop { + match reader.read_event()? { + Event::Start(e) => match e.local_name().as_ref() { + "Id" => { + let text = read_element_text(reader, "Id")?; + var_id = Some(text); + } + "Value" => { + let text = read_element_text(reader, "Value")?; + let s = text.trim(); + let val = s.parse::().map_err(|_| PolyXmlError::ScalarParseError { field: "value".into(), expected: "i32", value: s.into() })?; + var_value = Some(val); + } + _ => { + skip_xml_element(reader)?; + } + }, + Event::Empty(e) => match e.local_name().as_ref() { + "Id" => { + var_id = Some(String::new()); + } + "Value" => { + } + _ => {} + }, + Event::End(e) if e.local_name().as_ref() == start.local_name().as_ref() => break, + Event::Eof => break, + _ => {} + } + } + + Ok(Self { + id: var_id.ok_or_else(|| PolyXmlError::SchemaError("Missing required field 'Id'".into()))?, + value: var_value.ok_or_else(|| PolyXmlError::SchemaError("Missing required field 'Value'".into()))?, + }) + } + + pub fn decode_xml_empty(start: &BytesStart<'_>) -> Result { + let mut var_id = None; + let mut var_value = None; + + Ok(Self { + id: var_id.unwrap_or_default(), + value: var_value.unwrap_or_default(), + }) + } + + pub fn to_xml(&self) -> Result> { + let mut buf = Vec::new(); + let mut writer = Writer::new(std::io::Cursor::new(&mut buf)); + self.encode_xml(&mut writer, None)?; + Ok(buf) + } + + pub fn to_xml_string(&self) -> Result { + let bytes = self.to_xml()?; + String::from_utf8(bytes).map_err(|e| PolyXmlError::Utf8Error(e.utf8_error())) + } + + pub fn from_json_str(json_str: &str) -> std::result::Result + { + serde_json::from_str(json_str) + } + + pub fn from_json_slice(bytes: &[u8]) -> std::result::Result + { + serde_json::from_slice(bytes) + } + + pub fn to_json_string(&self) -> std::result::Result { + serde_json::to_string(self) + } + + pub fn to_json_vec(&self) -> std::result::Result, serde_json::Error> { + serde_json::to_vec(self) + } + + pub fn encode_xml(&self, writer: &mut Writer, tag_name: Option<&str>) -> Result<()> { + let tag = tag_name.unwrap_or("SensorType"); + let mut start = BytesStart::new(tag); + writer.write_event(Event::Start(start))?; + writer.write_event(Event::Start(BytesStart::new("Id")))?; + writer.write_event(Event::Text(BytesText::new(self.id.as_ref())))?; + writer.write_event(Event::End(BytesEnd::new("Id")))?; + writer.write_event(Event::Start(BytesStart::new("Value")))?; + writer.write_event(Event::Text(BytesText::new(&self.value.to_string())))?; + writer.write_event(Event::End(BytesEnd::new("Value")))?; + writer.write_event(Event::End(BytesEnd::new(tag)))?; + Ok(()) + } +} + +pub type Batch = BatchType; diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned.lock new file mode 100644 index 0000000..f8e578e --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/baseline-owned.lock @@ -0,0 +1,320 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "xml-regression" +version = "0.0.0" +dependencies = [ + "polyxml", + "quick-xml", + "serde", + "serde_json", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-0.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-0.csv new file mode 100644 index 0000000..318bcdd --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-0.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,867700,288.124,65 +xml_read,1,1,875100,285.699,65 +xml_read,1,2,858700,291.140,65 +xml_read,1,3,874100,286.029,65 +xml_read,1,4,871900,286.761,65 +xml_read,1,5,859600,290.845,65 +xml_read,1,6,856200,292.002,65 +xml_write,1,0,1459500,171.300,65 +xml_write,1,1,1423900,175.580,65 +xml_write,1,2,1467600,170.350,65 +xml_write,1,3,1477900,169.163,65 +xml_write,1,4,1458400,171.425,65 +xml_write,1,5,1415600,176.604,65 +xml_write,1,6,1470500,170.011,65 +json_read,1,0,3147900,79.420,40 +json_read,1,1,3149500,79.378,40 +json_read,1,2,3118900,80.158,40 +json_read,1,3,2709900,92.258,40 +json_read,1,4,2528200,98.886,40 +json_read,1,5,3133200,79.792,40 +json_read,1,6,3116000,80.233,40 +json_write,1,0,6339800,39.433,40 +json_write,1,1,6330800,39.490,40 +json_write,1,2,6282700,39.792,40 +json_write,1,3,6294300,39.719,40 +json_write,1,4,6170900,40.513,40 +json_write,1,5,6325600,39.522,40 +json_write,1,6,6347200,39.388,40 +xml_read,1000,0,1400,185572.847,53795 +xml_read,1000,1,1300,199117.155,53795 +xml_read,1000,2,1400,185182.185,53795 +xml_read,1000,3,1400,190077.543,53795 +xml_read,1000,4,1400,188404.031,53795 +xml_read,1000,5,1400,186515.871,53795 +xml_read,1000,6,1400,183590.206,53795 +xml_write,1000,0,4900,51510.687,53795 +xml_write,1000,1,4900,51807.319,53795 +xml_write,1000,2,4900,52003.825,53795 +xml_write,1000,3,4900,51633.096,53795 +xml_write,1000,4,4800,52469.891,53795 +xml_write,1000,5,4900,51891.641,53795 +xml_write,1000,6,4900,51877.138,53795 +json_read,1000,0,4300,59086.543,31792 +json_read,1000,1,4300,59175.735,31792 +json_read,1000,2,4300,59217.093,31792 +json_read,1000,3,4300,58693.281,31792 +json_read,1000,4,4300,58536.687,31792 +json_read,1000,5,4200,60142.987,31792 +json_read,1000,6,4100,61850.753,31792 +json_write,1000,0,9800,25747.608,31792 +json_write,1000,1,9600,26173.044,31792 +json_write,1000,2,9600,26074.351,31792 +json_write,1000,3,9700,25829.752,31792 +json_write,1000,4,9800,25759.705,31792 +json_write,1000,5,9600,26226.341,31792 +json_write,1000,6,9600,26270.255,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-1.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-1.csv new file mode 100644 index 0000000..931dcc0 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-1.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,820300,304.772,65 +xml_read,1,1,857900,291.428,65 +xml_read,1,2,872800,286.435,65 +xml_read,1,3,876000,285.419,65 +xml_read,1,4,875300,285.627,65 +xml_read,1,5,880100,284.065,65 +xml_read,1,6,873500,286.220,65 +xml_write,1,0,1436600,174.023,65 +xml_write,1,1,1465000,170.649,65 +xml_write,1,2,1460600,171.172,65 +xml_write,1,3,1459800,171.261,65 +xml_write,1,4,1456800,171.610,65 +xml_write,1,5,1462000,171.003,65 +xml_write,1,6,1470500,170.016,65 +json_read,1,0,3108200,80.433,40 +json_read,1,1,3047200,82.043,40 +json_read,1,2,3125700,79.983,40 +json_read,1,3,3123600,80.038,40 +json_read,1,4,3110500,80.375,40 +json_read,1,5,3024600,82.658,40 +json_read,1,6,3088300,80.952,40 +json_write,1,0,6440900,38.815,40 +json_write,1,1,6384300,39.159,40 +json_write,1,2,6311700,39.609,40 +json_write,1,3,6453600,38.742,40 +json_write,1,4,6424100,38.916,40 +json_write,1,5,6425500,38.908,40 +json_write,1,6,6423200,38.921,40 +xml_read,1000,0,1400,185125.716,53795 +xml_read,1000,1,1400,183681.419,53795 +xml_read,1000,2,1400,185165.041,53795 +xml_read,1000,3,1400,189958.734,53795 +xml_read,1000,4,1400,187201.494,53795 +xml_read,1000,5,1400,186176.256,53795 +xml_read,1000,6,1400,184560.001,53795 +xml_write,1000,0,4700,54091.711,53795 +xml_write,1000,1,4800,52769.267,53795 +xml_write,1000,2,4800,53031.882,53795 +xml_write,1000,3,4700,53319.171,53795 +xml_write,1000,4,4800,52894.629,53795 +xml_write,1000,5,4800,52925.848,53795 +xml_write,1000,6,4800,52839.415,53795 +json_read,1000,0,4300,58536.248,31792 +json_read,1000,1,4200,59854.393,31792 +json_read,1000,2,4300,58567.573,31792 +json_read,1000,3,4100,62230.709,31792 +json_read,1000,4,4300,58687.475,31792 +json_read,1000,5,4100,61178.198,31792 +json_read,1000,6,4300,58710.255,31792 +json_write,1000,0,9200,27190.392,31792 +json_write,1000,1,9700,25828.776,31792 +json_write,1000,2,9700,25881.721,31792 +json_write,1000,3,9700,25893.517,31792 +json_write,1000,4,9700,25959.446,31792 +json_write,1000,5,9800,25659.508,31792 +json_write,1000,6,9700,25797.052,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-2.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-2.csv new file mode 100644 index 0000000..4d86817 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-2.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,865500,288.876,65 +xml_read,1,1,851200,293.754,65 +xml_read,1,2,791100,316.025,65 +xml_read,1,3,876700,285.186,65 +xml_read,1,4,870000,287.372,65 +xml_read,1,5,878200,284.673,65 +xml_read,1,6,872100,286.686,65 +xml_write,1,0,1460300,171.205,65 +xml_write,1,1,1463700,170.801,65 +xml_write,1,2,1462000,170.999,65 +xml_write,1,3,1466000,170.535,65 +xml_write,1,4,1453000,172.063,65 +xml_write,1,5,1466800,170.444,65 +xml_write,1,6,1471700,169.873,65 +json_read,1,0,3139200,79.639,40 +json_read,1,1,3116900,80.209,40 +json_read,1,2,3038600,82.279,40 +json_read,1,3,3066000,81.540,40 +json_read,1,4,3037900,82.296,40 +json_read,1,5,2754000,90.777,40 +json_read,1,6,3130000,79.875,40 +json_write,1,0,6035400,41.423,40 +json_write,1,1,6028300,41.471,40 +json_write,1,2,6021700,41.517,40 +json_write,1,3,5959700,41.949,40 +json_write,1,4,6067500,41.204,40 +json_write,1,5,6028500,41.470,40 +json_write,1,6,5923500,42.205,40 +xml_read,1000,0,1400,191493.247,53795 +xml_read,1000,1,1400,184026.999,53795 +xml_read,1000,2,1400,185548.487,53795 +xml_read,1000,3,1400,190014.786,53795 +xml_read,1000,4,1300,198914.119,53795 +xml_read,1000,5,1400,184260.099,53795 +xml_read,1000,6,1400,185902.056,53795 +xml_write,1000,0,4900,51360.579,53795 +xml_write,1000,1,4900,51947.634,53795 +xml_write,1000,2,4900,51475.889,53795 +xml_write,1000,3,4800,52510.231,53795 +xml_write,1000,4,4900,51408.213,53795 +xml_write,1000,5,4900,51501.487,53795 +xml_write,1000,6,4900,51307.094,53795 +json_read,1000,0,4300,58993.732,31792 +json_read,1000,1,4300,58539.976,31792 +json_read,1000,2,4200,59727.329,31792 +json_read,1000,3,4300,59331.218,31792 +json_read,1000,4,4300,59093.242,31792 +json_read,1000,5,4300,59244.156,31792 +json_read,1000,6,4300,58871.678,31792 +json_write,1000,0,9800,25704.837,31792 +json_write,1000,1,9600,26128.698,31792 +json_write,1000,2,9700,25814.005,31792 +json_write,1000,3,9700,25923.772,31792 +json_write,1000,4,9700,25886.729,31792 +json_write,1000,5,9800,25736.427,31792 +json_write,1000,6,9800,25668.008,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-3.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-3.csv new file mode 100644 index 0000000..76642d3 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-3.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,864600,289.155,65 +xml_read,1,1,850700,293.884,65 +xml_read,1,2,876000,285.418,65 +xml_read,1,3,867800,288.088,65 +xml_read,1,4,873900,286.077,65 +xml_read,1,5,879100,284.395,65 +xml_read,1,6,870700,287.129,65 +xml_write,1,0,1447600,172.710,65 +xml_write,1,1,1425500,175.383,65 +xml_write,1,2,1474400,169.570,65 +xml_write,1,3,1471300,169.927,65 +xml_write,1,4,1472600,169.777,65 +xml_write,1,5,1453400,172.017,65 +xml_write,1,6,1436300,174.064,65 +json_read,1,0,3050300,81.960,40 +json_read,1,1,3101500,80.609,40 +json_read,1,2,3105000,80.517,40 +json_read,1,3,3125900,79.979,40 +json_read,1,4,3127800,79.929,40 +json_read,1,5,3141600,79.579,40 +json_read,1,6,3122900,80.054,40 +json_write,1,0,6081200,41.111,40 +json_write,1,1,6097200,41.003,40 +json_write,1,2,6098100,40.997,40 +json_write,1,3,6074400,41.156,40 +json_write,1,4,5854600,42.702,40 +json_write,1,5,5935600,42.120,40 +json_write,1,6,6011700,41.586,40 +xml_read,1000,0,1400,190365.578,53795 +xml_read,1000,1,1400,191599.286,53795 +xml_read,1000,2,1400,184137.024,53795 +xml_read,1000,3,1400,184363.999,53795 +xml_read,1000,4,1400,187084.321,53795 +xml_read,1000,5,1400,185500.684,53795 +xml_read,1000,6,1400,185555.551,53795 +xml_write,1000,0,4900,51462.179,53795 +xml_write,1000,1,4900,51465.811,53795 +xml_write,1000,2,4900,51382.035,53795 +xml_write,1000,3,4900,51364.249,53795 +xml_write,1000,4,4900,51420.229,53795 +xml_write,1000,5,4900,51769.206,53795 +xml_write,1000,6,4900,51213.117,53795 +json_read,1000,0,4300,58388.971,31792 +json_read,1000,1,4300,58713.370,31792 +json_read,1000,2,4200,60100.317,31792 +json_read,1000,3,4300,59117.632,31792 +json_read,1000,4,4300,58490.480,31792 +json_read,1000,5,4300,58682.389,31792 +json_read,1000,6,4200,60225.274,31792 +json_write,1000,0,9400,26623.426,31792 +json_write,1000,1,9000,28061.242,31792 +json_write,1000,2,9400,26772.551,31792 +json_write,1000,3,9300,27062.949,31792 +json_write,1000,4,9500,26528.981,31792 +json_write,1000,5,9400,26876.503,31792 +json_write,1000,6,9300,26901.149,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-batch.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-batch.rs new file mode 100644 index 0000000..aaf3cf2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed-batch.rs @@ -0,0 +1,307 @@ +// @generated by PolyXML Compiler (https://github.com/polyxml/PolyXML) +#![allow(dead_code, unused_imports, unused_mut, unused_variables, unused_assignments, non_camel_case_types, non_snake_case)] + +use std::borrow::Cow; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; +use quick_xml::events::{BytesEnd, BytesStart, BytesText, Event}; +use quick_xml::{Reader, Writer}; +use polyxml::{PolyXmlError, Result}; + +#[allow(dead_code)] +pub(crate) fn skip_xml_element(reader: &mut Reader<&[u8]>) -> Result<()> { + let mut depth = 1; + loop { + match reader.read_event()? { + Event::Start(_) => depth += 1, + Event::End(_) => { + depth -= 1; + if depth == 0 { + break; + } + } + Event::Eof => break, + _ => {} + } + } + Ok(()) +} + +#[allow(dead_code)] +pub(crate) fn read_element_text<'a>(reader: &mut Reader<&'a [u8]>, tag_name: &str) -> Result> { + let mut text = Cow::Borrowed(""); + loop { + match reader.read_event()? { + Event::Text(t) => { + let raw = match t.into_inner() { + Cow::Borrowed(b) => match quick_xml::escape::unescape(b)? { + Cow::Borrowed(s) => Cow::Borrowed(s), + Cow::Owned(s) => Cow::Owned(s), + }, + Cow::Owned(s) => Cow::Owned(quick_xml::escape::unescape(&s)?.into_owned()), + }; + if text.is_empty() { + text = raw; + } else { + text.to_mut().push_str(&raw); + } + } + Event::CData(c) => { + text.to_mut().push_str(c.as_ref()); + } + Event::GeneralRef(r) => { + if r.is_char_ref() { + if let Some(ch) = r.resolve_char_ref()? { + text.to_mut().push(ch); + } + } else if let Some(val) = quick_xml::escape::resolve_xml_entity(r.as_ref()) { + text.to_mut().push_str(val); + } else { + text.to_mut().push_str(r.as_ref()); + } + } + Event::End(e) if e.local_name().as_ref() == tag_name => break, + Event::Eof => break, + _ => {} + } + } + Ok(text) +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct BatchType<'a> { + #[serde(rename = "Sensor", default, skip_serializing_if = "Vec::is_empty")] + pub sensor: Vec>, +} + +impl<'a> BatchType<'a> { + pub fn from_xml(xml: &'a str) -> Result + { + let mut reader = Reader::from_str(xml); + loop { + match reader.read_event()? { + Event::Start(e) => return Self::decode_xml(&mut reader, &e), + Event::Empty(e) => return Self::decode_xml_empty(&e), + Event::Eof => break, + _ => {} + } + } + Err(PolyXmlError::SchemaError("Unexpected EOF while parsing BatchType".into())) + } + + pub fn from_xml_bytes(xml_bytes: &'a [u8]) -> Result + { + let s = std::str::from_utf8(xml_bytes)?; + Self::from_xml(s) + } + + pub fn decode_xml(reader: &mut Reader<&'a [u8]>, start: &BytesStart<'_>) -> Result + { + let mut var_sensor = Vec::new(); + + loop { + match reader.read_event()? { + Event::Start(e) => match e.local_name().as_ref() { + "Sensor" => { + let val = SensorType::decode_xml(reader, &e)?; + var_sensor.push(val); + } + _ => { + skip_xml_element(reader)?; + } + }, + Event::Empty(e) => match e.local_name().as_ref() { + "Sensor" => { + let val = SensorType::decode_xml_empty(&e)?; + var_sensor.push(val); + } + _ => {} + }, + Event::End(e) if e.local_name().as_ref() == start.local_name().as_ref() => break, + Event::Eof => break, + _ => {} + } + } + + Ok(Self { + sensor: var_sensor, + }) + } + + pub fn decode_xml_empty(start: &BytesStart<'_>) -> Result { + let var_sensor = Vec::new(); + + Ok(Self { + sensor: var_sensor, + }) + } + + pub fn to_xml(&self) -> Result> { + let mut buf = Vec::new(); + let mut writer = Writer::new(std::io::Cursor::new(&mut buf)); + self.encode_xml(&mut writer, None)?; + Ok(buf) + } + + pub fn to_xml_string(&self) -> Result { + let bytes = self.to_xml()?; + String::from_utf8(bytes).map_err(|e| PolyXmlError::Utf8Error(e.utf8_error())) + } + + pub fn from_json_str(json_str: &'a str) -> std::result::Result + { + serde_json::from_str(json_str) + } + + pub fn from_json_slice(bytes: &'a [u8]) -> std::result::Result + { + serde_json::from_slice(bytes) + } + + pub fn to_json_string(&self) -> std::result::Result { + serde_json::to_string(self) + } + + pub fn to_json_vec(&self) -> std::result::Result, serde_json::Error> { + serde_json::to_vec(self) + } + + pub fn encode_xml(&self, writer: &mut Writer, tag_name: Option<&str>) -> Result<()> { + let tag = tag_name.unwrap_or("BatchType"); + let mut start = BytesStart::new(tag); + writer.write_event(Event::Start(start))?; + for item in &self.sensor { + item.encode_xml(writer, Some("Sensor"))?; + } + writer.write_event(Event::End(BytesEnd::new(tag)))?; + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct SensorType<'a> { + #[serde(rename = "Id")] + pub id: Cow<'a, str>, + #[serde(rename = "Value")] + pub value: i32, +} + +impl<'a> SensorType<'a> { + pub fn from_xml(xml: &'a str) -> Result + { + let mut reader = Reader::from_str(xml); + loop { + match reader.read_event()? { + Event::Start(e) => return Self::decode_xml(&mut reader, &e), + Event::Empty(e) => return Self::decode_xml_empty(&e), + Event::Eof => break, + _ => {} + } + } + Err(PolyXmlError::SchemaError("Unexpected EOF while parsing SensorType".into())) + } + + pub fn from_xml_bytes(xml_bytes: &'a [u8]) -> Result + { + let s = std::str::from_utf8(xml_bytes)?; + Self::from_xml(s) + } + + pub fn decode_xml(reader: &mut Reader<&'a [u8]>, start: &BytesStart<'_>) -> Result + { + let mut var_id = None; + let mut var_value = None; + + loop { + match reader.read_event()? { + Event::Start(e) => match e.local_name().as_ref() { + "Id" => { + let text = read_element_text(reader, "Id")?; + var_id = Some(text); + } + "Value" => { + let text = read_element_text(reader, "Value")?; + let s = text.trim(); + let val = s.parse::().map_err(|_| PolyXmlError::ScalarParseError { field: "value".into(), expected: "i32", value: s.into() })?; + var_value = Some(val); + } + _ => { + skip_xml_element(reader)?; + } + }, + Event::Empty(e) => match e.local_name().as_ref() { + "Id" => { + var_id = Some(Cow::Borrowed("")); + } + "Value" => { + } + _ => {} + }, + Event::End(e) if e.local_name().as_ref() == start.local_name().as_ref() => break, + Event::Eof => break, + _ => {} + } + } + + Ok(Self { + id: var_id.ok_or_else(|| PolyXmlError::SchemaError("Missing required field 'Id'".into()))?, + value: var_value.ok_or_else(|| PolyXmlError::SchemaError("Missing required field 'Value'".into()))?, + }) + } + + pub fn decode_xml_empty(start: &BytesStart<'_>) -> Result { + let mut var_id = None; + let mut var_value = None; + + Ok(Self { + id: var_id.unwrap_or(Cow::Borrowed("")), + value: var_value.unwrap_or_default(), + }) + } + + pub fn to_xml(&self) -> Result> { + let mut buf = Vec::new(); + let mut writer = Writer::new(std::io::Cursor::new(&mut buf)); + self.encode_xml(&mut writer, None)?; + Ok(buf) + } + + pub fn to_xml_string(&self) -> Result { + let bytes = self.to_xml()?; + String::from_utf8(bytes).map_err(|e| PolyXmlError::Utf8Error(e.utf8_error())) + } + + pub fn from_json_str(json_str: &'a str) -> std::result::Result + { + serde_json::from_str(json_str) + } + + pub fn from_json_slice(bytes: &'a [u8]) -> std::result::Result + { + serde_json::from_slice(bytes) + } + + pub fn to_json_string(&self) -> std::result::Result { + serde_json::to_string(self) + } + + pub fn to_json_vec(&self) -> std::result::Result, serde_json::Error> { + serde_json::to_vec(self) + } + + pub fn encode_xml(&self, writer: &mut Writer, tag_name: Option<&str>) -> Result<()> { + let tag = tag_name.unwrap_or("SensorType"); + let mut start = BytesStart::new(tag); + writer.write_event(Event::Start(start))?; + writer.write_event(Event::Start(BytesStart::new("Id")))?; + writer.write_event(Event::Text(BytesText::new(self.id.as_ref())))?; + writer.write_event(Event::End(BytesEnd::new("Id")))?; + writer.write_event(Event::Start(BytesStart::new("Value")))?; + writer.write_event(Event::Text(BytesText::new(&self.value.to_string())))?; + writer.write_event(Event::End(BytesEnd::new("Value")))?; + writer.write_event(Event::End(BytesEnd::new(tag)))?; + Ok(()) + } +} + +pub type Batch<'a> = BatchType<'a>; diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed.lock new file mode 100644 index 0000000..f8e578e --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-borrowed.lock @@ -0,0 +1,320 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "xml-regression" +version = "0.0.0" +dependencies = [ + "polyxml", + "quick-xml", + "serde", + "serde_json", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-build.txt new file mode 100644 index 0000000..9bdd199 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-build.txt @@ -0,0 +1,20 @@ +memcap: <=7839 MiB (60% of 13066 MiB available) [systemd MemoryMax, swap off] + Compiling polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling polyxml-cli v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-cli) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.95s +Parsing schema: /home/bailey/github/PolyXML/benchmarks/workloads/sensor-batch/batch.xsd + Types: 2 total (2 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 1 +Code generation complete. +memcap: <=7840 MiB (60% of 13066 MiB available) [systemd MemoryMax, swap off] + Compiling polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling xml-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/current-borrowed) + Finished `release` profile [optimized] target(s) in 24.92s +Parsing schema: /home/bailey/github/PolyXML/benchmarks/workloads/sensor-batch/batch.xsd + Types: 2 total (2 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 1 +Code generation complete. +memcap: <=7818 MiB (60% of 13030 MiB available) [systemd MemoryMax, swap off] + Compiling polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling xml-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/current-owned) + Finished `release` profile [optimized] target(s) in 24.83s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-0.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-0.csv new file mode 100644 index 0000000..06fdd45 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-0.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,800000,312.520,65 +xml_read,1,1,803100,311.323,65 +xml_read,1,2,761400,328.377,65 +xml_read,1,3,778500,321.143,65 +xml_read,1,4,790300,316.346,65 +xml_read,1,5,801000,312.138,65 +xml_read,1,6,800600,312.279,65 +xml_write,1,0,1380000,181.166,65 +xml_write,1,1,1413600,176.858,65 +xml_write,1,2,1384400,180.588,65 +xml_write,1,3,1410100,177.296,65 +xml_write,1,4,1388300,180.078,65 +xml_write,1,5,1389800,179.891,65 +xml_write,1,6,1391300,179.690,65 +json_read,1,0,3048600,82.006,40 +json_read,1,1,3036100,82.343,40 +json_read,1,2,3106500,80.478,40 +json_read,1,3,3105000,80.516,40 +json_read,1,4,3079300,81.188,40 +json_read,1,5,3084000,81.066,40 +json_read,1,6,3116500,80.220,40 +json_write,1,0,6851000,36.491,40 +json_write,1,1,6769800,36.929,40 +json_write,1,2,6733600,37.127,40 +json_write,1,3,6861700,36.434,40 +json_write,1,4,6737200,37.108,40 +json_write,1,5,6705000,37.286,40 +json_write,1,6,6812200,36.699,40 +xml_read,1000,0,1100,231946.629,53795 +xml_read,1000,1,1100,232801.199,53795 +xml_read,1000,2,1100,234026.129,53795 +xml_read,1000,3,1100,236276.300,53795 +xml_read,1000,4,1100,232669.983,53795 +xml_read,1000,5,1100,233177.855,53795 +xml_read,1000,6,1100,234965.029,53795 +xml_write,1000,0,3200,80564.444,53795 +xml_write,1000,1,3200,79747.933,53795 +xml_write,1000,2,2800,91212.650,53795 +xml_write,1000,3,2900,86951.967,53795 +xml_write,1000,4,3100,80698.861,53795 +xml_write,1000,5,3200,79843.321,53795 +xml_write,1000,6,3200,79917.821,53795 +json_read,1000,0,4200,60239.515,31792 +json_read,1000,1,4200,60263.191,31792 +json_read,1000,2,4300,59441.887,31792 +json_read,1000,3,4300,59431.815,31792 +json_read,1000,4,4200,59710.053,31792 +json_read,1000,5,4200,59894.996,31792 +json_read,1000,6,4200,59610.010,31792 +json_write,1000,0,10000,25118.306,31792 +json_write,1000,1,10500,23931.980,31792 +json_write,1000,2,10000,25004.418,31792 +json_write,1000,3,10500,23930.295,31792 +json_write,1000,4,10400,24052.177,31792 +json_write,1000,5,10000,25117.633,31792 +json_write,1000,6,10400,24115.481,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-1.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-1.csv new file mode 100644 index 0000000..32a4553 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-1.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,771300,324.161,65 +xml_read,1,1,801300,312.026,65 +xml_read,1,2,796400,313.919,65 +xml_read,1,3,786300,317.967,65 +xml_read,1,4,801100,312.077,65 +xml_read,1,5,794000,314.868,65 +xml_read,1,6,791100,316.038,65 +xml_write,1,0,1406200,177.790,65 +xml_write,1,1,1412700,176.972,65 +xml_write,1,2,1410100,177.304,65 +xml_write,1,3,1413500,176.875,65 +xml_write,1,4,1402300,178.283,65 +xml_write,1,5,1414000,176.814,65 +xml_write,1,6,1405200,177.914,65 +json_read,1,0,3092700,80.836,40 +json_read,1,1,3076000,81.274,40 +json_read,1,2,3087100,80.984,40 +json_read,1,3,3083800,81.069,40 +json_read,1,4,3107400,80.454,40 +json_read,1,5,3097700,80.707,40 +json_read,1,6,3082500,81.105,40 +json_write,1,0,6873800,36.370,40 +json_write,1,1,6613000,37.804,40 +json_write,1,2,6692200,37.357,40 +json_write,1,3,6810500,36.708,40 +json_write,1,4,6908300,36.188,40 +json_write,1,5,6892000,36.274,40 +json_write,1,6,6880500,36.335,40 +xml_read,1000,0,1100,238100.315,53795 +xml_read,1000,1,1100,232541.835,53795 +xml_read,1000,2,1100,232604.755,53795 +xml_read,1000,3,1100,234355.271,53795 +xml_read,1000,4,1100,234814.422,53795 +xml_read,1000,5,1100,232705.448,53795 +xml_read,1000,6,1100,232471.955,53795 +xml_write,1000,0,3100,81620.132,53795 +xml_write,1000,1,3200,80398.776,53795 +xml_write,1000,2,3200,79741.282,53795 +xml_write,1000,3,3200,79630.319,53795 +xml_write,1000,4,3100,80725.415,53795 +xml_write,1000,5,3100,82774.011,53795 +xml_write,1000,6,3100,81965.306,53795 +json_read,1000,0,4100,61990.718,31792 +json_read,1000,1,4200,60626.126,31792 +json_read,1000,2,4200,59562.836,31792 +json_read,1000,3,4000,63250.537,31792 +json_read,1000,4,4300,59292.662,31792 +json_read,1000,5,4200,60442.482,31792 +json_read,1000,6,4300,59141.852,31792 +json_write,1000,0,10300,24326.595,31792 +json_write,1000,1,10300,24314.244,31792 +json_write,1000,2,10100,24909.965,31792 +json_write,1000,3,10300,24402.426,31792 +json_write,1000,4,10400,24232.984,31792 +json_write,1000,5,10400,24212.595,31792 +json_write,1000,6,10300,24403.031,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-2.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-2.csv new file mode 100644 index 0000000..f436f54 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-2.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,769700,324.803,65 +xml_read,1,1,797100,313.654,65 +xml_read,1,2,771600,324.025,65 +xml_read,1,3,804900,310.614,65 +xml_read,1,4,720900,346.826,65 +xml_read,1,5,800800,312.217,65 +xml_read,1,6,779700,320.649,65 +xml_write,1,0,1411000,177.185,65 +xml_write,1,1,1386100,180.363,65 +xml_write,1,2,1392900,179.483,65 +xml_write,1,3,1405500,177.875,65 +xml_write,1,4,1408700,177.479,65 +xml_write,1,5,1372300,182.186,65 +xml_write,1,6,1404000,178.069,65 +json_read,1,0,3094500,80.789,40 +json_read,1,1,3132000,79.822,40 +json_read,1,2,3122200,80.074,40 +json_read,1,3,3100700,80.629,40 +json_read,1,4,3120500,80.116,40 +json_read,1,5,3132100,79.819,40 +json_read,1,6,3109500,80.400,40 +json_write,1,0,6884300,36.315,40 +json_write,1,1,6859500,36.446,40 +json_write,1,2,6899900,36.233,40 +json_write,1,3,6745800,37.060,40 +json_write,1,4,6840400,36.548,40 +json_write,1,5,6830200,36.603,40 +json_write,1,6,6745200,37.064,40 +xml_read,1000,0,1100,235116.396,53795 +xml_read,1000,1,1100,231260.446,53795 +xml_read,1000,2,1100,231988.988,53795 +xml_read,1000,3,1100,230769.071,53795 +xml_read,1000,4,1100,233747.427,53795 +xml_read,1000,5,1100,235614.688,53795 +xml_read,1000,6,1100,238330.470,53795 +xml_write,1000,0,3200,79892.218,53795 +xml_write,1000,1,3100,80646.540,53795 +xml_write,1000,2,2900,87476.088,53795 +xml_write,1000,3,3000,83749.795,53795 +xml_write,1000,4,3100,80871.235,53795 +xml_write,1000,5,3200,80385.280,53795 +xml_write,1000,6,3100,81833.489,53795 +json_read,1000,0,4300,59478.399,31792 +json_read,1000,1,4300,59136.712,31792 +json_read,1000,2,4100,61044.084,31792 +json_read,1000,3,4300,59252.316,31792 +json_read,1000,4,4200,59938.303,31792 +json_read,1000,5,4300,59031.757,31792 +json_read,1000,6,4300,59433.747,31792 +json_write,1000,0,10400,24240.645,31792 +json_write,1000,1,10500,24022.514,31792 +json_write,1000,2,10500,23910.609,31792 +json_write,1000,3,10400,24085.161,31792 +json_write,1000,4,10400,24083.207,31792 +json_write,1000,5,10100,24891.708,31792 +json_write,1000,6,10400,24115.996,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-3.csv b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-3.csv new file mode 100644 index 0000000..4fdf968 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-3.csv @@ -0,0 +1,57 @@ +operation,count,repeat,iterations,ns_per_op,bytes +xml_read,1,0,795900,314.142,65 +xml_read,1,1,797800,313.373,65 +xml_read,1,2,799200,312.826,65 +xml_read,1,3,801900,311.780,65 +xml_read,1,4,781800,319.792,65 +xml_read,1,5,740800,337.495,65 +xml_read,1,6,786400,317.929,65 +xml_write,1,0,1394000,179.345,65 +xml_write,1,1,1280600,195.230,65 +xml_write,1,2,1386700,180.287,65 +xml_write,1,3,1354800,184.542,65 +xml_write,1,4,1412000,177.056,65 +xml_write,1,5,1397400,178.910,65 +xml_write,1,6,1411800,177.081,65 +json_read,1,0,3106500,80.478,40 +json_read,1,1,3096800,80.733,40 +json_read,1,2,3066300,81.532,40 +json_read,1,3,3111400,80.352,40 +json_read,1,4,3093500,80.816,40 +json_read,1,5,3094700,80.784,40 +json_read,1,6,3091700,80.863,40 +json_write,1,0,6593700,37.915,40 +json_write,1,1,6667500,37.495,40 +json_write,1,2,6780400,36.871,40 +json_write,1,3,6746300,37.058,40 +json_write,1,4,6849800,36.498,40 +json_write,1,5,6851500,36.488,40 +json_write,1,6,6909800,36.181,40 +xml_read,1000,0,1100,240464.105,53795 +xml_read,1000,1,1100,235349.094,53795 +xml_read,1000,2,1100,235796.017,53795 +xml_read,1000,3,1100,244295.601,53795 +xml_read,1000,4,1100,235124.186,53795 +xml_read,1000,5,1100,233037.098,53795 +xml_read,1000,6,1100,231901.484,53795 +xml_write,1000,0,3200,79968.575,53795 +xml_write,1000,1,3200,80231.527,53795 +xml_write,1000,2,3200,80191.595,53795 +xml_write,1000,3,3200,80127.517,53795 +xml_write,1000,4,3200,80284.771,53795 +xml_write,1000,5,3100,80706.990,53795 +xml_write,1000,6,3100,80801.672,53795 +json_read,1000,0,4200,59535.276,31792 +json_read,1000,1,4100,61196.215,31792 +json_read,1000,2,3900,64570.246,31792 +json_read,1000,3,4200,60283.326,31792 +json_read,1000,4,4300,59286.441,31792 +json_read,1000,5,4300,59446.377,31792 +json_read,1000,6,4300,59383.528,31792 +json_write,1000,0,10500,23837.193,31792 +json_write,1000,1,10500,23874.949,31792 +json_write,1000,2,10500,23842.879,31792 +json_write,1000,3,10500,23932.471,31792 +json_write,1000,4,10300,24284.773,31792 +json_write,1000,5,10500,23938.661,31792 +json_write,1000,6,10500,23909.484,31792 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-batch.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-batch.rs new file mode 100644 index 0000000..1b02437 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned-batch.rs @@ -0,0 +1,297 @@ +// @generated by PolyXML Compiler (https://github.com/polyxml/PolyXML) +#![allow(dead_code, unused_imports, unused_mut, unused_variables, unused_assignments, non_camel_case_types, non_snake_case)] + +use std::borrow::Cow; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; +use quick_xml::events::{BytesEnd, BytesStart, BytesText, Event}; +use quick_xml::{Reader, Writer}; +use polyxml::{PolyXmlError, Result}; + +#[allow(dead_code)] +pub(crate) fn skip_xml_element(reader: &mut Reader<&[u8]>) -> Result<()> { + let mut depth = 1; + loop { + match reader.read_event()? { + Event::Start(_) => depth += 1, + Event::End(_) => { + depth -= 1; + if depth == 0 { + break; + } + } + Event::Eof => break, + _ => {} + } + } + Ok(()) +} + +#[allow(dead_code)] +pub(crate) fn read_element_text(reader: &mut Reader<&[u8]>, tag_name: &str) -> Result { + let mut text = String::new(); + loop { + match reader.read_event()? { + Event::Text(t) => { + let unescaped = quick_xml::escape::unescape(t.as_ref())?; + text.push_str(&unescaped); + } + Event::CData(c) => { + text.push_str(c.as_ref()); + } + Event::GeneralRef(r) => { + if r.is_char_ref() { + if let Some(ch) = r.resolve_char_ref()? { + text.push(ch); + } + } else if let Some(val) = quick_xml::escape::resolve_xml_entity(r.as_ref()) { + text.push_str(val); + } else { + text.push_str(r.as_ref()); + } + } + Event::End(e) if e.local_name().as_ref() == tag_name => break, + Event::Eof => break, + _ => {} + } + } + Ok(text) +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct BatchType { + #[serde(rename = "Sensor", default, skip_serializing_if = "Vec::is_empty")] + pub sensor: Vec, +} + +impl BatchType { + pub fn from_xml(xml: &str) -> Result + { + let mut reader = Reader::from_str(xml); + loop { + match reader.read_event()? { + Event::Start(e) => return Self::decode_xml(&mut reader, &e), + Event::Empty(e) => return Self::decode_xml_empty(&e), + Event::Eof => break, + _ => {} + } + } + Err(PolyXmlError::SchemaError("Unexpected EOF while parsing BatchType".into())) + } + + pub fn from_xml_bytes(xml_bytes: &[u8]) -> Result + { + let s = std::str::from_utf8(xml_bytes)?; + Self::from_xml(s) + } + + pub fn decode_xml(reader: &mut Reader<&'_ [u8]>, start: &BytesStart<'_>) -> Result + { + let mut var_sensor = Vec::new(); + + loop { + match reader.read_event()? { + Event::Start(e) => match e.local_name().as_ref() { + "Sensor" => { + let val = SensorType::decode_xml(reader, &e)?; + var_sensor.push(val); + } + _ => { + skip_xml_element(reader)?; + } + }, + Event::Empty(e) => match e.local_name().as_ref() { + "Sensor" => { + let val = SensorType::decode_xml_empty(&e)?; + var_sensor.push(val); + } + _ => {} + }, + Event::End(e) if e.local_name().as_ref() == start.local_name().as_ref() => break, + Event::Eof => break, + _ => {} + } + } + + Ok(Self { + sensor: var_sensor, + }) + } + + pub fn decode_xml_empty(start: &BytesStart<'_>) -> Result { + let var_sensor = Vec::new(); + + Ok(Self { + sensor: var_sensor, + }) + } + + pub fn to_xml(&self) -> Result> { + let mut buf = Vec::new(); + let mut writer = Writer::new(std::io::Cursor::new(&mut buf)); + self.encode_xml(&mut writer, None)?; + Ok(buf) + } + + pub fn to_xml_string(&self) -> Result { + let bytes = self.to_xml()?; + String::from_utf8(bytes).map_err(|e| PolyXmlError::Utf8Error(e.utf8_error())) + } + + pub fn from_json_str(json_str: &str) -> std::result::Result + { + serde_json::from_str(json_str) + } + + pub fn from_json_slice(bytes: &[u8]) -> std::result::Result + { + serde_json::from_slice(bytes) + } + + pub fn to_json_string(&self) -> std::result::Result { + serde_json::to_string(self) + } + + pub fn to_json_vec(&self) -> std::result::Result, serde_json::Error> { + serde_json::to_vec(self) + } + + pub fn encode_xml(&self, writer: &mut Writer, tag_name: Option<&str>) -> Result<()> { + let tag = tag_name.unwrap_or("BatchType"); + let mut start = BytesStart::new(tag); + writer.write_event(Event::Start(start))?; + for item in &self.sensor { + item.encode_xml(writer, Some("Sensor"))?; + } + writer.write_event(Event::End(BytesEnd::new(tag)))?; + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +pub struct SensorType { + #[serde(rename = "Id")] + pub id: String, + #[serde(rename = "Value")] + pub value: i32, +} + +impl SensorType { + pub fn from_xml(xml: &str) -> Result + { + let mut reader = Reader::from_str(xml); + loop { + match reader.read_event()? { + Event::Start(e) => return Self::decode_xml(&mut reader, &e), + Event::Empty(e) => return Self::decode_xml_empty(&e), + Event::Eof => break, + _ => {} + } + } + Err(PolyXmlError::SchemaError("Unexpected EOF while parsing SensorType".into())) + } + + pub fn from_xml_bytes(xml_bytes: &[u8]) -> Result + { + let s = std::str::from_utf8(xml_bytes)?; + Self::from_xml(s) + } + + pub fn decode_xml(reader: &mut Reader<&'_ [u8]>, start: &BytesStart<'_>) -> Result + { + let mut var_id = None; + let mut var_value = None; + + loop { + match reader.read_event()? { + Event::Start(e) => match e.local_name().as_ref() { + "Id" => { + let text = read_element_text(reader, "Id")?; + var_id = Some(text); + } + "Value" => { + let text = read_element_text(reader, "Value")?; + let s = text.trim(); + let val = s.parse::().map_err(|_| PolyXmlError::ScalarParseError { field: "value".into(), expected: "i32", value: s.into() })?; + var_value = Some(val); + } + _ => { + skip_xml_element(reader)?; + } + }, + Event::Empty(e) => match e.local_name().as_ref() { + "Id" => { + var_id = Some(String::new()); + } + "Value" => { + } + _ => {} + }, + Event::End(e) if e.local_name().as_ref() == start.local_name().as_ref() => break, + Event::Eof => break, + _ => {} + } + } + + Ok(Self { + id: var_id.ok_or_else(|| PolyXmlError::SchemaError("Missing required field 'Id'".into()))?, + value: var_value.ok_or_else(|| PolyXmlError::SchemaError("Missing required field 'Value'".into()))?, + }) + } + + pub fn decode_xml_empty(start: &BytesStart<'_>) -> Result { + let mut var_id = None; + let mut var_value = None; + + Ok(Self { + id: var_id.unwrap_or_default(), + value: var_value.unwrap_or_default(), + }) + } + + pub fn to_xml(&self) -> Result> { + let mut buf = Vec::new(); + let mut writer = Writer::new(std::io::Cursor::new(&mut buf)); + self.encode_xml(&mut writer, None)?; + Ok(buf) + } + + pub fn to_xml_string(&self) -> Result { + let bytes = self.to_xml()?; + String::from_utf8(bytes).map_err(|e| PolyXmlError::Utf8Error(e.utf8_error())) + } + + pub fn from_json_str(json_str: &str) -> std::result::Result + { + serde_json::from_str(json_str) + } + + pub fn from_json_slice(bytes: &[u8]) -> std::result::Result + { + serde_json::from_slice(bytes) + } + + pub fn to_json_string(&self) -> std::result::Result { + serde_json::to_string(self) + } + + pub fn to_json_vec(&self) -> std::result::Result, serde_json::Error> { + serde_json::to_vec(self) + } + + pub fn encode_xml(&self, writer: &mut Writer, tag_name: Option<&str>) -> Result<()> { + let tag = tag_name.unwrap_or("SensorType"); + let mut start = BytesStart::new(tag); + writer.write_event(Event::Start(start))?; + writer.write_event(Event::Start(BytesStart::new("Id")))?; + writer.write_event(Event::Text(BytesText::new(self.id.as_ref())))?; + writer.write_event(Event::End(BytesEnd::new("Id")))?; + writer.write_event(Event::Start(BytesStart::new("Value")))?; + writer.write_event(Event::Text(BytesText::new(&self.value.to_string())))?; + writer.write_event(Event::End(BytesEnd::new("Value")))?; + writer.write_event(Event::End(BytesEnd::new(tag)))?; + Ok(()) + } +} + +pub type Batch = BatchType; diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned.lock new file mode 100644 index 0000000..f8e578e --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/current-owned.lock @@ -0,0 +1,320 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "xml-regression" +version = "0.0.0" +dependencies = [ + "polyxml", + "quick-xml", + "serde", + "serde_json", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/harness.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/harness.rs new file mode 100644 index 0000000..b8a10eb --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/harness.rs @@ -0,0 +1,83 @@ +use std::{ + hint::black_box, + time::{Duration, Instant}, +}; +mod batch; + +fn measure(mut f: impl FnMut(), operation: &str, count: usize, bytes: usize) { + for _ in 0..100 { + f(); + } + for repeat in 0..7 { + let start = Instant::now(); + let mut iterations = 0; + while start.elapsed() < Duration::from_millis(250) { + for _ in 0..100 { + f(); + } + iterations += 100; + } + println!( + "{operation},{count},{repeat},{iterations},{:.3},{bytes}", + start.elapsed().as_nanos() as f64 / iterations as f64 + ); + } +} +fn check(value: &batch::BatchType<'_>, count: usize) { + assert_eq!(value.sensor.len(), count); + for (i, sensor) in value.sensor.iter().enumerate() { + assert_eq!(sensor.id, format!("sensor-{i}")); + assert_eq!(sensor.value, i as i32); + } +} +fn main() { + let fixtures = std::env::args().nth(1).expect("fixture directory"); + println!("operation,count,repeat,iterations,ns_per_op,bytes"); + for count in [1, 1000] { + let xml = std::fs::read_to_string(format!("{fixtures}/sensor-{count}.xml")).unwrap(); + let parsed = batch::BatchType::from_xml(&xml).unwrap(); + check(&parsed, count); + let mut writer = quick_xml::Writer::new(Vec::new()); + parsed.encode_xml(&mut writer, Some("Batch")).unwrap(); + let output = writer.into_inner(); + check(&batch::BatchType::from_xml_bytes(&output).unwrap(), count); + let json = serde_json::to_string(&parsed).unwrap(); + check(&serde_json::from_str(&json).unwrap(), count); + measure( + || { + black_box(batch::BatchType::from_xml(black_box(&xml)).unwrap()); + }, + "xml_read", + count, + xml.len(), + ); + measure( + || { + let mut writer = quick_xml::Writer::new(Vec::new()); + black_box(&parsed) + .encode_xml(&mut writer, Some("Batch")) + .unwrap(); + black_box(writer.into_inner()); + }, + "xml_write", + count, + output.len(), + ); + measure( + || { + black_box(serde_json::from_str::>(black_box(&json)).unwrap()); + }, + "json_read", + count, + json.len(), + ); + measure( + || { + black_box(serde_json::to_vec(black_box(&parsed)).unwrap()); + }, + "json_write", + count, + json.len(), + ); + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/metadata.json new file mode 100644 index 0000000..98710ca --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/metadata.json @@ -0,0 +1,12 @@ +{ + "os": "Linux-6.18.40.1-microsoft-standard-WSL2-x86_64-with-glibc2.43", + "cpu": "11th Gen Intel(R) Core(TM) i5-11600K @ 3.90GHz", + "rounds": 4, + "warmup": "100 operations per operation/size", + "samples": "7 x >=250ms per operation/size/process", + "rustc": "rustc 1.99.0 (b940084d7 2026-09-28)\nbinary: rustc\ncommit-hash: b940084d7eb6a299eb4bfeb8e34901bc051e7ac4\ncommit-date: 2026-09-28\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.0\nLLVM version: 23.1.1\n", + "revisions": { + "baseline": "bbbd087a9a8e9838a32912973cd4029c30f29c08", + "current": "7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d" + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/summary.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/summary.json new file mode 100644 index 0000000..1c38ead --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-generated/summary.json @@ -0,0 +1,434 @@ +{ + "borrowed/json_read/1": { + "baseline_ns": 82.0875, + "candidate_ns": 80.2955, + "delta_percent": -2.1830363940916753, + "speedup": 1.0223175644961424, + "process_values_ns": { + "baseline": [ + 82.388, + 81.75, + 81.787, + 83.282 + ], + "current": [ + 80.158, + 80.433, + 81.54, + 80.054 + ] + }, + "process_deltas_percent": [ + -2.706704859931064, + -1.611009174311917, + -0.3020039859635393, + -3.875987608366749 + ], + "statistic": "median across process sample medians" + }, + "borrowed/json_read/1000": { + "baseline_ns": 60323.093, + "candidate_ns": 58903.306, + "delta_percent": -2.3536376027668227, + "speedup": 1.0241036895280546, + "process_values_ns": { + "baseline": [ + 60521.405, + 60243.156, + 60379.292, + 60266.894 + ], + "current": [ + 59175.735, + 58710.255, + 59093.242, + 58713.37 + ] + }, + "process_deltas_percent": [ + -2.2234612696119593, + -2.5445230658234563, + -2.129952103446331, + -2.577740276444307 + ], + "statistic": "median across process sample medians" + }, + "borrowed/json_write/1": { + "baseline_ns": 38.256, + "candidate_ns": 40.339, + "delta_percent": 5.444897532413218, + "speedup": 0.9483626267383921, + "process_values_ns": { + "baseline": [ + 38.695, + 38.357, + 38.117, + 38.155 + ], + "current": [ + 39.522, + 38.916, + 41.471, + 41.156 + ] + }, + "process_deltas_percent": [ + 2.1372270319162556, + 1.4573611074901516, + 8.79922344360784, + 7.865286332066557 + ], + "statistic": "median across process sample medians" + }, + "borrowed/json_write/1000": { + "baseline_ns": 25663.8825, + "candidate_ns": 25978.036, + "delta_percent": 1.2241074591889944, + "speedup": 0.9879069572464986, + "process_values_ns": { + "baseline": [ + 25663.313, + 25940.777, + 25664.452, + 25449.99 + ], + "current": [ + 26074.351, + 25881.721, + 25814.005, + 26876.503 + ] + }, + "process_deltas_percent": [ + 1.6016560293676818, + -0.22765702045084435, + 0.5827243067570764, + 5.60516133798088 + ], + "statistic": "median across process sample medians" + }, + "borrowed/xml_read/1": { + "baseline_ns": 300.03499999999997, + "candidate_ns": 287.2505, + "delta_percent": -4.261002882996978, + "speedup": 1.0445064499452568, + "process_values_ns": { + "baseline": [ + 300.385, + 302.046, + 299.685, + 299.655 + ], + "current": [ + 288.124, + 286.22, + 287.372, + 287.129 + ] + }, + "process_deltas_percent": [ + -4.081761739101475, + -5.239599266336903, + -4.108647413117106, + -4.180140494902451 + ], + "statistic": "median across process sample medians" + }, + "borrowed/xml_read/1000": { + "baseline_ns": 194653.6715, + "candidate_ns": 185728.8035, + "delta_percent": -4.584998541884677, + "speedup": 1.0480532250884822, + "process_values_ns": { + "baseline": [ + 194318.975, + 194988.368, + 193877.262, + 195159.815 + ], + "current": [ + 186515.871, + 185165.041, + 185902.056, + 185555.551 + ] + }, + "process_deltas_percent": [ + -4.015616076608053, + -5.037904107182434, + -4.113533437458994, + -4.921230326027926 + ], + "statistic": "median across process sample medians" + }, + "borrowed/xml_write/1": { + "baseline_ns": 170.83249999999998, + "candidate_ns": 171.236, + "delta_percent": 0.23619627412816424, + "speedup": 0.9976436029806816, + "process_values_ns": { + "baseline": [ + 170.59, + 170.252, + 171.463, + 171.075 + ], + "current": [ + 171.3, + 171.172, + 170.801, + 172.017 + ] + }, + "process_deltas_percent": [ + 0.416202591007675, + 0.5403754434602837, + -0.3860891271003086, + 0.5506356861025852 + ], + "statistic": "median across process sample medians" + }, + "borrowed/xml_write/1000": { + "baseline_ns": 54281.294, + "candidate_ns": 51676.5135, + "delta_percent": -4.79867060648923, + "speedup": 1.0504054999763093, + "process_values_ns": { + "baseline": [ + 54130.73, + 54431.858, + 53872.526, + 55303.228 + ], + "current": [ + 51877.138, + 52925.848, + 51475.889, + 51420.229 + ] + }, + "process_deltas_percent": [ + -4.163239623777482, + -2.766780439499239, + -4.4487184432376425, + -7.0212881606115385 + ], + "statistic": "median across process sample medians" + }, + "owned/json_read/1": { + "baseline_ns": 80.77850000000001, + "candidate_ns": 80.884, + "delta_percent": 0.13060405924842922, + "speedup": 0.9986956629246824, + "process_values_ns": { + "baseline": [ + 80.916, + 80.641, + 82.365, + 80.553 + ], + "current": [ + 81.066, + 80.984, + 80.116, + 80.784 + ] + }, + "process_deltas_percent": [ + 0.18537742844431104, + 0.4253419476444753, + -2.730528744005334, + 0.28676771814830637 + ], + "statistic": "median across process sample medians" + }, + "owned/json_read/1000": { + "baseline_ns": 59245.266, + "candidate_ns": 59622.6645, + "delta_percent": 0.6370103899947077, + "speedup": 0.9936702174724178, + "process_values_ns": { + "baseline": [ + 59379.771, + 59110.761, + 58822.587, + 60303.164 + ], + "current": [ + 59710.053, + 60442.482, + 59433.747, + 59535.276 + ] + }, + "process_deltas_percent": [ + 0.5562197267483526, + 2.2529248100866095, + 1.0389886456370956, + -1.2733792873620975 + ], + "statistic": "median across process sample medians" + }, + "owned/json_write/1": { + "baseline_ns": 36.562, + "candidate_ns": 36.709500000000006, + "delta_percent": 0.40342432033260156, + "speedup": 0.9959819665209276, + "process_values_ns": { + "baseline": [ + 37.024, + 37.253, + 36.093, + 36.1 + ], + "current": [ + 36.929, + 36.37, + 36.548, + 36.871 + ] + }, + "process_deltas_percent": [ + -0.2565903197925601, + -2.370278903712464, + 1.2606322555620109, + 2.1357340720221663 + ], + "statistic": "median across process sample medians" + }, + "owned/json_write/1000": { + "baseline_ns": 24243.841500000002, + "candidate_ns": 24100.321, + "delta_percent": -0.5919874538034886, + "speedup": 1.005955128149538, + "process_values_ns": { + "baseline": [ + 24357.375, + 24288.611, + 23934.693, + 24199.072 + ], + "current": [ + 24115.481, + 24326.595, + 24085.161, + 23909.484 + ] + }, + "process_deltas_percent": [ + -0.9931037314160451, + 0.15638605270593686, + 0.6286606642500026, + -1.1966905177190235 + ], + "statistic": "median across process sample medians" + }, + "owned/xml_read/1": { + "baseline_ns": 313.3, + "candidate_ns": 314.505, + "delta_percent": 0.38461538461538325, + "speedup": 0.996168582375479, + "process_values_ns": { + "baseline": [ + 312.604, + 313.057, + 314.716, + 313.543 + ], + "current": [ + 312.52, + 314.868, + 320.649, + 314.142 + ] + }, + "process_deltas_percent": [ + -0.0268710573121278, + 0.5784889013821681, + 1.8851917284154585, + 0.1910423769626357 + ], + "statistic": "median across process sample medians" + }, + "owned/xml_read/1000": { + "baseline_ns": 234470.7775, + "candidate_ns": 233462.641, + "delta_percent": -0.4299625355232095, + "speedup": 1.0043181919628845, + "process_values_ns": { + "baseline": [ + 234370.285, + 234375.853, + 234565.702, + 238183.975 + ], + "current": [ + 233177.855, + 232705.448, + 233747.427, + 235349.094 + ] + }, + "process_deltas_percent": [ + -0.5087803686375958, + -0.7127035394725589, + -0.34884682330923455, + -1.190206436012331 + ], + "statistic": "median across process sample medians" + }, + "owned/xml_write/1": { + "baseline_ns": 174.954, + "candidate_ns": 178.707, + "delta_percent": 2.1451352927055023, + "speedup": 0.9789991438499892, + "process_values_ns": { + "baseline": [ + 175.216, + 174.784, + 173.729, + 175.124 + ], + "current": [ + 179.891, + 177.304, + 178.069, + 179.345 + ] + }, + "process_deltas_percent": [ + 2.6681353301068356, + 1.4417795679238399, + 2.49814366052874, + 2.4102921358580165 + ], + "statistic": "median across process sample medians" + }, + "owned/xml_write/1000": { + "baseline_ns": 80084.0135, + "candidate_ns": 80644.9295, + "delta_percent": 0.7004094518814341, + "speedup": 0.9930446216088514, + "process_values_ns": { + "baseline": [ + 81013.157, + 80084.668, + 80083.359, + 80079.414 + ], + "current": [ + 80564.444, + 80725.415, + 80871.235, + 80231.527 + ] + }, + "process_deltas_percent": [ + -0.5538766993119393, + 0.8000869779468678, + 0.9838198719911428, + 0.18995268871473403 + ], + "statistic": "median across process sample medians" + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-0.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-0.txt new file mode 100644 index 0000000..7da9f72 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-0.txt @@ -0,0 +1,63 @@ +memcap: <=7823 MiB (60% of 13039 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0041 s (5.1M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [967.40 ns 970.10 ns 973.00 ns] + thrpt: [92.133 MiB/s 92.409 MiB/s 92.667 MiB/s] +Found 6 outliers among 100 measurements (6.00%) + 3 (3.00%) high mild + 3 (3.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 7.5721 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [750.25 µs 754.31 µs 759.36 µs] + thrpt: [80.265 MiB/s 80.803 MiB/s 81.240 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 6 (6.00%) high mild + 7 (7.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.2733 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.5513 ms 7.5858 ms 7.6329 ms] + thrpt: [83.576 MiB/s 84.094 MiB/s 84.479 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 5 (5.00%) high mild + 6 (6.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0005 s (19M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [254.07 ns 256.75 ns 259.97 ns] + thrpt: [344.83 MiB/s 349.15 MiB/s 352.84 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 3 (3.00%) high mild + 10 (10.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.0710 s (25k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [199.25 µs 200.60 µs 202.44 µs] + thrpt: [298.73 MiB/s 301.47 MiB/s 303.50 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 6 (6.00%) high mild + 4 (4.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 5.1982 s (2600 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [1.9969 ms 2.0052 ms 2.0148 ms] + thrpt: [314.25 MiB/s 315.76 MiB/s 317.07 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 2 (2.00%) high mild + 6 (6.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-1.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-1.txt new file mode 100644 index 0000000..168cb5b --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-1.txt @@ -0,0 +1,62 @@ +memcap: <=7884 MiB (60% of 13140 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0000 s (5.2M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [970.14 ns 977.09 ns 985.38 ns] + thrpt: [90.975 MiB/s 91.747 MiB/s 92.405 MiB/s] +Found 14 outliers among 100 measurements (14.00%) + 6 (6.00%) high mild + 8 (8.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 7.6116 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [756.38 µs 759.54 µs 763.34 µs] + thrpt: [79.847 MiB/s 80.246 MiB/s 80.581 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 2 (2.00%) high mild + 7 (7.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.3057 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.5587 ms 7.5976 ms 7.6481 ms] + thrpt: [83.409 MiB/s 83.964 MiB/s 84.395 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 5 (5.00%) high mild + 4 (4.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0008 s (20M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [258.02 ns 261.21 ns 264.65 ns] + thrpt: [338.73 MiB/s 343.19 MiB/s 347.44 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 3 (3.00%) high mild + 8 (8.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.0361 s (25k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [199.95 µs 201.71 µs 203.80 µs] + thrpt: [296.73 MiB/s 299.81 MiB/s 302.45 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 4 (4.00%) high mild + 7 (7.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 5.0071 s (2500 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [2.0021 ms 2.0153 ms 2.0312 ms] + thrpt: [311.71 MiB/s 314.17 MiB/s 316.25 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 10 (10.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-2.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-2.txt new file mode 100644 index 0000000..f145595 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-2.txt @@ -0,0 +1,63 @@ +memcap: <=7884 MiB (60% of 13140 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0035 s (5.2M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [969.13 ns 975.20 ns 982.03 ns] + thrpt: [91.286 MiB/s 91.925 MiB/s 92.501 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 5 (5.00%) high mild + 7 (7.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 7.7410 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [749.08 µs 751.55 µs 754.33 µs] + thrpt: [80.801 MiB/s 81.099 MiB/s 81.366 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 4 (4.00%) high mild + 5 (5.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.2995 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.5232 ms 7.5637 ms 7.6225 ms] + thrpt: [83.689 MiB/s 84.340 MiB/s 84.794 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 3 (3.00%) high mild + 5 (5.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0010 s (20M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [254.09 ns 255.22 ns 256.62 ns] + thrpt: [349.33 MiB/s 351.24 MiB/s 352.81 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 3 (3.00%) high mild + 6 (6.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.1711 s (25k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [199.61 µs 201.24 µs 203.19 µs] + thrpt: [297.62 MiB/s 300.51 MiB/s 302.96 MiB/s] +Found 6 outliers among 100 measurements (6.00%) + 3 (3.00%) high mild + 3 (3.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 5.0033 s (2500 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [1.9968 ms 2.0030 ms 2.0107 ms] + thrpt: [314.89 MiB/s 316.10 MiB/s 317.09 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 6 (6.00%) high mild + 4 (4.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-build.txt new file mode 100644 index 0000000..bdbf276 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline-build.txt @@ -0,0 +1,5 @@ +memcap: <=7882 MiB (60% of 13138 MiB available) [systemd MemoryMax, swap off] + Locking 1 package to highest compatible version + Downgrading polyxml v0.34.6 (/home/bailey/github/polyxml-perf-old/crates/polyxml-core) -> v0.27.0 + Compiling core-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/core-baseline) + Finished `bench` profile [optimized] target(s) in 2.42s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline.lock new file mode 100644 index 0000000..f6f0de7 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/baseline.lock @@ -0,0 +1,632 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "core-regression" +version = "0.0.0" +dependencies = [ + "criterion", + "polyxml", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "num-traits", + "oorandom", + "page_size", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.27.0" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-0.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-0.txt new file mode 100644 index 0000000..157de27 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-0.txt @@ -0,0 +1,64 @@ +memcap: <=7881 MiB (60% of 13136 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0048 s (4.9M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0017 µs 1.0065 µs 1.0121 µs] + thrpt: [88.571 MiB/s 89.068 MiB/s 89.493 MiB/s] +Found 14 outliers among 100 measurements (14.00%) + 4 (4.00%) high mild + 10 (10.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 7.9521 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [787.64 µs 796.62 µs 810.19 µs] + thrpt: [75.230 MiB/s 76.511 MiB/s 77.383 MiB/s] +Found 15 outliers among 100 measurements (15.00%) + 5 (5.00%) high mild + 10 (10.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.5068 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.8462 ms 7.9085 ms 7.9850 ms] + thrpt: [79.890 MiB/s 80.663 MiB/s 81.304 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 9 (9.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0003 s (22M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [226.75 ns 227.46 ns 228.26 ns] + thrpt: [392.74 MiB/s 394.11 MiB/s 395.34 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 8 (8.00%) high mild + 4 (4.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.4158 s (30k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [178.53 µs 180.08 µs 182.06 µs] + thrpt: [332.16 MiB/s 335.81 MiB/s 338.73 MiB/s] +Found 17 outliers among 100 measurements (17.00%) + 4 (4.00%) high mild + 13 (13.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s + +Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 9.1s, enable flat sampling, or reduce sample count to 50. +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 9.0778 s (5050 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [1.7960 ms 1.8090 ms 1.8249 ms] + thrpt: [346.95 MiB/s 350.00 MiB/s 352.53 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 6 (6.00%) high mild + 5 (5.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-1.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-1.txt new file mode 100644 index 0000000..f69f7b6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-1.txt @@ -0,0 +1,65 @@ +memcap: <=7886 MiB (60% of 13144 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0027 s (5.0M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0056 µs 1.0178 µs 1.0338 µs] + thrpt: [86.717 MiB/s 88.079 MiB/s 89.148 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 3 (3.00%) high mild + 7 (7.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 8.0668 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [788.54 µs 791.73 µs 795.39 µs] + thrpt: [76.630 MiB/s 76.984 MiB/s 77.295 MiB/s] +Found 6 outliers among 100 measurements (6.00%) + 3 (3.00%) high mild + 3 (3.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.5717 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.9173 ms 7.9997 ms 8.1054 ms] + thrpt: [78.703 MiB/s 79.743 MiB/s 80.573 MiB/s] +Found 16 outliers among 100 measurements (16.00%) + 5 (5.00%) high mild + 11 (11.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0003 s (22M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [228.58 ns 230.06 ns 231.71 ns] + thrpt: [386.89 MiB/s 389.67 MiB/s 392.18 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 4 (4.00%) high mild + 8 (8.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.5305 s (30k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [179.32 µs 180.96 µs 182.99 µs] + thrpt: [330.47 MiB/s 334.18 MiB/s 337.24 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 5 (5.00%) high mild + 7 (7.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s + +Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 9.1s, enable flat sampling, or reduce sample count to 50. +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 9.1460 s (5050 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [1.8047 ms 1.8166 ms 1.8299 ms] + thrpt: [346.01 MiB/s 348.54 MiB/s 350.84 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 6 (6.00%) high mild + 6 (6.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-2.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-2.txt new file mode 100644 index 0000000..22b809e --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-2.txt @@ -0,0 +1,65 @@ +memcap: <=7882 MiB (60% of 13138 MiB available) [systemd MemoryMax, swap off] +Benchmarking deserialization/sensor_micro +Benchmarking deserialization/sensor_micro: Warming up for 3.0000 s +Benchmarking deserialization/sensor_micro: Collecting 100 samples in estimated 5.0025 s (4.9M iterations) +Benchmarking deserialization/sensor_micro: Analyzing +deserialization/sensor_micro + time: [1.0006 µs 1.0036 µs 1.0072 µs] + thrpt: [89.006 MiB/s 89.323 MiB/s 89.594 MiB/s] +Found 7 outliers among 100 measurements (7.00%) + 3 (3.00%) high mild + 4 (4.00%) high severe +Benchmarking deserialization/catalog_items/1000 +Benchmarking deserialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/1000: Collecting 100 samples in estimated 7.9756 s (10k iterations) +Benchmarking deserialization/catalog_items/1000: Analyzing +deserialization/catalog_items/1000 + time: [786.84 µs 791.45 µs 797.22 µs] + thrpt: [76.454 MiB/s 77.011 MiB/s 77.462 MiB/s] +Found 14 outliers among 100 measurements (14.00%) + 5 (5.00%) high mild + 9 (9.00%) high severe +Benchmarking deserialization/catalog_items/10000 +Benchmarking deserialization/catalog_items/10000: Warming up for 3.0000 s +Benchmarking deserialization/catalog_items/10000: Collecting 100 samples in estimated 5.5093 s (700 iterations) +Benchmarking deserialization/catalog_items/10000: Analyzing +deserialization/catalog_items/10000 + time: [7.8827 ms 7.9640 ms 8.0628 ms] + thrpt: [79.120 MiB/s 80.101 MiB/s 80.927 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 2 (2.00%) high mild + 11 (11.00%) high severe + +Benchmarking serialization/sensor_micro +Benchmarking serialization/sensor_micro: Warming up for 3.0000 s +Benchmarking serialization/sensor_micro: Collecting 100 samples in estimated 5.0001 s (22M iterations) +Benchmarking serialization/sensor_micro: Analyzing +serialization/sensor_micro + time: [227.05 ns 228.26 ns 230.09 ns] + thrpt: [389.61 MiB/s 392.74 MiB/s 394.83 MiB/s] +Found 15 outliers among 100 measurements (15.00%) + 2 (2.00%) high mild + 13 (13.00%) high severe +Benchmarking serialization/catalog_items/1000 +Benchmarking serialization/catalog_items/1000: Warming up for 3.0000 s +Benchmarking serialization/catalog_items/1000: Collecting 100 samples in estimated 5.4033 s (30k iterations) +Benchmarking serialization/catalog_items/1000: Analyzing +serialization/catalog_items/1000 + time: [176.99 µs 177.82 µs 179.08 µs] + thrpt: [337.68 MiB/s 340.08 MiB/s 341.68 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 3 (3.00%) high mild + 5 (5.00%) high severe +Benchmarking serialization/catalog_items/10000 +Benchmarking serialization/catalog_items/10000: Warming up for 3.0000 s + +Warning: Unable to complete 100 samples in 5.0s. You may wish to increase target time to 9.1s, enable flat sampling, or reduce sample count to 50. +Benchmarking serialization/catalog_items/10000: Collecting 100 samples in estimated 9.0583 s (5050 iterations) +Benchmarking serialization/catalog_items/10000: Analyzing +serialization/catalog_items/10000 + time: [1.7941 ms 1.8015 ms 1.8101 ms] + thrpt: [349.80 MiB/s 351.46 MiB/s 352.90 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 5 (5.00%) high mild + 4 (4.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-build.txt new file mode 100644 index 0000000..9cae711 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current-build.txt @@ -0,0 +1,5 @@ +memcap: <=7858 MiB (60% of 13097 MiB available) [systemd MemoryMax, swap off] + Locking 1 package to highest compatible version + Updating polyxml v0.27.0 (/home/bailey/github/PolyXML/crates/polyxml-core) -> v0.34.6 + Compiling core-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/core-current) + Finished `bench` profile [optimized] target(s) in 2.55s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current.lock new file mode 100644 index 0000000..78a11b2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/current.lock @@ -0,0 +1,633 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "core-regression" +version = "0.0.0" +dependencies = [ + "criterion", + "polyxml", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "num-traits", + "oorandom", + "page_size", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/harness.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/harness.rs new file mode 100644 index 0000000..073ad98 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/harness.rs @@ -0,0 +1,172 @@ +use std::hint::black_box; + +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize}; +use std::sync::Arc; + +fn build_sensor_fixture() -> (Arc, Vec) { + let schema = ModelSchema::builder("Sensor") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "temp", + b"temp", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .field(FieldSchema::new( + "status", + b"status", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "active", + b"active", + FieldKind::Element, + ValueType::Scalar(ScalarType::Bool), + )) + .build(); + + let xml = br#"23.75OPERATIONALtrue"#.to_vec(); + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let output = serialize("Sensor", &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + (schema, xml) +} + +fn build_catalog_fixture(count: usize) -> (Arc, Vec) { + let item_schema = ModelSchema::builder("Item") + .field(FieldSchema::new( + "id", + b"id", + FieldKind::Attribute, + ValueType::Scalar(ScalarType::Int), + )) + .field(FieldSchema::new( + "name", + b"name", + FieldKind::Element, + ValueType::Scalar(ScalarType::String), + )) + .field(FieldSchema::new( + "price", + b"price", + FieldKind::Element, + ValueType::Scalar(ScalarType::Float), + )) + .build(); + + let catalog_schema = ModelSchema::builder("Catalog") + .field(FieldSchema::new( + "items", + b"item", + FieldKind::Element, + ValueType::List(Box::new(ValueType::Nested(item_schema))), + )) + .build(); + + let mut xml = String::with_capacity(count * 64 + 32); + xml.push_str(""); + for i in 0..count { + use std::fmt::Write; + write!( + xml, + r#"Part-{i}{:.2}"#, + (i as f64) * 1.25 + ) + .unwrap(); + } + xml.push_str(""); + + let xml = xml.into_bytes(); + let value = deserialize(&xml, Arc::clone(&catalog_schema)).unwrap(); + assert_eq!(value.get("items").unwrap().as_list().unwrap().len(), count); + let output = serialize("Catalog", &value, &catalog_schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&catalog_schema)).unwrap()); + (catalog_schema, xml) +} + +fn bench_deserialization(c: &mut Criterion) { + let mut group = c.benchmark_group("deserialization"); + + // 1. Sensor Telemetry (Micro) + { + let (schema, xml) = build_sensor_fixture(); + group.throughput(Throughput::Bytes(xml.len() as u64)); + group.bench_function("sensor_micro", |b| { + b.iter(|| { + let res = deserialize(black_box(&xml), Arc::clone(&schema)).unwrap(); + black_box(res); + }); + }); + } + + // 2. Catalog Batch (1,000 and 10,000 items) + for &count in &[1_000, 10_000] { + let (schema, xml) = build_catalog_fixture(count); + group.throughput(Throughput::Bytes(xml.len() as u64)); + group.bench_with_input(BenchmarkId::new("catalog_items", count), &count, |b, _| { + b.iter(|| { + let res = deserialize(black_box(&xml), Arc::clone(&schema)).unwrap(); + black_box(res); + }); + }); + } + + group.finish(); +} + +fn bench_serialization(c: &mut Criterion) { + let mut group = c.benchmark_group("serialization"); + + // 1. Sensor Telemetry (Micro) + { + let (schema, xml) = build_sensor_fixture(); + let val = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let expected_bytes = serialize("Sensor", &val, &schema, None).unwrap(); + group.throughput(Throughput::Bytes(expected_bytes.len() as u64)); + group.bench_function("sensor_micro", |b| { + b.iter(|| { + let res = serialize( + black_box("Sensor"), + black_box(&val), + black_box(&schema), + black_box(None), + ) + .unwrap(); + black_box(res); + }); + }); + } + + // 2. Catalog Batch (1,000 and 10,000 items) + for &count in &[1_000, 10_000] { + let (schema, xml) = build_catalog_fixture(count); + let val = deserialize(&xml, Arc::clone(&schema)).unwrap(); + let expected_bytes = serialize("Catalog", &val, &schema, None).unwrap(); + group.throughput(Throughput::Bytes(expected_bytes.len() as u64)); + group.bench_with_input(BenchmarkId::new("catalog_items", count), &count, |b, _| { + b.iter(|| { + let res = serialize( + black_box("Catalog"), + black_box(&val), + black_box(&schema), + black_box(None), + ) + .unwrap(); + black_box(res); + }); + }); + } + + group.finish(); +} + +criterion_group!(benches, bench_deserialization, bench_serialization); +criterion_main!(benches); diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/metadata.json new file mode 100644 index 0000000..1b8ca4f --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/metadata.json @@ -0,0 +1,19 @@ +{ + "revisions": { + "baseline": "cef575c11cc4f05e877ced157036f7ff53b8687b", + "current": "7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d" + }, + "core_status": { + "baseline": "", + "current": "" + }, + "sample_size": 100, + "warmup_seconds": 3.0, + "measurement_seconds": 5.0, + "rounds": 3, + "filter": "", + "order": "alternate baseline/current per round", + "os": "Linux-6.18.40.1-microsoft-standard-WSL2-x86_64-with-glibc2.43", + "cpu": "11th Gen Intel(R) Core(TM) i5-11600K @ 3.90GHz", + "rustc": "rustc 1.99.0 (b940084d7 2026-09-28)\nbinary: rustc\ncommit-hash: b940084d7eb6a299eb4bfeb8e34901bc051e7ac4\ncommit-date: 2026-09-28\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.0\nLLVM version: 23.1.1\n" +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/samples.tar.gz b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/samples.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7fe70695079c82e897c90e546074926de16efb50 GIT binary patch literal 55389 zcma&Nby!sI+Wt*AC_I}>q?>&z9pT%OoLE?Y(?FoqUD;?4M!nv@gEm z)_fu?JA)0c|%S;j9IyAjA`z3w1_tB2x0}T&yq}ES0>HfFO`6Zc~i|4pE)B~I} z0?oKTmL!tcl?&v*DZr5S>vJnz9Gwp$fM#HQ5x~F^aO57k9}-T(uTmH)6noiR*REf7 z3%$9IIiFz|cDz~`fwv(O_R==CX^f`e$iwV?Xcz!}smCu~(NNYf_XWcyqS#Q1yHSWh zqcHLNkTw7^h=4XK?HGJaXn&=Bd2%`

    Gsgncw&@4;ZM%Z0`U0n6g0?A`1YhJtW%_ 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 literal 0 HcmV?d00001 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/summary.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/summary.json new file mode 100644 index 0000000..555a787 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-old-core/summary.json @@ -0,0 +1,428 @@ +{ + "deserialization/catalog_items/1000": { + "baseline_ns": 755808.7261670816, + "candidate_ns": 796211.3548976812, + "delta_percent": 5.345615541579241, + "speedup": 0.9492564022328072, + "process_deltas_percent": [ + 5.594467193414321, + 3.6065644494165605, + 6.1165784665023315 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 751059.9685813023, + "upper_bound": 761975.8548897612 + }, + "point_estimate": 755808.7261670816, + "standard_error": 2820.3855390196068 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 758549.566319238, + "upper_bound": 776327.7329276396 + }, + "point_estimate": 766472.644334814, + "standard_error": 4565.439824159987 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 748456.1339043864, + "upper_bound": 752373.4905254878 + }, + "point_estimate": 750317.5907137075, + "standard_error": 1002.3668647192248 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 790064.0489977621, + "upper_bound": 808060.6892174009 + }, + "point_estimate": 798092.1973974616, + "standard_error": 4631.603017561554 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 789732.1593981027, + "upper_bound": 799873.7957211259 + }, + "point_estimate": 794115.9742398965, + "standard_error": 2619.556857750202 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 789818.5111402059, + "upper_bound": 803442.7635847568 + }, + "point_estimate": 796211.3548976812, + "standard_error": 3483.3826194079265 + } + ] + } + }, + "deserialization/catalog_items/10000": { + "baseline_ns": 7585809.051428573, + "candidate_ns": 7963984.387142858, + "delta_percent": 4.985299961420275, + "speedup": 0.9525143047335936, + "process_deltas_percent": [ + 4.253614394017968, + 5.293356592933907, + 5.291859308921576 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 7551282.802821426, + "upper_bound": 7632896.880035716 + }, + "point_estimate": 7585809.051428573, + "standard_error": 21130.27760125623 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 7558740.848678572, + "upper_bound": 7648142.352642859 + }, + "point_estimate": 7597574.675714284, + "standard_error": 23021.572643915988 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 7523174.550071423, + "upper_bound": 7622518.386571431 + }, + "point_estimate": 7563722.817142858, + "standard_error": 25910.680140789707 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 7846185.140642855, + "upper_bound": 7984972.822214286 + }, + "point_estimate": 7908480.117142857, + "standard_error": 35654.39512738086 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 7917302.24114285, + "upper_bound": 8105449.03528571 + }, + "point_estimate": 7999741.395714284, + "standard_error": 48362.46164777882 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 7882689.4598571425, + "upper_bound": 8062776.259714285 + }, + "point_estimate": 7963984.387142858, + "standard_error": 46162.60754546384 + } + ] + } + }, + "deserialization/sensor_micro": { + "baseline_ns": 974.5931079555443, + "candidate_ns": 1008.6872212796135, + "delta_percent": 3.4982920611444035, + "speedup": 0.9661995189343059, + "process_deltas_percent": [ + 5.00502406258474, + 3.40040906302983, + 3.070998044895168 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 966.9427337015497, + "upper_bound": 972.3380208309945 + }, + "point_estimate": 969.4997435801841, + "standard_error": 1.3781370877914338 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 970.0514366515218, + "upper_bound": 981.8054024838184 + }, + "point_estimate": 975.5156971040101, + "standard_error": 3.0095437006279875 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 968.3814557819711, + "upper_bound": 982.3283139894055 + }, + "point_estimate": 974.5931079555443, + "standard_error": 3.5865184492605913 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 1004.3208878360266, + "upper_bound": 1040.0977061376784 + }, + "point_estimate": 1018.0234390330697, + "standard_error": 9.540220987586187 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 1001.9399499517547, + "upper_bound": 1016.8247685896207 + }, + "point_estimate": 1008.6872212796135, + "standard_error": 3.814783182697997 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 1000.5024171447257, + "upper_bound": 1009.7945647810004 + }, + "point_estimate": 1004.5228432465422, + "standard_error": 2.3990147097538084 + } + ] + } + }, + "serialization/catalog_items/1000": { + "baseline_ns": 200999.03612275157, + "candidate_ns": 180103.744257011, + "delta_percent": -10.395717446614839, + "speedup": 1.1160180869750416, + "process_deltas_percent": [ + -10.509006451785696, + -10.284951882304217, + -10.663027072983567 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 199418.0066106714, + "upper_bound": 203705.2736815826 + }, + "point_estimate": 201253.48609519913, + "standard_error": 1106.4626522945625 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 199717.77468161745, + "upper_bound": 202037.9410808132 + }, + "point_estimate": 200789.116968908, + "standard_error": 594.3518667466981 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 199665.71147916323, + "upper_bound": 202963.69566423158 + }, + "point_estimate": 200999.03612275157, + "standard_error": 864.2336219078895 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 178755.32357830938, + "upper_bound": 181682.37906752693 + }, + "point_estimate": 180103.744257011, + "standard_error": 750.6729694263631 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 178971.98454715242, + "upper_bound": 181645.9027926965 + }, + "point_estimate": 180138.05290375228, + "standard_error": 690.2502527330136 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 177221.38028230696, + "upper_bound": 183535.6424454281 + }, + "point_estimate": 179566.45448454656, + "standard_error": 1711.9303067379851 + } + ] + } + }, + "serialization/catalog_items/10000": { + "baseline_ns": 2005150.2546153846, + "candidate_ns": 1806557.5171926087, + "delta_percent": -9.904132469158466, + "speedup": 1.1099288207171998, + "process_deltas_percent": [ + -9.887337067224278, + -10.359395250639903, + -10.05221782703054 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 1996916.633009615, + "upper_bound": 2014787.5942692317 + }, + "point_estimate": 2005150.2546153846, + "standard_error": 4572.373596833154 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 2002095.4525299992, + "upper_bound": 2031238.4900200001 + }, + "point_estimate": 2015333.9239999994, + "standard_error": 7467.711111009626 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 1996777.3562900005, + "upper_bound": 2010723.1871499992 + }, + "point_estimate": 2003037.4420000003, + "standard_error": 3567.372045212245 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 1796956.0384374966, + "upper_bound": 1818725.1445633376 + }, + "point_estimate": 1806894.2902372556, + "standard_error": 5571.908267489618 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 1798396.1846502726, + "upper_bound": 1815725.360174217 + }, + "point_estimate": 1806557.5171926087, + "standard_error": 4427.66103242796 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 1793691.7290509846, + "upper_bound": 1811325.288422301 + }, + "point_estimate": 1801687.7551731798, + "standard_error": 4536.546032252471 + } + ] + } + }, + "serialization/sensor_micro": { + "baseline_ns": 257.81954823695725, + "candidate_ns": 229.2775440514841, + "delta_percent": -11.07053533397735, + "speedup": 1.1244866971318572, + "process_deltas_percent": [ + -11.864018040490121, + -11.394039785000743, + -8.461418285239898 + ], + "process_estimates": { + "baseline": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 254.7240123110133, + "upper_bound": 262.40074498268297 + }, + "point_estimate": 257.81954823695725, + "standard_error": 2.0075554085291265 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 256.39675019137087, + "upper_bound": 261.5581449697532 + }, + "point_estimate": 258.76085930918214, + "standard_error": 1.3276627897112634 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 253.97424725998468, + "upper_bound": 255.5790659360415 + }, + "point_estimate": 254.71649331435168, + "standard_error": 0.4098294208723699 + } + ], + "current": [ + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 226.63910690576273, + "upper_bound": 227.89825869160057 + }, + "point_estimate": 227.2317905222145, + "standard_error": 0.32176648896551313 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 228.2130426244259, + "upper_bound": 230.46995174091958 + }, + "point_estimate": 229.2775440514841, + "standard_error": 0.5770777242966283 + }, + { + "confidence_interval": { + "confidence_level": 0.95, + "lower_bound": 229.17336692146597, + "upper_bound": 238.32600143997817 + }, + "point_estimate": 233.16386537352926, + "standard_error": 2.3693975686543896 + } + ] + } + } +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/cache-policy-clippy.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/cache-policy-clippy.txt new file mode 100644 index 0000000..6dbc626 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/cache-policy-clippy.txt @@ -0,0 +1,12 @@ +memcap: <=7880 MiB (60% of 13134 MiB available) [systemd MemoryMax, swap off] + Checking serde_core v1.0.229 + Checking serde v1.0.229 + Checking fastrand v2.5.0 + Checking phf_generator v0.14.0 + Checking minijinja v2.24.0 + Checking serde_json v1.0.151 + Checking thiserror v2.0.21 + Checking phf_codegen v0.14.0 + Checking quick-xml v0.42.0 + Checking polyxml v0.34.6 (/home/bailey/github/polyxml-perf-cache/crates/polyxml-core) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.05s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/cache-policy-focused-tests.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/cache-policy-focused-tests.txt new file mode 100644 index 0000000..4329b92 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/cache-policy-focused-tests.txt @@ -0,0 +1,37 @@ +memcap: <=7891 MiB (60% of 13151 MiB available) [systemd MemoryMax, swap off] + Compiling polyxml v0.34.6 (/home/bailey/github/polyxml-perf-cache/crates/polyxml-core) + Finished `test` profile [unoptimized + debuginfo] target(s) in 12.02s + Running unittests src/lib.rs (/home/bailey/github/PolyXML/target/debug/deps/polyxml-14071107435df7a7) + +running 16 tests +test integer::tests::comparison_uses_sign_and_magnitude ... ok +test ir::root_selection_tests::inherited_base_does_not_select_sibling_types ... ok +test ir::root_selection_tests::keeps_references_descendants_and_substitutions ... ok +test ir::root_selection_tests::rejects_missing_and_ambiguous_roots ... ok +test ir::chunker::tests::test_topological_scc_chunking_dag_invariants ... ok +test json::tests::test_json_deserialization_accepts_python_field_names ... ok +test json::tests::test_json_roundtrip_primitives ... ok +test tests::test_deserialization_does_not_confuse_xmlns_with_attributes ... ok +test tests::test_nested_elements_and_lists ... ok +test tests::test_namespaced_serialization ... ok +test ir::root_selection_tests::field_reference_keeps_substitution_group_members ... ok +test tests::test_roundtrip_serialization_deserialization ... ok +test tests::test_streaming_xml_item_stream ... ok +test pattern::tests::bounded_cache_evicts_and_retains_invalid_results ... ok +test pattern::tests::cache_matches_uncached_regex_under_churn_and_concurrency ... ok +test pattern::tests::cyclic_working_set_above_capacity_keeps_reusing_entries ... ok + +test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s + + Running tests/test_runtime_fast_paths.rs (/home/bailey/github/PolyXML/target/debug/deps/test_runtime_fast_paths-cb1357dd8af777c0) + +running 6 tests +test repeated_nested_records_validate_their_own_lexical_lists ... ok +test repeated_lexical_lists_keep_whitespace_validation ... ok +test lexical_list_formatting_preserves_escaping_empty_lists_and_long_numbers ... ok +test indexed_scalar_state_preserves_enum_pattern_and_split_text ... ok +test cached_patterns_keep_raw_restriction_and_trimmed_pattern_semantics ... ok +test unified_scalar_state_keeps_mixed_branch_order_nil_and_nested_frames ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/companion-sync.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/companion-sync.txt new file mode 100644 index 0000000..1c8aa81 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/companion-sync.txt @@ -0,0 +1,8 @@ +memcap: <=7779 MiB (60% of 12966 MiB available) [systemd MemoryMax, swap off] +Resolved 14 packages in 240ms + Building polyxml @ file:///home/bailey/github/PolyXML/crates/polyxml-python + Built polyxml @ file:///home/bailey/github/PolyXML/crates/polyxml-python +Prepared 1 package in 29.94s +Uninstalled 1 package in 0.39ms +Installed 1 package in 0.49ms + ~ polyxml==0.34.6 (from file:///home/bailey/github/PolyXML/crates/polyxml-python) diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/corpus-reference.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/corpus-reference.txt new file mode 100644 index 0000000..cf7a430 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/corpus-reference.txt @@ -0,0 +1,57 @@ +memcap: <=7763 MiB (60% of 12939 MiB available) [systemd MemoryMax, swap off] + Building polyxml @ file:///home/bailey/github/PolyXML/crates/polyxml-python + Built polyxml @ file:///home/bailey/github/PolyXML/crates/polyxml-python +Uninstalled 1 package in 0.94ms +Installed 1 package in 0.60ms +╭───────────────────────────────────────────────────────────────────╮ +│ PolyXML W3C XML Schema Conformance Suite │ +│ Compiler Binary: /home/bailey/github/PolyXML/target/debug/polyxml │ +│ W3C Submodule: /home/bailey/github/polyxml-w3c-tests/w3c │ +│ Selected Suite: CType │ +╰───────────────────────────────────────────────────────────────────╯ +Executing 31 test group(s)... + + Testing CType/targetns00101m... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 + + W3C XML Schema Conformance Summary +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┓ +┃ Category ┃ Count ┃ Rate ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━┩ +│ Total Test Groups │ 31 │ 100.0% │ +│ Schema Compilations Passed │ 31 │ 100.0% │ +│ Schema Compilations Failed │ 0 │ 0.0% │ +│ Valid Instances Evaluated │ 28 │ - │ +│ Roundtrip Validations Passed │ 23 │ 82.1% │ +└──────────────────────────────┴───────┴────────┘ + +Failures & Exceptions (5 groups): +┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ +┃ ┃ ┃ Instances ┃ Error / First ┃ +┃ Suite/Group ┃ Schema Status ┃ (Pass/Total) ┃ Failure ┃ +┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ +│ CType/basetd00101… │ PASS │ 0/1 │ Positive: FAIL - │ +│ │ │ │ Root.__init__() │ +│ │ │ │ missing 1 required │ +│ │ │ │ keyword-only │ +│ │ │ │ argument: 'valu │ +│ CType/basetd00101… │ PASS │ 0/1 │ Positive: FAIL - │ +│ │ │ │ Root.__init__() │ +│ │ │ │ missing 1 required │ +│ │ │ │ keyword-only │ +│ │ │ │ argument: 'valu │ +│ CType/derivationm… │ PASS │ 0/1 │ Positive: FAIL - │ +│ │ │ │ B.__init__() │ +│ │ │ │ missing 1 required │ +│ │ │ │ keyword-only │ +│ │ │ │ argument: 'value' │ +│ CType/psubstituti… │ PASS │ 1/2 │ pSubstitutions001… │ +│ │ │ │ FAIL - Schema │ +│ │ │ │ error: Unexpected │ +│ │ │ │ root element │ +│ │ │ │ {pSubstitu │ +│ CType/psubstituti… │ PASS │ 1/2 │ pSubstitutions001… │ +│ │ │ │ FAIL - Schema │ +│ │ │ │ error: Unexpected │ +│ │ │ │ root element │ +│ │ │ │ {pSubstitu │ +└────────────────────┴───────────────┴────────────────────┴────────────────────┘ diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/corpus.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/corpus.txt new file mode 100644 index 0000000..90daa2a --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/corpus.txt @@ -0,0 +1,53 @@ +memcap: <=7607 MiB (60% of 12679 MiB available) [systemd MemoryMax, swap off] +╭───────────────────────────────────────────────────────────────────╮ +│ PolyXML W3C XML Schema Conformance Suite │ +│ Compiler Binary: /home/bailey/github/PolyXML/target/debug/polyxml │ +│ W3C Submodule: /home/bailey/github/polyxml-w3c-tests/w3c │ +│ Selected Suite: CType │ +╰───────────────────────────────────────────────────────────────────╯ +Executing 31 test group(s)... + + Testing CType/targetns00101m... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 + + W3C XML Schema Conformance Summary +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┓ +┃ Category ┃ Count ┃ Rate ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━┩ +│ Total Test Groups │ 31 │ 100.0% │ +│ Schema Compilations Passed │ 31 │ 100.0% │ +│ Schema Compilations Failed │ 0 │ 0.0% │ +│ Valid Instances Evaluated │ 28 │ - │ +│ Roundtrip Validations Passed │ 23 │ 82.1% │ +└──────────────────────────────┴───────┴────────┘ + +Failures & Exceptions (5 groups): +┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ +┃ ┃ ┃ Instances ┃ Error / First ┃ +┃ Suite/Group ┃ Schema Status ┃ (Pass/Total) ┃ Failure ┃ +┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ +│ CType/basetd00101… │ PASS │ 0/1 │ Positive: FAIL - │ +│ │ │ │ Root.__init__() │ +│ │ │ │ missing 1 required │ +│ │ │ │ keyword-only │ +│ │ │ │ argument: 'valu │ +│ CType/basetd00101… │ PASS │ 0/1 │ Positive: FAIL - │ +│ │ │ │ Root.__init__() │ +│ │ │ │ missing 1 required │ +│ │ │ │ keyword-only │ +│ │ │ │ argument: 'valu │ +│ CType/derivationm… │ PASS │ 0/1 │ Positive: FAIL - │ +│ │ │ │ B.__init__() │ +│ │ │ │ missing 1 required │ +│ │ │ │ keyword-only │ +│ │ │ │ argument: 'value' │ +│ CType/psubstituti… │ PASS │ 1/2 │ pSubstitutions001… │ +│ │ │ │ FAIL - Schema │ +│ │ │ │ error: Unexpected │ +│ │ │ │ root element │ +│ │ │ │ {pSubstitu │ +│ CType/psubstituti… │ PASS │ 1/2 │ pSubstitutions001… │ +│ │ │ │ FAIL - Schema │ +│ │ │ │ error: Unexpected │ +│ │ │ │ root element │ +│ │ │ │ {pSubstitu │ +└────────────────────┴───────────────┴────────────────────┴────────────────────┘ diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/docs-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/docs-build.txt new file mode 100644 index 0000000..bb4192a --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/docs-build.txt @@ -0,0 +1,3 @@ +Build started +No issues found +Build finished in 0.84s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/failed-corpus-preflight.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/failed-corpus-preflight.txt new file mode 100644 index 0000000..d29acdf --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/failed-corpus-preflight.txt @@ -0,0 +1,8 @@ +memcap: <=7869 MiB (60% of 13115 MiB available) [systemd MemoryMax, swap off] +╭──────────────────────────────────────────────────────────╮ +│ PolyXML W3C XML Schema Conformance Suite │ +│ Compiler Binary: polyxml │ +│ W3C Submodule: /home/bailey/github/polyxml-w3c-tests/w3c │ +│ Selected Suite: CType │ +╰──────────────────────────────────────────────────────────╯ +Error: PolyXML binary not found at polyxml! diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits-control.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits-control.txt new file mode 100644 index 0000000..3447ca0 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits-control.txt @@ -0,0 +1,4 @@ +memcap: <=7889 MiB (60% of 13149 MiB available) [systemd MemoryMax, swap off] +memcap: <=7884 MiB (60% of 13140 MiB available) [systemd MemoryMax, swap off] +escaped XSD enumeration limitation: ScalarParseError { field: "value", expected: "enumeration", value: "R&D" } +nil mixed scalar serialization limitation: SerializationError("Invalid mixed content value for text") diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits-selected.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits-selected.txt new file mode 100644 index 0000000..0c39810 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits-selected.txt @@ -0,0 +1,4 @@ +memcap: <=7884 MiB (60% of 13141 MiB available) [systemd MemoryMax, swap off] +memcap: <=7858 MiB (60% of 13097 MiB available) [systemd MemoryMax, swap off] +escaped XSD enumeration limitation: ScalarParseError { field: "value", expected: "enumeration", value: "R&D" } +nil mixed scalar serialization limitation: SerializationError("Invalid mixed content value for text") diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits.rs new file mode 100644 index 0000000..b6fdeb6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/known-limits.rs @@ -0,0 +1,25 @@ +use polyxml::schema::ModelSchema; +use polyxml::schema_parser::XsdParser; +use polyxml::{deserialize, serialize}; +use std::sync::Arc; + +fn main() { + let ir = XsdParser::new().parse_str(r#" + + + "#).unwrap(); + let schema = ModelSchema::from_ir(&ir, Some("Root")).unwrap(); + let error = deserialize(b"R&D", schema).unwrap_err(); + println!("escaped XSD enumeration limitation: {error:?}"); + + let ir = XsdParser::new().parse_str(r#" + + + + + "#).unwrap(); + let schema = ModelSchema::from_ir(&ir, Some("Root")).unwrap(); + let value = deserialize(b"Ready", Arc::clone(&schema)).unwrap(); + let error = serialize("Root", &value, &schema, None).unwrap_err(); + println!("nil mixed scalar serialization limitation: {error:?}"); +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/quality-gate.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/quality-gate.txt new file mode 100644 index 0000000..db78dad --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/quality-gate.txt @@ -0,0 +1,756 @@ +memcap: <=7878 MiB (60% of 13130 MiB available) [systemd MemoryMax, swap off] +==> [1/6] Running Rust format check (cargo fmt)... +==> [2/6] Running Rust Clippy (cargo clippy -D warnings)... + Checking polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling pyo3-ffi v0.29.2 + Compiling pyo3 v0.29.2 + Checking polyxml-cli v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-cli) + Checking polyxml-js v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-js) + Checking polyxml-wasm v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-wasm) + Checking polyxml-python v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-python) + Checking polyxml-c v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-c) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.28s +==> [3/6] Running Rust workspace tests (cargo test)... + Compiling polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling polyxml-cli v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-cli) + Compiling pyo3-ffi v0.29.2 + Compiling pyo3 v0.29.2 + Compiling polyxml-wasm v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-wasm) + Compiling polyxml-js v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-js) + Compiling polyxml-python v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-python) + Compiling polyxml-c v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-c) + Finished `test` profile [unoptimized + debuginfo] target(s) in 20.36s + Running unittests src/lib.rs (target/debug/deps/polyxml-675b717e531d04ed) + +running 16 tests +test integer::tests::comparison_uses_sign_and_magnitude ... ok +test ir::chunker::tests::test_topological_scc_chunking_dag_invariants ... ok +test ir::root_selection_tests::field_reference_keeps_substitution_group_members ... ok +test ir::root_selection_tests::inherited_base_does_not_select_sibling_types ... ok +test ir::root_selection_tests::keeps_references_descendants_and_substitutions ... ok +test ir::root_selection_tests::rejects_missing_and_ambiguous_roots ... ok +test json::tests::test_json_deserialization_accepts_python_field_names ... ok +test json::tests::test_json_roundtrip_primitives ... ok +test pattern::tests::bounded_cache_evicts_and_retains_invalid_results ... ok +test pattern::tests::cache_matches_uncached_regex_under_churn_and_concurrency ... ok +test pattern::tests::cyclic_working_set_above_capacity_keeps_reusing_entries ... ok +test tests::test_deserialization_does_not_confuse_xmlns_with_attributes ... ok +test tests::test_namespaced_serialization ... ok +test tests::test_nested_elements_and_lists ... ok +test tests::test_roundtrip_serialization_deserialization ... ok +test tests::test_streaming_xml_item_stream ... ok + +test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.18s + + Running tests/test_adversarial_identifiers.rs (target/debug/deps/test_adversarial_identifiers-34056256ccaa17cb) + +running 7 tests +test test_cpp_adversarial_compilation ... ok +test test_csharp_adversarial_compilation ... ok +test test_go_adversarial_compilation ... ok +test test_java_adversarial_compilation ... ok +test test_python_adversarial_compilation ... ok +test test_rust_adversarial_compilation ... ok +test test_typescript_adversarial_compilation ... ok + +test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.87s + + Running tests/test_any_attribute.rs (target/debug/deps/test_any_attribute-d5795d9c5e0fdefd) + +running 1 test +test test_any_attribute_schema_parser_and_runtime_roundtrip ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_any_element.rs (target/debug/deps/test_any_element-1fb225d6616938e8) + +running 2 tests +test test_any_element_go_codegen ... ok +test test_any_element_schema_parser_and_runtime_roundtrip ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_conformance.rs (target/debug/deps/test_conformance-0b37810d65fedfce) + +running 4 tests +test test_atom_feed_conformance ... ok +test test_soap_envelope_conformance ... ok +test test_streaming_catalog_conformance ... ok +test test_ubl_invoice_conformance ... ok + +test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s + + Running tests/test_core.rs (target/debug/deps/test_core-f4cc1079f88df2bc) + +running 9 tests +test integer_mappings_keep_fixed_width_builtins ... ok +test test_all_scalar_types ... ok +test test_error_handling_invalid_scalars ... ok +test test_gregorian_partial_date_lexical_validation ... ok +test test_malformed_xml_syntax_error ... ok +test test_roundtrip_serialization_with_indentation ... ok +test test_xsd_gregorian_fields_round_trip_and_reject_invalid_dates ... ok +test test_xsi_nil_handling ... ok +test unbounded_integers_round_trip_and_compare_exact_bounds ... ok + +test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_cpp_codegen.rs (target/debug/deps/test_cpp_codegen-a4cd5571504c64d5) + +running 14 tests +test mixed_content_mutual_cycle_compiles ... ok +test mixed_content_self_cycle_compiles ... ok +test simple_aliases_follow_their_base_types ... ok +test test_cpp_choice_variant_compilation ... Choice pattern matching passed. +ok +test test_cpp_cmake_and_meson_generation ... ok +test test_cpp_cmake_modules_file_set ... ok +test test_cpp_from_xsd_schema ... ISO 20022 pacs.008 C++20 test passed. +ok +test test_cpp_glaze_backend_meta_generation ... ok +test test_cpp_inheritance_codegen ... Inheritance test passed. +ok +test test_cpp_mode_and_backend_from_str_loose ... ok +test test_cpp_modules_compilation ... ok +test test_cpp_recursive_cycle_unique_ptr ... Recursive tree unique_ptr passed. +ok +test test_cpp_sanitization ... ok +test test_cpp_struct_and_enum_codegen_compilation ... All C++20 tests passed successfully. +ok + +test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.00s + + Running tests/test_csharp_codegen.rs (target/debug/deps/test_csharp_codegen-cf32febf6e7f0777) + +running 20 tests +test choice_variants_avoid_record_member_names ... ok +test element_defaults_preserve_absence_and_empty_presence ... ok +test emits_unrestricted_simple_types_and_validates_empty_records ... ok +test fixed_values_are_enforced_on_read_and_write ... ok +test lexical_union_attributes_round_trip ... ok +test nillable_enum_collection_round_trips ... ok +test particle_wire_structure_round_trips ... ok +test test_csharp_any_attribute_codegen ... ok +test test_csharp_choice_polymorphic_hierarchy ... Determining projects to restore... + Restored /tmp/.tmpVL7MlE/PaymentsApp.csproj (in 168 ms). + PaymentsApp -> /tmp/.tmpVL7MlE/bin/Debug/net8.0/PaymentsApp.dll + +Build succeeded. + 0 Warning(s) + 0 Error(s) + +Time Elapsed 00:00:01.04 +Choice pattern matching and XML serialization passed! +ok +test test_csharp_date_or_datetime_lexical_union ... ok +test test_csharp_mutable_inheritance_roundtrip ... ok +test test_csharp_mutable_wrappers_and_choices_without_validation ... ok +test test_csharp_record_kind_from_str_loose ... ok +test test_csharp_records_and_enums_generation ... Determining projects to restore... + Restored /tmp/.tmpyFg5mE/CrmApp.csproj (in 168 ms). + CrmApp -> /tmp/.tmpyFg5mE/bin/Debug/net8.0/CrmApp.dll + +Build succeeded. + 0 Warning(s) + 0 Error(s) + +Time Elapsed 00:00:01.04 +Customer C# tests passed cleanly! +ok +test test_csharp_recursive_cycle ... Determining projects to restore... + Restored /tmp/.tmpWaFCyf/TreeApp.csproj (in 170 ms). + TreeApp -> /tmp/.tmpWaFCyf/bin/Debug/net8.0/TreeApp.dll + +Build succeeded. + 0 Warning(s) + 0 Error(s) + +Time Elapsed 00:00:01.03 +Recursive tree C# tests passed cleanly! +ok +test test_csharp_sanitization ... ok +test test_csharp_sequence_nested_inside_choice_codegen ... ok +test test_csharp_simple_content_class_validator_and_unsealed_records ... ok +test test_csharp_source_gen_context ... ok +test unbounded_integer_xml_preserves_digits ... ok + +test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 53.47s + + Running tests/test_go_codegen.rs (target/debug/deps/test_go_codegen-005c45ed4341be87) + +running 25 tests +test abstract_substitution_heads_are_rejected ... ok +test duplicate_choice_names_reject_invalid_branch_shapes ... ok +test imported_ordered_types_do_not_add_unused_bytes_import ... ok +test nested_lexical_unions_compile_and_round_trip_in_go ... ok +test ordered_particles_and_choice_branches_round_trip ... ok +test referenced_element_uses_declared_type_after_includes ... ok +test repeated_choice_branch_rejects_mixed_and_empty_selections ... ok +test repeated_sequence_groups_enforce_bounds_and_order ... ok +test root_alias_names_are_unique_after_go_normalization ... ok +test roots_and_union_attributes_round_trip ... ok +test separate_choices_enforce_each_group ... ok +test temporal_scalars_preserve_xsd_lexical_values ... ok +test test_go_abstract_xsi_type_dispatch ... ok +test test_go_any_attribute_codegen ... ok +test test_go_backend_from_str_loose ... ok +test test_go_choice_mutual_exclusivity ... go: creating new go.mod: module payments +go: to add module requirements and sums: + go mod tidy +=== RUN TestChoiceMutualExclusivity + payments_test.go:44: Correctly rejected concurrent choice branches: choice ContactChoice mutual exclusivity violation: multiple branches populated (2) +--- PASS: TestChoiceMutualExclusivity (0.00s) +PASS +ok payments 0.002s +ok +test test_go_date_or_datetime_lexical_union ... ok +test test_go_easyjson_backend ... ok +test test_go_enum_only_schema_omits_unused_xml_import ... ok +test test_go_namespaced_element_ref_matching ... ok +test test_go_recursive_cycle_pointers ... go: creating new go.mod: module tree +go: to add module requirements and sums: + go mod tidy +=== RUN TestRecursiveTree +--- PASS: TestRecursiveTree (0.00s) +PASS +ok tree 0.002s +ok +test test_go_sanitization ... ok +test test_go_sonic_backend ... ok +test test_go_struct_and_enum_generation ... go: creating new go.mod: module crm +go: to add module requirements and sums: + go mod tidy +=== RUN TestCustomerRoundtrip +--- PASS: TestCustomerRoundtrip (0.00s) +PASS +ok crm 0.002s +ok +test unbounded_integer_xml_preserves_digits ... ok + +test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.66s + + Running tests/test_java_codegen.rs (target/debug/deps/test_java_codegen-a6078e165fc64681) + +running 17 tests +test jackson3_preserves_core_annotations_and_maps_record_text ... ok +test test_direct_codec_rejects_wildcards_and_name_collisions ... ok +test test_java_bean_validation_annotations_are_opt_in ... ok +test test_java_direct_nil_lists_choices_and_namespaces ... ok +test test_java_identifier_sanitization ... ok +test test_java_jackson_backend_enum_annotations ... ok +test test_java_jackson_backend_from_str_loose ... ok +test test_java_jackson_backend_simple_type_annotations ... ok +test test_java_jackson_backend_struct_annotations ... ok +test test_java_jackson_backend_union_annotations ... ok +test test_java_module_container_class ... ok +test test_java_mutable_builders_and_direct_codecs_execute ... ok +test test_java_plain_record_extension_javac_execute ... ok +test test_java_plain_record_inlines_base_fields ... ok +test test_java_record_builder_and_nested_codec_execute ... ok +test test_java_records_and_enums_generation ... ok +test test_java_sealed_interface_choice ... ok + +test result: ok. 17 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.95s + + Running tests/test_json.rs (target/debug/deps/test_json-74440efee0e911e7) + +running 4 tests +test test_json_nested_objects_and_lists ... ok +test test_json_primitives_and_alias_modes ... ok +test test_json_scalar_coercion ... ok +test test_polyvalue_direct_json_methods ... ok + +test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_lexical_lists.rs (target/debug/deps/test_lexical_lists-0f6750d9c4bf9a3c) + +running 2 tests +test named_list_items_enforce_facets_and_enumerations ... ok +test typed_lexical_lists_round_trip_across_codecs ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.92s + + Running tests/test_lexical_union_codegen.rs (target/debug/deps/test_lexical_union_codegen-3c208893561d2732) + +running 2 tests +test lexical_union_xml_selects_first_valid_member_and_round_trips ... ok +test lexical_unions_are_typed_in_all_targets ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_mixed_content.rs (target/debug/deps/test_mixed_content-1a697ad935ae2797) + +running 5 tests +test generated_models_keep_typed_content_items_in_all_targets ... ok +test mixed_content_preserves_nested_child_order ... ok +test mixed_content_preserves_text_and_child_order ... ok +test mixed_items_field_avoids_existing_attribute_name ... ok +test parser_builds_ordered_mixed_content_union ... ok + +test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_pattern_codegen.rs (target/debug/deps/test_pattern_codegen-5eee5f9fe2ed3d1a) + +running 9 tests +test generated_cpp_pattern_validation ... ok +test generated_csharp_pattern_validation ... ok +test generated_go_pattern_validation_and_xml_roundtrip ... ok +test generated_java_pattern_validation_and_direct_codecs ... ok +test generated_python_pattern_validation ... ok +test generated_rust_pattern_validation_and_xml_roundtrip ... ok +test generated_typescript_pattern_validation_all_backends ... ok +test gregorian_primitives_emit_validated_types_across_targets ... ok +test pattern_restrictions_preserve_or_groups_and_inherited_and_steps ... ok + +test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.73s + + Running tests/test_python_codegen.rs (target/debug/deps/test_python_codegen-cc734e908fb39fb6) + +running 16 tests +test multiline_xsd_documentation_stays_inside_python_comments ... ok +test quoted_docstrings_preserve_text_and_remain_valid_python ... ok +test test_identifier_sanitization ... ok +test test_python_abstract_meta_emission ... ok +test test_python_any_attribute_codegen ... ok +test test_python_any_element_codegen ... ok +test test_python_aot_codegen ... ok +test test_python_choice_union_codegen ... ok +test test_python_codecs_generation ... ok +test test_python_dataclass_codegen ... ok +test test_python_derived_meta_inheritance ... ok +test test_python_generated_tag_and_custom_header ... ok +test test_python_pydantic_codegen_with_facets ... ok +test test_python_recursive_type_codegen ... ok +test test_python_sequence_nested_inside_choice_codegen ... ok +test test_python_simplecontent_default_factory ... ok + +test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s + + Running tests/test_qualified_attributes.rs (target/debug/deps/test_qualified_attributes-f8397a31cf1ecf15) + +running 5 tests +test derived_validators_preserve_base_constraints ... ok +test global_attribute_references_round_trip_by_namespace ... ok +test imported_inline_global_attribute_enum_round_trips ... ok +test inherited_attribute_and_distinct_element_keep_separate_property_names ... ok +test lexical_dependencies_compile_and_round_trip_without_implicit_imports ... ok + +test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 25.87s + + Running tests/test_runtime_fast_paths.rs (target/debug/deps/test_runtime_fast_paths-7bf9091b7252b7db) + +running 6 tests +test cached_patterns_keep_raw_restriction_and_trimmed_pattern_semantics ... ok +test indexed_scalar_state_preserves_enum_pattern_and_split_text ... ok +test lexical_list_formatting_preserves_escaping_empty_lists_and_long_numbers ... ok +test repeated_lexical_lists_keep_whitespace_validation ... ok +test repeated_nested_records_validate_their_own_lexical_lists ... ok +test unified_scalar_state_keeps_mixed_branch_order_nil_and_nested_frames ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_rust_codecs.rs (target/debug/deps/test_rust_codecs-9692e165bd5e14bf) + +running 4 tests +test test_empty_element_codec ... ok +test test_facet_validation_min_max_length ... ok +test test_order_choice_roundtrip ... ok +test test_recursive_boxing_roundtrip ... ok + +test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_rust_codegen.rs (target/debug/deps/test_rust_codegen-8bce8b4b67c7eca3) + +running 26 tests +test binary_lexical_values_compile_and_round_trip_in_owned_and_borrowed_modes ... ok +test duplicate_wire_names_keep_distinct_json_values ... ok +test empty_modules_compile_without_unused_reexports ... ok +test multiline_docs_and_raw_field_names_are_valid_source ... ok +test named_choice_wrappers_round_trip_without_unreachable_dispatch ... ok +test test_rust_attribute_codec_loop_syntax ... ok +test test_rust_choice_union_codegen ... ok +test test_rust_codecs_codegen ... ok +test test_rust_digit_prefixed_module_sanitization ... ok +test test_rust_enum_and_methods ... ok +test test_rust_extension_base_cycle_cut ... ok +test test_rust_extension_codecs_decode_and_encode_base_fields ... ok +test test_rust_extension_inlines_base_fields ... ok +test test_rust_identifier_sanitization ... ok +test test_rust_owned_codegen ... ok +test test_rust_phf_dispatch_emission ... ok +test test_rust_phf_dispatch_union_groups_branch_tags ... ok +test test_rust_phf_dispatch_uniquifies_like_field_metas ... ok +test test_rust_read_element_text_accumulates_refs_and_cdata ... ok +test test_rust_recursive_cycle_boxing ... ok +test test_rust_rkyv_derives ... ok +test test_rust_simple_content_extension_shadow_rule ... ok +test test_rust_simple_content_text_codec ... ok +test test_rust_simple_type_cycle_resilience ... ok +test test_rust_topological_scc_chunking ... ok +test test_rust_zero_copy_codegen ... ok + +test result: ok. 26 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.80s + + Running tests/test_schema_audit.rs (target/debug/deps/test_schema_audit-24992dfb5b4a626c) + +running 13 tests +test all_languages_disambiguate_flat_collision ... ok +test chameleon_include_adopts_including_namespace_per_includer ... ok +test derived_simple_type_inherits_base_patterns ... ok +test diamond_includes_do_not_duplicate_upa_source_documents ... ok +test distinct_values_with_colliding_variant_names_stay_unique ... ok +test duplicate_enumeration_values_are_deduped ... ok +test generated_rust_has_no_deny_unknown_fields ... ok +test named_group_reference_fields_are_parsed ... ok +test nested_inline_complex_type_is_extracted_not_leaked ... ok +test quick_xml_serde_skips_unknown_elements ... ok +test restricted_simple_types_emit_named_aliases ... ok +test rust_flat_output_has_no_colliding_type_names ... ok +test simple_content_extension_emits_value_field ... ok + +test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + Running tests/test_schema_ir.rs (target/debug/deps/test_schema_ir-f793c1b9895343c7) + +running 20 tests +test consumed_child_subtrees_do_not_swallow_following_types ... ok +test consumed_particles_do_not_swallow_following_declarations ... ok +test derived_complex_type_keeps_base_and_bounded_choice ... ok +test global_attribute_reference_uses_declared_type ... ok +test imported_inline_global_attribute_types_are_resolved ... ok +test inline_list_item_types_preserve_enum_and_union_declarations ... ok +test missing_included_schema_is_an_error ... ok +test schema_errors_preserve_forward_imports_and_annotation_payloads ... ok +test schema_for_schemas_declared_types_are_not_unknown_builtins ... ok +test test_language_context_adapter ... ok +test test_list_fields_do_not_trigger_spurious_cycles ... ok +test test_minijinja_template_engine_and_filters ... ok +test test_parse_choice_as_union ... ok +test test_parse_complex_type_and_facets ... ok +test test_parse_lexical_union_member_types_and_inline_members ... ok +test test_sequence_nested_inside_choice_preserved_in_ir ... ok +test test_substitution_groups ... ok +test test_tarjan_mutual_recursive_cycle_detection_and_boxing ... ok +test test_tarjan_self_recursive_cycle_detection_and_boxing ... ok +test xml_prefix_is_available_without_explicit_declaration ... ok + +test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + Running tests/test_security.rs (target/debug/deps/test_security-c3afa670f1d6c619) + +running 6 tests +test test_cdata_section_handling ... ok +test test_malformed_unclosed_cdata_rejection ... ok +test test_max_depth_recursion_limit ... ok +test test_numeric_character_references ... ok +test test_xml_entity_roundtrip_escaping ... ok +test unsupported_general_entities_are_rejected ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_temporal_union.rs (target/debug/deps/test_temporal_union-e25d1f9b83e2fdc4) + +running 2 tests +test csharp_temporal_union_preserves_branches_and_lexicals ... ok +test go_temporal_union_preserves_branches_and_lexicals ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.22s + + Running tests/test_transcoder.rs (target/debug/deps/test_transcoder-6854114408316a2e) + +running 6 tests +test test_schema_directed_transcoding ... ok +test test_schema_from_ir_transcoding ... ok +test test_schemaless_preserves_refs_cdata_and_attr_entities ... ok +test test_schemaless_pretty_transcoding ... ok +test test_schemaless_xml_to_json_and_back ... ok +test test_transcoder_errors ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_ts_codegen.rs (target/debug/deps/test_ts_codegen-4e67290c9758f4d9) + +running 9 tests +test mixed_content_inheritance_compiles_with_widened_items ... ok +test test_ts_backend_from_str_loose ... ok +test test_ts_discriminated_union_choice ... ok +test test_ts_identifier_sanitization ... ok +test test_ts_interface_and_enum_codegen ... ok +test test_ts_recursive_cycle_zod_lazy ... ok +test test_ts_typebox_schema_generation ... ok +test test_ts_valibot_schema_generation ... ok +test test_ts_zod_schema_generation ... ok + +test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.32s + + Running tests/test_ubl_csharp.rs (target/debug/deps/test_ubl_csharp-b04bc8d2d5f891c2) + +running 2 tests +test multi_namespace_roots_and_inherited_simple_content_compile_and_round_trip ... ok +test unprefixed_xsd_builtin_simple_content_base_uses_default_namespace ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.03s + + Running tests/test_unbounded_choice.rs (target/debug/deps/test_unbounded_choice-7672e62aa5ecca1a) + +running 1 test +test test_unbounded_choice_ir_and_all_targets ... go: creating new go.mod: module testmod +go: to add module requirements and sums: + go mod tidy +=== RUN TestUnboundedChoiceOrder +--- PASS: TestUnboundedChoiceOrder (0.00s) +PASS +ok testmod 0.002s +ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s + + Running tests/test_upa.rs (target/debug/deps/test_upa-a20019d257c7eac5) + +running 6 tests +test all_groups_and_wildcard_namespaces_are_checked ... ok +test imported_groups_and_chameleon_wildcards_keep_source_namespaces ... ok +test local_form_and_in_scope_qnames_distinguish_namespaces ... ok +test model_groups_derivation_and_substitution_members_are_checked ... ok +test occurrence_ranges_keep_particle_identity_and_count_boundaries ... ok +test optional_siblings_and_choice_lookahead_violate_upa ... ok + +test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + Running tests/test_value_constraints.rs (target/debug/deps/test_value_constraints-73eb81a96de588c1) + +running 2 tests +test fixed_constraints_cover_input_and_output_in_value_space ... ok +test repeated_particle_cardinality_belongs_to_the_group ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_xsi_type.rs (target/debug/deps/test_xsi_type-2c07a0776bd0ec60) + +running 11 tests +test abstract_type_requires_concrete_selector ... ok +test abstract_type_without_derivations_errors ... ok +test from_ir_flattens_base_fields_and_registers_variants ... ok +test iterparse_dispatches_each_streamed_item ... ok +test nested_xsi_type_dispatch_and_round_trip ... ok +test nil_abstract_complex_type_skips_concrete_dispatch ... ok +test plain_type_attribute_is_not_mistaken_for_dispatch ... ok +test root_xsi_type_dispatch_including_empty_element ... ok +test unknown_xsi_type_on_abstract_type_errors ... ok +test variant_serialization_requires_namespaces ... ok +test xsi_type_resolves_namespace_inherited_from_parent ... ok + +test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s + + Running unittests src/lib.rs (target/debug/deps/polyxml-4ccc220bbd6a27a0) + +running 2 tests +test tests::test_c_abi_namespaced_roundtrip ... ok +test tests::test_c_abi_nested_list_batch_roundtrip ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/lib.rs (target/debug/deps/polyxml_cli-dabf613ae4318f1b) + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/main.rs (target/debug/deps/polyxml-cec02944de7101b9) + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running tests/test_cli.rs (target/debug/deps/test_cli-714ccf0c30d96734) + +running 47 tests +test bash_completion_filters_values_in_the_shell ... ok +test completion_candidates_follow_target_validation ... ok +test fish_completion_filters_values_when_available ... ok +test imported_substitution_helpers_do_not_require_spurious_module_owners ... ok +test invalid_schema_grammar_and_types_fail_before_generation ... ok +test jackson3_cli_and_manifest_emit_equivalent_models ... ok +test manifest_generation_does_not_ignore_cli_overrides ... ok +test python_features_respect_manifest_false_values_and_backend ... ok +test retained_imported_ordered_helpers_belong_to_the_unique_namespace_module ... ok +test test_cli_build_polyxml_manifest_with_new_features ... Loading manifest: /tmp/.tmpNGaN5p/polyxml.toml +Compiling schema: /tmp/.tmpNGaN5p/model.xsd + Namespace: urn:app + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Emitting target [csharp] into /tmp/.tmpNGaN5p/cs +Emitting target [ts] into /tmp/.tmpNGaN5p/ts +Emitting target [go] into /tmp/.tmpNGaN5p/go +Emitting target [rust] into /tmp/.tmpNGaN5p/rs +Build finished successfully. +ok +test test_cli_cpp_generation ... E2E C++20 driver passed! +ok +test test_cli_cpp_modules_and_glaze ... ok +test test_cli_csharp_generation ... Determining projects to restore... + Restored /tmp/.tmpgtPcI5/cli_csharp_app/CrmCliApp.csproj (in 169 ms). + CrmCliApp -> /tmp/.tmpgtPcI5/cli_csharp_app/bin/Debug/net8.0/CrmCliApp.dll + +Build succeeded. + 0 Warning(s) + 0 Error(s) + +Time Elapsed 00:00:01.03 +E2E C# CLI test passed successfully! +ok +test test_cli_csharp_source_gen_and_record_struct ... Parsing schema: /tmp/.tmpnQfb9M/customer.xsd + Namespace: urn:crm + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Code generation complete. +ok +test test_cli_generate_custom_header_and_generated_tags ... ok +test test_cli_generate_dry_run ... ok +test test_cli_generate_help ... ok +test test_cli_generate_multi_lang ... ok +test test_cli_generate_python_backends ... ok +test test_cli_generate_rust_zero_copy_and_owned ... ok +test test_cli_go_easyjson_and_sonic_backend ... Parsing schema: /tmp/.tmpXNuVxP/service.xsd + Namespace: urn:service + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Code generation complete. +Parsing schema: /tmp/.tmpXNuVxP/service.xsd + Namespace: urn:service + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Code generation complete. +ok +test test_cli_go_generation ... go: creating new go.mod: module crm +go: to add module requirements and sums: + go mod tidy +=== RUN TestAccountE2E +--- PASS: TestAccountE2E (0.00s) +PASS +ok crm 0.002s +ok +test test_cli_help ... ok +test test_cli_java_generation ... ok +test test_cli_manifest_custom_header_workspace_and_target_override ... Loading manifest: /tmp/.tmp1YmB2V/polyxml.toml +Compiling schema: /tmp/.tmp1YmB2V/schema.xsd + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Emitting target [rust] into /tmp/.tmp1YmB2V/rs +Emitting target [go] into /tmp/.tmp1YmB2V/go +Emitting target [csharp] into /tmp/.tmp1YmB2V/cs +Build finished successfully. +ok +test test_cli_multiple_root_element_selection ... ok +test test_cli_python_aot_generation ... ok +test test_cli_python_aot_rejects_dataclass_style_and_slots ... ok +test test_cli_root_element_selection ... ok +test test_cli_rust_phf_feature ... Parsing schema: /tmp/.tmpmnW825/event.xsd + Namespace: urn:events + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Code generation complete. +ok +test test_cli_rust_rkyv_feature ... Parsing schema: /tmp/.tmpkubLF6/event.xsd + Namespace: urn:events + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Code generation complete. +ok +test test_cli_rust_split_units_and_chunking ... ok +test test_cli_shared_modules_deduplication ... ok +test test_cli_transcode_bidirectional ... ok +test test_cli_typescript_generation ... ok +test test_cli_typescript_valibot_and_typebox_backend ... Parsing schema: /tmp/.tmpvtAuGk/item.xsd + Namespace: urn:store + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Code generation complete. +Parsing schema: /tmp/.tmpvtAuGk/item.xsd + Namespace: urn:store + Types: 1 total (1 structs, 0 enums, 0 unions, 0 simple restrictions) + Root elements: 0 +Code generation complete. +ok +test test_cli_validate_valid_and_invalid ... ok +test test_java_csharp_model_style_options_and_manifest ... ok +test test_polyxml_toml_manifest_build ... ok +test test_root_selection_keeps_imported_module_types ... ok +test unified_help_shows_generation_options ... ok +test unified_manifest_forms_generate_identical_output_and_validate_early ... ok +test unified_options_fail_before_schema_io_including_dry_run ... ok +test unified_supported_backends_and_styles_validate ... ok +test unsupported_xsd_alternatives_fail_explicitly ... ok +test validate_and_generate_reject_upa_violations ... ok +test zsh_completion_filters_values_when_available ... ok + +test result: ok. 47 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.44s + + Running unittests src/lib.rs (target/debug/deps/polyxml_js-878a75d7b7901cc9) + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/lib.rs (target/debug/deps/_polyxml-a668b0910babaf29) + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/lib.rs (target/debug/deps/polyxml_wasm-d510c7f48918b595) + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Doc-tests polyxml + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Doc-tests polyxml_cli + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Doc-tests polyxml_wasm + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +==> [4/6] Compiling Python PyO3 extension (maturin develop)... +🍹 Building a mixed python/rust project +🐍 Found CPython 3.14 at /home/bailey/github/PolyXML/.venv/bin/python +🔗 Found pyo3 bindings with abi3-py3.12 support +📡 Using build options features from pyproject.toml +Using Python 3.14.4 environment at: /home/bailey/github/PolyXML/.venv +Checked 6 packages in 0.52ms + Compiling pyo3-ffi v0.29.2 + Compiling pyo3 v0.29.2 + Compiling polyxml v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-core) + Compiling polyxml-python v0.34.6 (/home/bailey/github/PolyXML/crates/polyxml-python) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.08s +📦 Built wheel for abi3 Python ≥ 3.12 to /tmp/.tmpt1UoBV/polyxml-0.34.6-cp312-abi3-linux_x86_64.whl +✏️ Setting installed package as editable +🛠 Installed polyxml-0.34.6 +==> [5/6] Running Python Ruff checks... +All checks passed! +10 files already formatted +==> [6/6] Running Python tests with 100% statement & branch coverage... +........................................................................ [ 64%] +........................................ [100%] +================================ tests coverage ================================ +_______________ coverage: platform linux, python 3.14.4-final-0 ________________ + +Name Stmts Miss Branch BrPart Cover Missing +--------------------------------------------------- +TOTAL 181 0 58 0 100% + +3 files skipped due to complete coverage. +Required test coverage of 100% reached. Total coverage: 100.00% +112 passed in 0.51s +✨ All PolyXML dual-language quality gates passed! diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/tooling-checks.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/tooling-checks.txt new file mode 100644 index 0000000..8d76f96 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/tooling-checks.txt @@ -0,0 +1,3 @@ +All checks passed! +3 files already formatted +Skill is valid! diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/verification.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/verification.json new file mode 100644 index 0000000..42943ff --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/verification/verification.json @@ -0,0 +1,26 @@ +{ + "archive_hashes": "pass", + "criterion_summaries_reconstructed_from_archives": "pass", + "shared_dependency_versions": "pass", + "generated_model_bytes_identical": "pass", + "measured_core_revision": "7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d", + "control_revision": "bbbd087a9a8e9838a32912973cd4029c30f29c08", + "historical_revision": "cef575c11cc4f05e877ced157036f7ff53b8687b", + "rust_tests_passed": 321, + "python_tests_passed": 112, + "python_statement_and_branch_coverage_percent": 100, + "corpus_schema_expectations": [ + 31, + 31 + ], + "corpus_instance_roundtrips": [ + 23, + 28 + ], + "corpus_summary_and_group_table_matches_reference": true, + "corpus_reference_source_sha": "not recorded in original log", + "oom": false, + "main_modified": false, + "strict_docs_build": "pass", + "benchmark_tooling_checks": "pass" +} diff --git a/docs/benchmarks/index.md b/docs/benchmarks/index.md index ec97778..e8fe58c 100644 --- a/docs/benchmarks/index.md +++ b/docs/benchmarks/index.md @@ -38,6 +38,9 @@ lists every entry point. ## Published studies +- [October 2026 dynamic Rust XML optimization](rust-runtime-optimization-2026-10.md): + branch experiments, allocation diagnostics and same-host confirmation. + - [October 2026 Rust XML/Serde regression check](rust-xml-serde-regression-2026-10.md): same-host generated-model and dynamic-core comparisons with retained samples. diff --git a/docs/benchmarks/rust-runtime-optimization-2026-10.md b/docs/benchmarks/rust-runtime-optimization-2026-10.md new file mode 100644 index 0000000..2a8ce91 --- /dev/null +++ b/docs/benchmarks/rust-runtime-optimization-2026-10.md @@ -0,0 +1,263 @@ +--- +title: Rust XML runtime optimization — October 2026 +description: Dynamic XML optimization experiments with instruction profiles, allocation counts and retained same-host comparisons. +--- + +# Rust XML runtime optimization — October 2026 + +The retained branch improves plain XML writes by **18–20%** and rich-enum reads +by about **45%** versus 0.34.6 on these fixtures. Warm scalar-pattern workloads +improve much more by removing repeated regex compilation. Plain catalog reads +still cost approximately **5% more than 0.27.0**. The tables below link the samples +and process estimates supporting each result. + +This follows the [XML/Serde regression audit](rust-xml-serde-regression-2026-10.md). +The optimization changes the dynamic, schema-driven Rust XML engine. Generated +Rust models use their own quick-xml methods and Serde JSON implementations. +Their emitted model sources remain byte-identical in this comparison. + +## Retained changes + +- Append XML directly to a byte vector, replacing a cursor over that vector. +- Format lexical lists into one string rather than allocating individual token + strings and collecting a vector before joining. Keep primitive formatting inline. +- Select fixed-value and lexical-list obligations before prevalidation; skip + recursive list scans for ordinary repeated records. Nested writers retain + their own validation. +- Store active field/branch indices in the parser and borrow scalar metadata + from the frame's schema. Avoid cloning enum members and pattern strings for + every value. Consolidate ordinary/mixed scalar state and move nested mixed + branch names into the resulting object. +- Reuse exactly anchored scalar regexes through a concurrent cache. It admits + 16 entries with keys up to 4,096 bytes. Larger keys compile uncached; invalid + expressions retain the previous validation failure. Matching and compilation + run outside the lock. At capacity, an eviction nonce and the existing randomized + hasher select a victim, avoiding the FIFO prototype's cyclic misses. + +The cache keys actual pattern strings, and parser indices resolve actual field +metadata. Public schema edits before sharing do not leave stale prepared flags. +Fixed values, lexical-list whitespace rejection, content-model validation and +scalar restrictions remain enabled. Cache limits bound entries/key retention, +**not compiled-regex bytes or peak memory**. Concurrent misses can compile the +same expression more than once before one result is retained. + +## Method + +The measured implementation is +[`7f845ae`](https://github.com/polyxml/PolyXML/commit/7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d). +The control is [`bbbd087` (0.34.6)](https://github.com/polyxml/PolyXML/commit/bbbd087a9a8e9838a32912973cd4029c30f29c08). +The historical comparison uses [`cef575c` (0.27.0)](https://github.com/polyxml/PolyXML/commit/cef575c11cc4f05e877ced157036f7ff53b8687b). +Each comparison records exact revisions and clean core-source status in its +metadata. Subsequent documentation commits do not change the measured engine. + +The host is an Intel Core i5-11600K under WSL2, rustc 1.99.0 / LLVM 23.1.1. +Confirmation builds and measurements run serially, with one Cargo worker, +systemd memory caps at 60% of available RAM, and swap disabled inside each scope. +The IDE is present; affinity and CPU frequency are not pinned. No OOM occurred. + +All Criterion confirmation suites use three processes per revision, 100 samples, +three-second warmup and five-second measurement targets. Order alternates +baseline/candidate, candidate/baseline, baseline/candidate. Tables use the median +of process mean estimates. Each process's confidence interval and paired delta +remain in the summary; samples within a process are not independent process +repetitions. Small deltas deserve more caution than the large gains. + +The core harness checks round-trip equality and catalog counts before timing. +Payloads are 94 bytes for the sensor and 63,911 / 668,911 bytes for catalogs; +written catalogs are 63,411 / 663,911 bytes because numeric spelling normalizes. +The constraint harness checks every value and round trips: 1,000 enum values, +patterned strings, restricted strings, lexical integer lists, or strings with a +content regex. Scalar-pattern cases measure warm reuse, excluding first +compilation. Working-set pressure receives a separate suite; concurrent +throughput and cold-start latency are unmeasured. + +The [investigation toolkit](https://github.com/polyxml/PolyXML/tree/7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d/benchmarks/rust-runtime-investigation) +and [comparison runner](https://github.com/polyxml/PolyXML/tree/7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d/benchmarks/rust-xml-regression) +contain reproduction commands. Criterion filters are regexes: `^serialization/` +selects writes; `serialization` also matches deserialization. + +## Plain-record confirmation + +[Process estimates](data/2026-10-03/runtime-optimization/selected-core/summary.json) and +[all Criterion samples](data/2026-10-03/runtime-optimization/selected-core/samples.tar.gz) support this table. +The first confirmation attempt is retained in the prototype archive and excluded: +a companion `uv run ... --help` unexpectedly rebuilt its editable binding during +the final round. Both the clean repeat and the later retained-policy run are saved. + +| Operation | Fixture | 0.34.6 µs | Candidate µs | Change | +| --- | --- | ---: | ---: | ---: | +| read | catalog 1000 | 797.834 | 788.425 | -1.18% | +| read | catalog 10000 | 8,011.487 | 7,932.545 | -0.99% | +| read | sensor | 1.046 | 1.012 | -3.16% | +| write | catalog 1000 | 223.146 | 179.231 | -19.68% | +| write | catalog 10000 | 2,253.219 | 1,800.463 | -20.09% | +| write | sensor | 0.279 | 0.228 | -18.42% | + +All write fixtures improve across all three paired processes. Catalog read +changes are small; the sensor gain should not be generalized to larger documents. + +## Historical release comparison + +[Process estimates](data/2026-10-03/runtime-optimization/selected-old-core/summary.json) and +[raw samples](data/2026-10-03/runtime-optimization/selected-old-core/samples.tar.gz) support this fresh same-host +comparison, rather than a ratio of separate studies. + +| Operation | Fixture | 0.27.0 µs | Candidate µs | Change | +| --- | --- | ---: | ---: | ---: | +| read | catalog 1000 | 755.809 | 796.211 | +5.35% | +| read | catalog 10000 | 7,585.809 | 7,963.984 | +4.99% | +| read | sensor | 0.975 | 1.009 | +3.50% | +| write | catalog 1000 | 200.999 | 180.104 | -10.40% | +| write | catalog 10000 | 2,005.150 | 1,806.558 | -9.90% | +| write | sensor | 0.258 | 0.229 | -11.07% | + +Writes recover the historical regression and improve further. Catalog reads +still cost approximately 5% more than 0.27.0; full read recovery remains unresolved. + +## Constrained scalar workloads + +[Process estimates](data/2026-10-03/runtime-optimization/selected-constraints/summary.json) and +[raw samples](data/2026-10-03/runtime-optimization/selected-constraints/samples.tar.gz) support this table. +Times are microseconds per 1,000-value document. + +| Operation | Constraint | 0.34.6 µs | Candidate µs | Change | +| --- | --- | ---: | ---: | ---: | +| read | content | 192.784 | 193.025 | +0.13% | +| read | enum | 351.979 | 194.919 | -44.62% | +| read | list | 282.413 | 268.777 | -4.83% | +| read | pattern | 10,165.972 | 230.009 | -97.74% | +| read | restricted | 10,279.245 | 243.834 | -97.63% | +| write | content | 48.653 | 37.219 | -23.50% | +| write | enum | 69.108 | 53.182 | -23.04% | +| write | list | 232.458 | 191.602 | -17.58% | +| write | pattern | 9,603.202 | 92.221 | -99.04% | +| write | restricted | 9,557.319 | 103.450 | -98.92% | + +Enum reads improve consistently in all three processes. Lexical-list reads have +a smaller gain; content-model reads remain approximately unchanged. Pattern +speedups are specific to warm reuse: the control compiles a regex for every +scalar, while the candidate reuses it. Both validate every value. + +## Pattern working-set pressure + +[Process estimates](data/2026-10-03/runtime-optimization/selected-cache-boundaries/summary.json) and +[raw samples](data/2026-10-03/runtime-optimization/selected-cache-boundaries/samples.tar.gz) support this table. +There are eight values per pattern. Reads cycle through keys; writes visit each +field's eight occurrences consecutively. Compare revisions within each row, +because document sizes vary with the number of patterns. + +| Operation | Active patterns | 0.34.6 µs | Candidate µs | Change | +| --- | --- | ---: | ---: | ---: | +| read | 1 | 78.357 | 2.320 | -97.04% | +| read | 16 | 1,276.524 | 34.537 | -97.29% | +| read | 17 | 1,358.826 | 206.634 | -84.79% | +| read | 64 | 5,238.168 | 5,254.703 | +0.32% | +| write | 1 | 72.397 | 0.796 | -98.90% | +| write | 16 | 1,178.806 | 12.870 | -98.91% | +| write | 17 | 1,249.130 | 34.669 | -97.22% | +| write | 64 | 4,926.045 | 689.333 | -86.01% | + +At 17 patterns, the FIFO prototype was about 4% slower than the control on reads +in both short screening passes. Salted victim selection retains reuse under +that cycle without raising capacity. Against FIFO, the policy screening showed +about 7× faster reads and 5× faster writes for 17 patterns. The retained policy's +longer comparison above confirms gains against the unoptimized control. +At 64 patterns, reads remain approximately unchanged; field-local reuse still +helps writes. This is a bounded reuse cache, rather than a prepared-schema index. + +## Generated Rust XML and JSON/Serde control + +[Per-process values](data/2026-10-03/runtime-optimization/selected-generated/summary.json), +[metadata](data/2026-10-03/runtime-optimization/selected-generated/metadata.json), and the retained CSVs/model +sources support this four-round control. Each operation has 100 warmup calls, +then seven samples of at least 250ms; the table uses the median of each process's +sample medians, followed by the median across processes. All fields and round +trips are checked before timing, and XML writes specify the declared Batch root. + +| Operation | Mode / sensors | 0.34.6 µs | Candidate µs | Change | +| --- | --- | ---: | ---: | ---: | +| json read | borrowed / 1 | 0.0821 | 0.0803 | -2.18% | +| json read | borrowed / 1000 | 60.3231 | 58.9033 | -2.35% | +| json write | borrowed / 1 | 0.0383 | 0.0403 | +5.44% | +| json write | borrowed / 1000 | 25.6639 | 25.9780 | +1.22% | +| xml read | borrowed / 1 | 0.3000 | 0.2873 | -4.26% | +| xml read | borrowed / 1000 | 194.6537 | 185.7288 | -4.58% | +| xml write | borrowed / 1 | 0.1708 | 0.1712 | +0.24% | +| xml write | borrowed / 1000 | 54.2813 | 51.6765 | -4.80% | +| json read | owned / 1 | 0.0808 | 0.0809 | +0.13% | +| json read | owned / 1000 | 59.2453 | 59.6227 | +0.64% | +| json write | owned / 1 | 0.0366 | 0.0367 | +0.40% | +| json write | owned / 1000 | 24.2438 | 24.1003 | -0.59% | +| xml read | owned / 1 | 0.3133 | 0.3145 | +0.38% | +| xml read | owned / 1000 | 234.4708 | 233.4626 | -0.43% | +| xml write | owned / 1 | 0.1750 | 0.1787 | +2.15% | +| xml write | owned / 1000 | 80.0840 | 80.6449 | +0.70% | + +There is no material batch slowdown in this control. Some tiny writer cases cost +approximately 2–4 ns more, and borrowed XML batches improve in these builds. +Model sources are identical; these observations do not establish a general +Serde speedup. An apparent borrowed JSON batch-write slowdown in the initial +two-round screen disappeared in the four-round repeat; both attempts are retained. + +## Profiling and allocations + +The [0.27.0 allocation log](data/2026-10-03/runtime-optimization/diagnostics/old/old-allocations.txt), +[0.34.6 log](data/2026-10-03/runtime-optimization/diagnostics/control/control-allocations.txt), and +[retained-policy log](data/2026-10-03/runtime-optimization/diagnostics/selected/selected-allocations.txt) +show identical allocation counts on the plain fixtures. At 1,000 catalog records, +reads allocate 5,010 times and reallocate 1,014 times; writes allocate 1,001 times +and reallocate 2,007 times. Requested read bytes grew by 768 per document between +0.27.0 and 0.34.6, consistent with 48 bytes of growth across 16 reserved stack +frames. This is cumulative requested memory, **not peak RSS or retained memory**. + +The logs record `FieldSchema` growing from 96 to 160 bytes, `ScalarType` from 1 +to 32 bytes, and `ValueType` from 16 to 32 bytes. `PolyValue` stays 56 bytes. +Rich scalar cloning costs much more on enum/pattern fixtures even when the +original integer/string fixture does not add allocations. + +Callgrind collects only `measured_region`, 25 operations on the 1,000-item catalog. +The [old](data/2026-10-03/runtime-optimization/diagnostics/old/read-1000-annotated.txt), +[control](data/2026-10-03/runtime-optimization/diagnostics/control/read-1000-annotated.txt), and +[retained](data/2026-10-03/runtime-optimization/diagnostics/selected/read-1000-annotated.txt) read profiles record +283,054,621, 294,910,404 and 296,585,254 instructions respectively. +The [old](data/2026-10-03/runtime-optimization/diagnostics/old/write-1000-annotated.txt), +[control](data/2026-10-03/runtime-optimization/diagnostics/control/write-1000-annotated.txt), and +[retained](data/2026-10-03/runtime-optimization/diagnostics/selected/write-1000-annotated.txt) write profiles +record 80,501,030, 88,873,605 and 73,268,130 instructions. +Cursor write-through, formatting and unnecessary list traversal suggested the +write experiments. Read instruction counts have not recovered; timing and +instruction count are separate observations. These simulated counts measure +neither hardware cycles nor latency. Instrumented allocator consumers are never +used for the Criterion tables. + +## Experiments and verification + +The [screening archive](data/2026-10-03/runtime-optimization/screening.tar.gz) retains eight cumulative +experiments, with two processes per revision, 50 samples, one-second warmup and +two-second measurement targets, plus the working-set screens. The guard-only +serializer experiment was slightly slower; field selection was approximately +neutral on plain records. The first screen retains writer data only, and no read +conclusion is drawn from it. Borrowed metadata, regex reuse, formatter changes, +append-only output and unified scalar state were then tested separately. +The [prototype confirmation archive](data/2026-10-03/runtime-optimization/prototype-confirmation.tar.gz) +preserves the earlier confirmations and contaminated attempt. Archive checksums +and file counts are in [archives.json](data/2026-10-03/runtime-optimization/archives.json). + +The [quality gate](data/2026-10-03/runtime-optimization/verification/quality-gate.txt) passes strict Clippy, +321 Rust tests and 112 Python tests with 100% statement and branch coverage. +Additional tests cover repeated/nested lexical lists, whitespace rejection, +escaping, empty lists, integer extremes, schema edits, invalid patterns, raw +restriction text versus trimmed pattern text, split Text/CData/GeneralRef, +mixed branch order, nested frames, nil reads, cache churn and concurrency. + +The refreshed [CType sample](data/2026-10-03/runtime-optimization/verification/corpus.txt) matches the +[earlier summary/group table](data/2026-10-03/runtime-optimization/verification/corpus-reference.txt) exactly: +31/31 schema expectations and 23/28 instance round trips, with five existing +failures. The earlier log lacks a source SHA; this is a recorded regression +reference, not a full W3C conformance claim. + +An extra fixture exposed escaped XSD enumeration values and nil mixed-branch +serialization limitations. A [minimal reproducer](data/2026-10-03/runtime-optimization/verification/known-limits.rs) +produces the same errors with the [control](data/2026-10-03/runtime-optimization/verification/known-limits-control.txt) +and [retained engine](data/2026-10-03/runtime-optimization/verification/known-limits-selected.txt). These remain +separate correctness work; the optimization retains their behavior. diff --git a/docs/benchmarks/rust-xml-serde-regression-2026-10.md b/docs/benchmarks/rust-xml-serde-regression-2026-10.md index cc15a04..7fa37f3 100644 --- a/docs/benchmarks/rust-xml-serde-regression-2026-10.md +++ b/docs/benchmarks/rust-xml-serde-regression-2026-10.md @@ -11,6 +11,10 @@ and **12–14% on XML writes** compared with version 0.27.0. These are separate execution paths; generated XML methods call quick-xml directly rather than building dynamic PolyValue records. +The follow-up [dynamic runtime optimization study](rust-runtime-optimization-2026-10.md) +records branch experiments and later comparisons; the figures below remain the +unoptimized release audit. + This comparison ran on October 3, 2026, between [`cef575c` (0.27.0, September 27)](https://github.com/polyxml/PolyXML/commit/cef575c11cc4f05e877ced157036f7ff53b8687b) and [`bbbd087` (0.34.6)](https://github.com/polyxml/PolyXML/commit/bbbd087a9a8e9838a32912973cd4029c30f29c08).

    &3|T=EHZDv$O-gAeGo`JO9& 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%0D2IXQKNj&@04Nc;4 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 literal 0 HcmV?d00001 diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-0.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-0.txt new file mode 100644 index 0000000..fba2a82 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-0.txt @@ -0,0 +1,83 @@ +memcap: <=7805 MiB (60% of 13009 MiB available) [systemd MemoryMax, swap off] +Benchmarking cache_read/active_patterns/1 +Benchmarking cache_read/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/1: Collecting 100 samples in estimated 5.0068 s (65k iterations) +Benchmarking cache_read/active_patterns/1: Analyzing +cache_read/active_patterns/1 + time: [77.370 µs 77.601 µs 77.867 µs] + thrpt: [2.4128 MiB/s 2.4210 MiB/s 2.4283 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 3 (3.00%) high mild + 5 (5.00%) high severe +Benchmarking cache_read/active_patterns/16 +Benchmarking cache_read/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/16: Collecting 100 samples in estimated 5.1241 s (4000 iterations) +Benchmarking cache_read/active_patterns/16: Analyzing +cache_read/active_patterns/16 + time: [1.2693 ms 1.2748 ms 1.2812 ms] + thrpt: [2.3083 MiB/s 2.3199 MiB/s 2.3298 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 1 (1.00%) high mild + 7 (7.00%) high severe +Benchmarking cache_read/active_patterns/17 +Benchmarking cache_read/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/17: Collecting 100 samples in estimated 5.0695 s (3700 iterations) +Benchmarking cache_read/active_patterns/17: Analyzing +cache_read/active_patterns/17 + time: [1.3542 ms 1.3588 ms 1.3647 ms] + thrpt: [2.3124 MiB/s 2.3224 MiB/s 2.3303 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 6 (6.00%) high mild + 2 (2.00%) high severe +Benchmarking cache_read/active_patterns/64 +Benchmarking cache_read/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/64: Collecting 100 samples in estimated 5.2574 s (1000 iterations) +Benchmarking cache_read/active_patterns/64: Analyzing +cache_read/active_patterns/64 + time: [5.2198 ms 5.2382 ms 5.2600 ms] + thrpt: [2.3724 MiB/s 2.3823 MiB/s 2.3907 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 6 (6.00%) high mild + 6 (6.00%) high severe + +Benchmarking cache_write/active_patterns/1 +Benchmarking cache_write/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/1: Collecting 100 samples in estimated 5.0034 s (69k iterations) +Benchmarking cache_write/active_patterns/1: Analyzing +cache_write/active_patterns/1 + time: [72.064 µs 72.620 µs 73.345 µs] + thrpt: [2.5615 MiB/s 2.5871 MiB/s 2.6070 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 3 (3.00%) high mild + 10 (10.00%) high severe +Benchmarking cache_write/active_patterns/16 +Benchmarking cache_write/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/16: Collecting 100 samples in estimated 5.0118 s (4300 iterations) +Benchmarking cache_write/active_patterns/16: Analyzing +cache_write/active_patterns/16 + time: [1.1635 ms 1.1708 ms 1.1790 ms] + thrpt: [2.5084 MiB/s 2.5259 MiB/s 2.5417 MiB/s] +Found 16 outliers among 100 measurements (16.00%) + 2 (2.00%) high mild + 14 (14.00%) high severe +Benchmarking cache_write/active_patterns/17 +Benchmarking cache_write/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/17: Collecting 100 samples in estimated 5.0941 s (4000 iterations) +Benchmarking cache_write/active_patterns/17: Analyzing +cache_write/active_patterns/17 + time: [1.2602 ms 1.2666 ms 1.2743 ms] + thrpt: [2.4765 MiB/s 2.4914 MiB/s 2.5041 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 4 (4.00%) high mild + 7 (7.00%) high severe +Benchmarking cache_write/active_patterns/64 +Benchmarking cache_write/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/64: Collecting 100 samples in estimated 5.3959 s (1100 iterations) +Benchmarking cache_write/active_patterns/64: Analyzing +cache_write/active_patterns/64 + time: [4.9792 ms 5.0260 ms 5.0781 ms] + thrpt: [2.4574 MiB/s 2.4829 MiB/s 2.5062 MiB/s] +Found 6 outliers among 100 measurements (6.00%) + 4 (4.00%) high mild + 2 (2.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-1.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-1.txt new file mode 100644 index 0000000..6c9d7c6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-1.txt @@ -0,0 +1,83 @@ +memcap: <=7878 MiB (60% of 13130 MiB available) [systemd MemoryMax, swap off] +Benchmarking cache_read/active_patterns/1 +Benchmarking cache_read/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/1: Collecting 100 samples in estimated 5.0049 s (66k iterations) +Benchmarking cache_read/active_patterns/1: Analyzing +cache_read/active_patterns/1 + time: [78.161 µs 78.953 µs 79.889 µs] + thrpt: [2.3517 MiB/s 2.3796 MiB/s 2.4037 MiB/s] +Found 16 outliers among 100 measurements (16.00%) + 7 (7.00%) high mild + 9 (9.00%) high severe +Benchmarking cache_read/active_patterns/16 +Benchmarking cache_read/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/16: Collecting 100 samples in estimated 5.0684 s (4000 iterations) +Benchmarking cache_read/active_patterns/16: Analyzing +cache_read/active_patterns/16 + time: [1.2652 ms 1.2765 ms 1.2910 ms] + thrpt: [2.2908 MiB/s 2.3167 MiB/s 2.3375 MiB/s] +Found 14 outliers among 100 measurements (14.00%) + 5 (5.00%) high mild + 9 (9.00%) high severe +Benchmarking cache_read/active_patterns/17 +Benchmarking cache_read/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/17: Collecting 100 samples in estimated 5.0325 s (3700 iterations) +Benchmarking cache_read/active_patterns/17: Analyzing +cache_read/active_patterns/17 + time: [1.3414 ms 1.3481 ms 1.3563 ms] + thrpt: [2.3268 MiB/s 2.3409 MiB/s 2.3525 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 4 (4.00%) high mild + 4 (4.00%) high severe +Benchmarking cache_read/active_patterns/64 +Benchmarking cache_read/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/64: Collecting 100 samples in estimated 5.2297 s (1000 iterations) +Benchmarking cache_read/active_patterns/64: Analyzing +cache_read/active_patterns/64 + time: [5.1693 ms 5.1940 ms 5.2254 ms] + thrpt: [2.3881 MiB/s 2.4026 MiB/s 2.4140 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 6 (6.00%) high mild + 2 (2.00%) high severe + +Benchmarking cache_write/active_patterns/1 +Benchmarking cache_write/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/1: Collecting 100 samples in estimated 5.0056 s (70k iterations) +Benchmarking cache_write/active_patterns/1: Analyzing +cache_write/active_patterns/1 + time: [71.187 µs 71.663 µs 72.202 µs] + thrpt: [2.6021 MiB/s 2.6216 MiB/s 2.6392 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 5 (5.00%) high mild + 8 (8.00%) high severe +Benchmarking cache_write/active_patterns/16 +Benchmarking cache_write/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/16: Collecting 100 samples in estimated 5.0647 s (4300 iterations) +Benchmarking cache_write/active_patterns/16: Analyzing +cache_write/active_patterns/16 + time: [1.1708 ms 1.1788 ms 1.1883 ms] + thrpt: [2.4887 MiB/s 2.5088 MiB/s 2.5260 MiB/s] +Found 15 outliers among 100 measurements (15.00%) + 4 (4.00%) high mild + 11 (11.00%) high severe +Benchmarking cache_write/active_patterns/17 +Benchmarking cache_write/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/17: Collecting 100 samples in estimated 5.0699 s (4100 iterations) +Benchmarking cache_write/active_patterns/17: Analyzing +cache_write/active_patterns/17 + time: [1.2243 ms 1.2297 ms 1.2362 ms] + thrpt: [2.5528 MiB/s 2.5662 MiB/s 2.5776 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 4 (4.00%) high mild + 7 (7.00%) high severe +Benchmarking cache_write/active_patterns/64 +Benchmarking cache_write/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/64: Collecting 100 samples in estimated 5.3378 s (1100 iterations) +Benchmarking cache_write/active_patterns/64: Analyzing +cache_write/active_patterns/64 + time: [4.8544 ms 4.8938 ms 4.9400 ms] + thrpt: [2.5261 MiB/s 2.5499 MiB/s 2.5706 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 5 (5.00%) high mild + 6 (6.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-2.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-2.txt new file mode 100644 index 0000000..b91d030 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-2.txt @@ -0,0 +1,83 @@ +memcap: <=7884 MiB (60% of 13140 MiB available) [systemd MemoryMax, swap off] +Benchmarking cache_read/active_patterns/1 +Benchmarking cache_read/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/1: Collecting 100 samples in estimated 5.0055 s (66k iterations) +Benchmarking cache_read/active_patterns/1: Analyzing +cache_read/active_patterns/1 + time: [77.751 µs 78.357 µs 79.056 µs] + thrpt: [2.3765 MiB/s 2.3977 MiB/s 2.4164 MiB/s] +Found 15 outliers among 100 measurements (15.00%) + 4 (4.00%) high mild + 11 (11.00%) high severe +Benchmarking cache_read/active_patterns/16 +Benchmarking cache_read/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/16: Collecting 100 samples in estimated 5.0169 s (3900 iterations) +Benchmarking cache_read/active_patterns/16: Analyzing +cache_read/active_patterns/16 + time: [1.2753 ms 1.2804 ms 1.2866 ms] + thrpt: [2.2986 MiB/s 2.3096 MiB/s 2.3189 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 7 (7.00%) high mild + 4 (4.00%) high severe +Benchmarking cache_read/active_patterns/17 +Benchmarking cache_read/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/17: Collecting 100 samples in estimated 5.0535 s (3700 iterations) +Benchmarking cache_read/active_patterns/17: Analyzing +cache_read/active_patterns/17 + time: [1.3524 ms 1.3589 ms 1.3668 ms] + thrpt: [2.3087 MiB/s 2.3222 MiB/s 2.3334 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 4 (4.00%) high mild + 5 (5.00%) high severe +Benchmarking cache_read/active_patterns/64 +Benchmarking cache_read/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/64: Collecting 100 samples in estimated 5.3674 s (1000 iterations) +Benchmarking cache_read/active_patterns/64: Analyzing +cache_read/active_patterns/64 + time: [5.2093 ms 5.2401 ms 5.2776 ms] + thrpt: [2.3645 MiB/s 2.3814 MiB/s 2.3955 MiB/s] +Found 14 outliers among 100 measurements (14.00%) + 6 (6.00%) high mild + 8 (8.00%) high severe + +Benchmarking cache_write/active_patterns/1 +Benchmarking cache_write/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/1: Collecting 100 samples in estimated 5.0015 s (69k iterations) +Benchmarking cache_write/active_patterns/1: Analyzing +cache_write/active_patterns/1 + time: [72.042 µs 72.397 µs 72.842 µs] + thrpt: [2.5792 MiB/s 2.5951 MiB/s 2.6078 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 2 (2.00%) high mild + 6 (6.00%) high severe +Benchmarking cache_write/active_patterns/16 +Benchmarking cache_write/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/16: Collecting 100 samples in estimated 5.0448 s (4200 iterations) +Benchmarking cache_write/active_patterns/16: Analyzing +cache_write/active_patterns/16 + time: [1.1821 ms 1.1873 ms 1.1932 ms] + thrpt: [2.4784 MiB/s 2.4909 MiB/s 2.5018 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 7 (7.00%) high mild + 6 (6.00%) high severe +Benchmarking cache_write/active_patterns/17 +Benchmarking cache_write/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/17: Collecting 100 samples in estimated 5.0424 s (4000 iterations) +Benchmarking cache_write/active_patterns/17: Analyzing +cache_write/active_patterns/17 + time: [1.2430 ms 1.2491 ms 1.2570 ms] + thrpt: [2.5106 MiB/s 2.5263 MiB/s 2.5387 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 3 (3.00%) high mild + 7 (7.00%) high severe +Benchmarking cache_write/active_patterns/64 +Benchmarking cache_write/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/64: Collecting 100 samples in estimated 5.0083 s (1000 iterations) +Benchmarking cache_write/active_patterns/64: Analyzing +cache_write/active_patterns/64 + time: [4.9132 ms 4.9260 ms 4.9401 ms] + thrpt: [2.5260 MiB/s 2.5332 MiB/s 2.5399 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 4 (4.00%) high mild + 4 (4.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-build.txt new file mode 100644 index 0000000..dda2385 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline-build.txt @@ -0,0 +1,3 @@ +memcap: <=7883 MiB (60% of 13139 MiB available) [systemd MemoryMax, swap off] + Compiling core-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/core-baseline) + Finished `bench` profile [optimized] target(s) in 2.36s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline.lock new file mode 100644 index 0000000..78a11b2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/baseline.lock @@ -0,0 +1,633 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "core-regression" +version = "0.0.0" +dependencies = [ + "criterion", + "polyxml", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "num-traits", + "oorandom", + "page_size", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-0.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-0.txt new file mode 100644 index 0000000..ece199d --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-0.txt @@ -0,0 +1,83 @@ +memcap: <=7883 MiB (60% of 13138 MiB available) [systemd MemoryMax, swap off] +Benchmarking cache_read/active_patterns/1 +Benchmarking cache_read/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/1: Collecting 100 samples in estimated 5.0000 s (2.2M iterations) +Benchmarking cache_read/active_patterns/1: Analyzing +cache_read/active_patterns/1 + time: [2.3064 µs 2.3203 µs 2.3380 µs] + thrpt: [80.358 MiB/s 80.968 MiB/s 81.457 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 5 (5.00%) high mild + 6 (6.00%) high severe +Benchmarking cache_read/active_patterns/16 +Benchmarking cache_read/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/16: Collecting 100 samples in estimated 5.0008 s (144k iterations) +Benchmarking cache_read/active_patterns/16: Analyzing +cache_read/active_patterns/16 + time: [34.472 µs 34.653 µs 34.876 µs] + thrpt: [84.796 MiB/s 85.340 MiB/s 85.789 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 3 (3.00%) high mild + 10 (10.00%) high severe +Benchmarking cache_read/active_patterns/17 +Benchmarking cache_read/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/17: Collecting 100 samples in estimated 5.0173 s (24k iterations) +Benchmarking cache_read/active_patterns/17: Analyzing +cache_read/active_patterns/17 + time: [205.46 µs 206.78 µs 208.31 µs] + thrpt: [15.149 MiB/s 15.261 MiB/s 15.359 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 4 (4.00%) high mild + 7 (7.00%) high severe +Benchmarking cache_read/active_patterns/64 +Benchmarking cache_read/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/64: Collecting 100 samples in estimated 5.2379 s (1000 iterations) +Benchmarking cache_read/active_patterns/64: Analyzing +cache_read/active_patterns/64 + time: [5.2160 ms 5.2547 ms 5.3013 ms] + thrpt: [2.3539 MiB/s 2.3748 MiB/s 2.3924 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 4 (4.00%) high mild + 6 (6.00%) high severe + +Benchmarking cache_write/active_patterns/1 +Benchmarking cache_write/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/1: Collecting 100 samples in estimated 5.0000 s (6.4M iterations) +Benchmarking cache_write/active_patterns/1: Analyzing +cache_write/active_patterns/1 + time: [775.75 ns 778.71 ns 782.19 ns] + thrpt: [240.19 MiB/s 241.26 MiB/s 242.18 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 5 (5.00%) high mild + 4 (4.00%) high severe +Benchmarking cache_write/active_patterns/16 +Benchmarking cache_write/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/16: Collecting 100 samples in estimated 5.0010 s (388k iterations) +Benchmarking cache_write/active_patterns/16: Analyzing +cache_write/active_patterns/16 + time: [12.848 µs 12.945 µs 13.058 µs] + thrpt: [226.47 MiB/s 228.46 MiB/s 230.17 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 4 (4.00%) high mild + 5 (5.00%) high severe +Benchmarking cache_write/active_patterns/17 +Benchmarking cache_write/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/17: Collecting 100 samples in estimated 5.0017 s (145k iterations) +Benchmarking cache_write/active_patterns/17: Analyzing +cache_write/active_patterns/17 + time: [34.459 µs 34.625 µs 34.808 µs] + thrpt: [90.661 MiB/s 91.141 MiB/s 91.578 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 8 (8.00%) high mild + 4 (4.00%) high severe +Benchmarking cache_write/active_patterns/64 +Benchmarking cache_write/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/64: Collecting 100 samples in estimated 5.0142 s (7300 iterations) +Benchmarking cache_write/active_patterns/64: Analyzing +cache_write/active_patterns/64 + time: [686.74 µs 692.64 µs 699.70 µs] + thrpt: [17.835 MiB/s 18.016 MiB/s 18.171 MiB/s] +Found 14 outliers among 100 measurements (14.00%) + 5 (5.00%) high mild + 9 (9.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-1.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-1.txt new file mode 100644 index 0000000..71d6e88 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-1.txt @@ -0,0 +1,83 @@ +memcap: <=7884 MiB (60% of 13140 MiB available) [systemd MemoryMax, swap off] +Benchmarking cache_read/active_patterns/1 +Benchmarking cache_read/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/1: Collecting 100 samples in estimated 5.0001 s (2.2M iterations) +Benchmarking cache_read/active_patterns/1: Analyzing +cache_read/active_patterns/1 + time: [2.3092 µs 2.3204 µs 2.3332 µs] + thrpt: [80.522 MiB/s 80.965 MiB/s 81.359 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 3 (3.00%) high mild + 9 (9.00%) high severe +Benchmarking cache_read/active_patterns/16 +Benchmarking cache_read/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/16: Collecting 100 samples in estimated 5.0017 s (144k iterations) +Benchmarking cache_read/active_patterns/16: Analyzing +cache_read/active_patterns/16 + time: [34.380 µs 34.537 µs 34.727 µs] + thrpt: [85.159 MiB/s 85.630 MiB/s 86.019 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 4 (4.00%) high mild + 6 (6.00%) high severe +Benchmarking cache_read/active_patterns/17 +Benchmarking cache_read/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/17: Collecting 100 samples in estimated 5.0106 s (25k iterations) +Benchmarking cache_read/active_patterns/17: Analyzing +cache_read/active_patterns/17 + time: [203.39 µs 204.60 µs 206.11 µs] + thrpt: [15.311 MiB/s 15.424 MiB/s 15.516 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 3 (3.00%) high mild + 5 (5.00%) high severe +Benchmarking cache_read/active_patterns/64 +Benchmarking cache_read/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/64: Collecting 100 samples in estimated 5.2104 s (1000 iterations) +Benchmarking cache_read/active_patterns/64: Analyzing +cache_read/active_patterns/64 + time: [5.2138 ms 5.2538 ms 5.3014 ms] + thrpt: [2.3539 MiB/s 2.3752 MiB/s 2.3934 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 5 (5.00%) high mild + 6 (6.00%) high severe + +Benchmarking cache_write/active_patterns/1 +Benchmarking cache_write/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/1: Collecting 100 samples in estimated 5.0001 s (6.1M iterations) +Benchmarking cache_write/active_patterns/1: Analyzing +cache_write/active_patterns/1 + time: [793.39 ns 796.46 ns 800.09 ns] + thrpt: [234.81 MiB/s 235.88 MiB/s 236.80 MiB/s] +Found 9 outliers among 100 measurements (9.00%) + 3 (3.00%) high mild + 6 (6.00%) high severe +Benchmarking cache_write/active_patterns/16 +Benchmarking cache_write/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/16: Collecting 100 samples in estimated 5.0005 s (392k iterations) +Benchmarking cache_write/active_patterns/16: Analyzing +cache_write/active_patterns/16 + time: [12.635 µs 12.696 µs 12.769 µs] + thrpt: [231.60 MiB/s 232.94 MiB/s 234.07 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 4 (4.00%) high mild + 9 (9.00%) high severe +Benchmarking cache_write/active_patterns/17 +Benchmarking cache_write/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/17: Collecting 100 samples in estimated 5.0009 s (145k iterations) +Benchmarking cache_write/active_patterns/17: Analyzing +cache_write/active_patterns/17 + time: [34.422 µs 34.669 µs 34.988 µs] + thrpt: [90.195 MiB/s 91.025 MiB/s 91.676 MiB/s] +Found 8 outliers among 100 measurements (8.00%) + 2 (2.00%) high mild + 6 (6.00%) high severe +Benchmarking cache_write/active_patterns/64 +Benchmarking cache_write/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/64: Collecting 100 samples in estimated 5.0066 s (7300 iterations) +Benchmarking cache_write/active_patterns/64: Analyzing +cache_write/active_patterns/64 + time: [683.27 µs 688.29 µs 694.40 µs] + thrpt: [17.971 MiB/s 18.130 MiB/s 18.263 MiB/s] +Found 11 outliers among 100 measurements (11.00%) + 3 (3.00%) high mild + 8 (8.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-2.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-2.txt new file mode 100644 index 0000000..bda9397 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-2.txt @@ -0,0 +1,83 @@ +memcap: <=7885 MiB (60% of 13141 MiB available) [systemd MemoryMax, swap off] +Benchmarking cache_read/active_patterns/1 +Benchmarking cache_read/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/1: Collecting 100 samples in estimated 5.0001 s (2.2M iterations) +Benchmarking cache_read/active_patterns/1: Analyzing +cache_read/active_patterns/1 + time: [2.3418 µs 2.3702 µs 2.4058 µs] + thrpt: [78.092 MiB/s 79.264 MiB/s 80.226 MiB/s] +Found 13 outliers among 100 measurements (13.00%) + 4 (4.00%) high mild + 9 (9.00%) high severe +Benchmarking cache_read/active_patterns/16 +Benchmarking cache_read/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/16: Collecting 100 samples in estimated 5.0030 s (145k iterations) +Benchmarking cache_read/active_patterns/16: Analyzing +cache_read/active_patterns/16 + time: [34.369 µs 34.525 µs 34.749 µs] + thrpt: [85.106 MiB/s 85.657 MiB/s 86.048 MiB/s] +Found 7 outliers among 100 measurements (7.00%) + 4 (4.00%) high mild + 3 (3.00%) high severe +Benchmarking cache_read/active_patterns/17 +Benchmarking cache_read/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/17: Collecting 100 samples in estimated 5.0029 s (24k iterations) +Benchmarking cache_read/active_patterns/17: Analyzing +cache_read/active_patterns/17 + time: [205.36 µs 206.63 µs 208.05 µs] + thrpt: [15.168 MiB/s 15.272 MiB/s 15.366 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 5 (5.00%) high mild + 7 (7.00%) high severe +Benchmarking cache_read/active_patterns/64 +Benchmarking cache_read/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_read/active_patterns/64: Collecting 100 samples in estimated 5.2273 s (1000 iterations) +Benchmarking cache_read/active_patterns/64: Analyzing +cache_read/active_patterns/64 + time: [5.2373 ms 5.2702 ms 5.3076 ms] + thrpt: [2.3511 MiB/s 2.3678 MiB/s 2.3827 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 6 (6.00%) high mild + 4 (4.00%) high severe + +Benchmarking cache_write/active_patterns/1 +Benchmarking cache_write/active_patterns/1: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/1: Collecting 100 samples in estimated 5.0000 s (6.1M iterations) +Benchmarking cache_write/active_patterns/1: Analyzing +cache_write/active_patterns/1 + time: [808.79 ns 812.81 ns 817.20 ns] + thrpt: [229.90 MiB/s 231.14 MiB/s 232.29 MiB/s] +Found 5 outliers among 100 measurements (5.00%) + 4 (4.00%) high mild + 1 (1.00%) high severe +Benchmarking cache_write/active_patterns/16 +Benchmarking cache_write/active_patterns/16: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/16: Collecting 100 samples in estimated 5.0010 s (392k iterations) +Benchmarking cache_write/active_patterns/16: Analyzing +cache_write/active_patterns/16 + time: [12.726 µs 12.870 µs 13.069 µs] + thrpt: [226.28 MiB/s 229.79 MiB/s 232.38 MiB/s] +Found 12 outliers among 100 measurements (12.00%) + 4 (4.00%) high mild + 8 (8.00%) high severe +Benchmarking cache_write/active_patterns/17 +Benchmarking cache_write/active_patterns/17: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/17: Collecting 100 samples in estimated 5.0014 s (144k iterations) +Benchmarking cache_write/active_patterns/17: Analyzing +cache_write/active_patterns/17 + time: [34.903 µs 35.454 µs 36.130 µs] + thrpt: [87.343 MiB/s 89.007 MiB/s 90.412 MiB/s] +Found 10 outliers among 100 measurements (10.00%) + 1 (1.00%) high mild + 9 (9.00%) high severe +Benchmarking cache_write/active_patterns/64 +Benchmarking cache_write/active_patterns/64: Warming up for 3.0000 s +Benchmarking cache_write/active_patterns/64: Collecting 100 samples in estimated 5.0297 s (7300 iterations) +Benchmarking cache_write/active_patterns/64: Analyzing +cache_write/active_patterns/64 + time: [684.12 µs 689.33 µs 695.60 µs] + thrpt: [17.940 MiB/s 18.103 MiB/s 18.241 MiB/s] +Found 15 outliers among 100 measurements (15.00%) + 5 (5.00%) high mild + 10 (10.00%) high severe + diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-build.txt b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-build.txt new file mode 100644 index 0000000..75d22c8 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current-build.txt @@ -0,0 +1,3 @@ +memcap: <=7827 MiB (60% of 13046 MiB available) [systemd MemoryMax, swap off] + Compiling core-regression v0.0.0 (/home/bailey/github/PolyXML/benchmarks/rust-xml-regression/target/core-current) + Finished `bench` profile [optimized] target(s) in 2.33s diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current.lock b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current.lock new file mode 100644 index 0000000..78a11b2 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/current.lock @@ -0,0 +1,633 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74872d07caf508b30a21f6836e7d7016a2eaf7d9ff4f48deaa58cd8a0407630" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "core-regression" +version = "0.0.0" +dependencies = [ + "criterion", + "polyxml", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "num-traits", + "oorandom", + "page_size", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memo-map" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c8c750f1a07ea702bbd212bd999fceece9b3d1508b17023b3e174583124b" + +[[package]] +name = "minijinja" +version = "2.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86886cf6dbf4e614b19c9a1eec9775f021869d7eadde0fc73921a81b90c9b4c9" +dependencies = [ + "memo-map", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "phf_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b585a510fb76fdebead6897982ef2a03a21d8e6cbcca904999742a4afc6ffe" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb62e0959d5a1bebc965f4d15d9e2b7cea002b6b0f5ba8cde6cc26738467100" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fd9027e2d9319be6349febd1db4e8d02aa544921200c9b777720ac34a3aa89" +dependencies = [ + "siphasher", +] + +[[package]] +name = "polyxml" +version = "0.34.6" +dependencies = [ + "heck", + "lexical-core", + "memchr", + "minijinja", + "phf_codegen", + "quick-xml", + "regex", + "serde", + "serde_json", + "smallvec", + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "smallvec" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/harness.rs b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/harness.rs new file mode 100644 index 0000000..96494dd --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/harness.rs @@ -0,0 +1,70 @@ +use criterion::{ + criterion_group, criterion_main, BenchmarkId, Criterion, SamplingMode, Throughput, +}; +use polyxml::schema::{FieldKind, FieldSchema, ModelSchema, ScalarType, ValueType}; +use polyxml::{deserialize, serialize}; +use std::{hint::black_box, sync::Arc}; + +// Cycle through more than the admitted cache capacity to compare eviction policies. +// Schema construction and correctness checks remain outside measurement. +fn fixture(patterns: usize) -> (Arc, Vec) { + let mut builder = ModelSchema::builder("Root"); + for i in 0..patterns { + builder = builder.field(FieldSchema::new( + format!("values{i}"), + format!("Value{i}").as_bytes(), + FieldKind::Element, + ValueType::List(Box::new(ValueType::Scalar(ScalarType::Pattern( + Box::new(ScalarType::String), + vec![format!("P{i}-[0-9]{{3}}")], + )))), + )); + } + let schema = builder.build(); + let mut xml = String::from(""); + for _ in 0..8 { + for i in 0..patterns { + xml.push_str(&format!("P{i}-123")); + } + } + xml.push_str(""); + let value = deserialize(xml.as_bytes(), Arc::clone(&schema)).unwrap(); + for i in 0..patterns { + let values = value.get(&format!("values{i}")).unwrap().as_list().unwrap(); + assert_eq!(values.len(), 8); + assert!(values + .iter() + .all(|value| value.as_str() == Some(format!("P{i}-123").as_str()))); + } + let output = serialize("Root", &value, &schema, None).unwrap(); + assert_eq!(value, deserialize(&output, Arc::clone(&schema)).unwrap()); + (schema, xml.into_bytes()) +} + +fn benchmarks(c: &mut Criterion) { + for operation in ["cache_read", "cache_write"] { + let mut group = c.benchmark_group(operation); + group.sampling_mode(SamplingMode::Flat); + for patterns in [1, 16, 17, 64] { + let (schema, xml) = fixture(patterns); + let value = deserialize(&xml, Arc::clone(&schema)).unwrap(); + group.throughput(Throughput::Bytes(xml.len() as u64)); + group.bench_with_input( + BenchmarkId::new("active_patterns", patterns), + &patterns, + |b, _| { + b.iter(|| { + if operation == "cache_read" { + black_box(deserialize(black_box(&xml), Arc::clone(&schema)).unwrap()); + } else { + black_box(serialize("Root", black_box(&value), &schema, None).unwrap()); + } + }); + }, + ); + } + group.finish(); + } +} +criterion_group!(benches, benchmarks); +criterion_main!(benches); diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/metadata.json b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/metadata.json new file mode 100644 index 0000000..30a54e6 --- /dev/null +++ b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/metadata.json @@ -0,0 +1,19 @@ +{ + "revisions": { + "baseline": "bbbd087a9a8e9838a32912973cd4029c30f29c08", + "current": "7f845ae043b68cdb3166d04ce74eaa99bc9c2b0d" + }, + "core_status": { + "baseline": "", + "current": "" + }, + "sample_size": 100, + "warmup_seconds": 3.0, + "measurement_seconds": 5.0, + "rounds": 3, + "filter": "", + "order": "alternate baseline/current per round", + "os": "Linux-6.18.40.1-microsoft-standard-WSL2-x86_64-with-glibc2.43", + "cpu": "11th Gen Intel(R) Core(TM) i5-11600K @ 3.90GHz", + "rustc": "rustc 1.99.0 (b940084d7 2026-09-28)\nbinary: rustc\ncommit-hash: b940084d7eb6a299eb4bfeb8e34901bc051e7ac4\ncommit-date: 2026-09-28\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.0\nLLVM version: 23.1.1\n" +} diff --git a/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/samples.tar.gz b/docs/benchmarks/data/2026-10-03/runtime-optimization/selected-cache-boundaries/samples.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b19cdbb7fb0fadaa9d2b957d52dd315727879e76 GIT binary patch literal 56431 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