Store timings output in `timings::Output` struct

finchie
Apr 22, 2024, 7:05 AM
T34OV3YQGRFMXYWEFLBCFMX3U2TVXF552B5B3S6HMBJZU66PDMYAC

Dependencies

  • [2] V2NPEIA6 Use custom types to deserialize `--timings=json` output
  • [3] UQJO24KB Use `forceatlas2` to construct graph layout
  • [4] ZPFD3275 Switch from `cargo_metadata`+`petgraph` to `guppy`
  • [5] 7CVIL7UJ Create simple metadata parser
  • [6] LOR3KOXG Parse JSON output from `cargo build --timings`

Change contents

  • edit in src/timings.rs at line 1
    [3.35]
    [3.36]
    use std::collections::HashMap;
  • replacement in src/timings.rs at line 6
    [2.41][2.41:83]()
    use cargo_metadata::{Edition, PackageId};
    [2.41]
    [3.149]
    use cargo_metadata::Edition;
    use guppy::PackageId;
  • replacement in src/timings.rs at line 68
    [3.752][3.752:773]()
    pub struct Message {
    [3.752]
    [2.1607]
    struct Message {
  • replacement in src/timings.rs at line 70
    [2.1627][3.793:820](),[3.793][3.793:820]()
    package_id: PackageId,
    [2.1627]
    [3.820]
    package_id: cargo_metadata::PackageId,
  • replacement in src/timings.rs at line 77
    [3.907][3.907:1069](),[3.1069][2.1628:1664](),[2.1664][3.1105:1250](),[3.1105][3.1105:1250]()
    pub fn generate() -> Vec<Message> {
    // TODO: `cargo build --timings=json` seems to only work on a clean build
    Command::new("cargo")
    .arg("clean")
    .args(CARGO_CUSTOM_PROFILE)
    .args(&["--profile", "depwiz"])
    .stdout(Stdio::inherit())
    .stderr(Stdio::inherit())
    .output()
    .unwrap();
    [3.907]
    [3.1250]
    pub struct Output {
    repr: HashMap<PackageId, Vec<Message>>,
    }
  • replacement in src/timings.rs at line 81
    [3.1251][3.1251:1319](),[3.1319][2.1665:1701](),[2.1701][3.1355:1565](),[3.1355][3.1355:1565]()
    let timings_ouput = Command::new("cargo")
    .arg("build")
    .args(CARGO_CUSTOM_PROFILE)
    .args(&[
    "--profile",
    "depwiz",
    "-Zunstable-options",
    "--timings=json",
    ])
    .stderr(Stdio::inherit())
    .output()
    .unwrap();
    [3.1251]
    [3.1565]
    impl Output {
    pub fn new() -> Self {
    // TODO: `cargo build --timings=json` seems to only work on a clean build
    Command::new("cargo")
    .arg("clean")
    .args(CARGO_CUSTOM_PROFILE)
    .args(&["--profile", "depwiz"])
    .stdout(Stdio::inherit())
    .stderr(Stdio::inherit())
    .output()
    .unwrap();
    let timings_ouput = Command::new("cargo")
    .arg("build")
    .args(CARGO_CUSTOM_PROFILE)
    .args(&[
    "--profile",
    "depwiz",
    "-Zunstable-options",
    "--timings=json",
    ])
    .stderr(Stdio::inherit())
    .output()
    .unwrap();
  • replacement in src/timings.rs at line 106
    [3.1566][3.1566:1719]()
    let mut timings = Vec::new();
    let mut timings_buffer = BufReader::new(timings_ouput.stdout.as_slice());
    let mut message_buffer = Vec::new();
    [3.1566]
    [3.1719]
    let mut timings = HashMap::new();
    let mut timings_buffer = BufReader::new(timings_ouput.stdout.as_slice());
    let mut message_buffer = Vec::new();
  • replacement in src/timings.rs at line 110
    [3.1720][3.1720:1829]()
    loop {
    timings_buffer
    .read_until(b'\n', &mut message_buffer)
    .unwrap();
    [3.1720]
    [3.1829]
    loop {
    timings_buffer
    .read_until(b'\n', &mut message_buffer)
    .unwrap();
  • replacement in src/timings.rs at line 115
    [3.1830][3.1830:2446]()
    let json_message: Message = match serde_json::from_slice(&message_buffer) {
    Ok(message) => message,
    Err(err) => {
    use serde_json::error::Category;
    match err.classify() {
    Category::Eof => break,
    Category::Data => todo!(
    "JSON object not properly handled, got `{err:?}` for message: `{}`",
    String::from_utf8(message_buffer.clone()).unwrap()
    ),
    _ => {
    panic!("Unexpected error while parsing: {err:?}");
    [3.1830]
    [3.2446]
    let json_message: Message = match serde_json::from_slice(&message_buffer) {
    Ok(message) => message,
    Err(err) => {
    use serde_json::error::Category;
    match err.classify() {
    Category::Eof => break,
    Category::Data => todo!(
    "JSON object not properly handled, got `{err:?}` for message: `{}`",
    String::from_utf8(message_buffer.clone()).unwrap()
    ),
    _ => {
    panic!("Unexpected error while parsing: {err:?}");
    }
  • replacement in src/timings.rs at line 130
    [3.2486][3.2486:2511]()
    }
    };
    [3.2486]
    [3.2511]
    };
    let pkg_id = PackageId::new(json_message.package_id.repr.clone());
    let pkg_timings: &mut Vec<Message> = timings.entry(pkg_id).or_default();
    pkg_timings.push(json_message);
    message_buffer.clear();
    }
  • replacement in src/timings.rs at line 139
    [3.2621][3.2621:2689]()
    timings.push(json_message);
    message_buffer.clear();
    [3.2512]
    [3.2689]
    Self { repr: timings }
  • edit in src/timings.rs at line 141
    [3.2695][3.2695:2708]()
    timings
  • replacement in src/main.rs at line 8
    [3.718][3.2726:2757]()
    dbg!(timings::generate());
    [3.718]
    [3.2757]
    let timings = timings::Output::new();