From 92556fdfd0514f7e889761e1bb6eea17efc13feb Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Tue, 12 Jan 2021 11:26:14 +0100 Subject: [PATCH] Use StableHashMap instead of HashMap + BTreeSet for diagnostics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a significant reduction in the release mode compile times of bevy_diagnostics ``` Benchmark #1: touch crates/bevy_diagnostic/src/lib.rs && cargo build --release -p bevy_diagnostic -j1 Time (mean ± σ): 3.645 s ± 0.009 s [User: 3.551 s, System: 0.094 s] Range (min … max): 3.632 s … 3.658 s 20 runs ``` ``` Benchmark #1: touch crates/bevy_diagnostic/src/lib.rs && cargo build --release -p bevy_diagnostic -j1 Time (mean ± σ): 2.938 s ± 0.012 s [User: 2.850 s, System: 0.090 s] Range (min … max): 2.919 s … 2.969 s 20 runs ``` --- crates/bevy_diagnostic/src/diagnostic.rs | 16 +++++----------- .../src/log_diagnostics_plugin.rs | 4 ++-- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/crates/bevy_diagnostic/src/diagnostic.rs b/crates/bevy_diagnostic/src/diagnostic.rs index 549ecdb20f7558..4a7cd780fbfa7a 100644 --- a/crates/bevy_diagnostic/src/diagnostic.rs +++ b/crates/bevy_diagnostic/src/diagnostic.rs @@ -1,5 +1,5 @@ -use bevy_utils::{Duration, HashMap, Instant, Uuid}; -use std::collections::{BTreeSet, VecDeque}; +use bevy_utils::{Duration, StableHashMap, Instant, Uuid}; +use std::collections::VecDeque; /// Unique identifier for a [Diagnostic] #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, PartialOrd, Ord)] @@ -101,13 +101,13 @@ impl Diagnostic { /// A collection of [Diagnostic]s #[derive(Debug, Default)] pub struct Diagnostics { - diagnostics: HashMap, - ordered_diagnostics: BTreeSet, + // This uses a [`StableHashMap`] to ensure that the iteration order is deterministic between + // runs when all diagnostics are inserted in the same order. + diagnostics: StableHashMap, } impl Diagnostics { pub fn add(&mut self, diagnostic: Diagnostic) { - self.ordered_diagnostics.insert(diagnostic.id); self.diagnostics.insert(diagnostic.id, diagnostic); } @@ -134,10 +134,4 @@ impl Diagnostics { pub fn iter(&self) -> impl Iterator { self.diagnostics.values() } - - pub fn ordered_iter(&self) -> impl Iterator { - self.ordered_diagnostics - .iter() - .filter_map(move |k| self.diagnostics.get(k)) - } } diff --git a/crates/bevy_diagnostic/src/log_diagnostics_plugin.rs b/crates/bevy_diagnostic/src/log_diagnostics_plugin.rs index 276480786f6118..6e5d2636d76703 100644 --- a/crates/bevy_diagnostic/src/log_diagnostics_plugin.rs +++ b/crates/bevy_diagnostic/src/log_diagnostics_plugin.rs @@ -78,7 +78,7 @@ impl LogDiagnosticsPlugin { Self::log_diagnostic(diagnostic); } } else { - for diagnostic in diagnostics.ordered_iter() { + for diagnostic in diagnostics.iter() { Self::log_diagnostic(diagnostic); } } @@ -96,7 +96,7 @@ impl LogDiagnosticsPlugin { debug!("{:#?}\n", diagnostic); } } else { - for diagnostic in diagnostics.ordered_iter() { + for diagnostic in diagnostics.iter() { debug!("{:#?}\n", diagnostic); } }