Skip to content

Commit bfde229

Browse files
committed
Add section timing data to JSON --timings output
1 parent fe8a052 commit bfde229

File tree

3 files changed

+16
-7
lines changed

3 files changed

+16
-7
lines changed

src/cargo/core/compiler/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ use cargo_util_schemas::manifest::TomlDebugInfo;
105105
use cargo_util_schemas::manifest::TomlTrimPaths;
106106
use cargo_util_schemas::manifest::TomlTrimPathsValue;
107107
use rustfix::diagnostics::Applicability;
108+
pub(crate) use timings::CompilationSection;
108109

109110
const RUSTDOC_CRATE_VERSION_FLAG: &str = "--crate-version";
110111

src/cargo/core/compiler/timings.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::util::style;
1212
use crate::util::{CargoResult, GlobalContext};
1313
use anyhow::Context as _;
1414
use cargo_util::paths;
15+
use indexmap::IndexMap;
1516
use std::collections::HashMap;
1617
use std::io::{BufWriter, Write};
1718
use std::thread::available_parallelism;
@@ -64,8 +65,9 @@ pub struct Timings<'gctx> {
6465
cpu_usage: Vec<(f64, f64)>,
6566
}
6667

67-
/// Section of compilation.
68-
struct TimingSection {
68+
/// Section of compilation (e.g. frontend, backend, linking).
69+
#[derive(Copy, Clone, serde::Serialize)]
70+
pub struct CompilationSection {
6971
/// Start of the section, as an offset in seconds from `UnitTime::start`.
7072
start: f64,
7173
/// End of the section, as an offset in seconds from `UnitTime::start`.
@@ -89,7 +91,11 @@ struct UnitTime {
8991
/// Same as `unlocked_units`, but unlocked by rmeta.
9092
unlocked_rmeta_units: Vec<Unit>,
9193
/// Individual compilation section durations, gathered from `--json=timings`.
92-
sections: HashMap<String, TimingSection>,
94+
sections: HashMap<String, CompilationSection>,
95+
/// IndexMap is used to keep original insertion order, we want to be able to tell which
96+
/// sections were started in which order.
97+
sections: IndexMap<String, CompilationSection>,
98+
}
9399
}
94100

95101
/// Periodic concurrency tracking information.
@@ -238,6 +244,7 @@ impl<'gctx> Timings<'gctx> {
238244
mode: unit_time.unit.mode,
239245
duration: unit_time.duration,
240246
rmeta_time: unit_time.rmeta_time,
247+
sections: unit_time.sections.clone(),
241248
}
242249
.to_json_string();
243250
crate::drop_println!(self.gctx, "{}", msg);
@@ -616,20 +623,20 @@ impl UnitTime {
616623
.sections
617624
.insert(
618625
name.to_string(),
619-
TimingSection {
626+
CompilationSection {
620627
start: now - self.start,
621628
end: None,
622629
},
623630
)
624631
.is_some()
625632
{
626-
warn!("Compilation section {name} started more than once");
633+
warn!("compilation section {name} started more than once");
627634
}
628635
}
629636

630637
fn end_section(&mut self, name: &str, now: f64) {
631638
let Some(section) = self.sections.get_mut(name) else {
632-
warn!("Compilation section {name} ended, but it has no start recorded");
639+
warn!("compilation section {name} ended, but it has no start recorded");
633640
return;
634641
};
635642
section.end = Some(now - self.start);

src/cargo/util/machine_message.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use serde::ser;
66
use serde_json::{json, value::RawValue};
77

88
use crate::core::Target;
9-
use crate::core::compiler::CompileMode;
9+
use crate::core::compiler::{CompilationSection, CompileMode};
1010

1111
pub trait Message: ser::Serialize {
1212
fn reason(&self) -> &str;
@@ -95,6 +95,7 @@ pub struct TimingInfo<'a> {
9595
pub duration: f64,
9696
#[serde(skip_serializing_if = "Option::is_none")]
9797
pub rmeta_time: Option<f64>,
98+
pub sections: Vec<(String, CompilationSection)>,
9899
}
99100

100101
impl<'a> Message for TimingInfo<'a> {

0 commit comments

Comments
 (0)