"inject the given attribute in the crate"),
self_profile: bool = (false, parse_bool, [UNTRACKED],
"run the self profiler"),
+ profile_json: bool = (false, parse_bool, [UNTRACKED],
+ "output a json file with profiler results"),
}
pub fn default_lib_output() -> CrateType {
profiler.print_results(&self.opts);
}
+ pub fn save_json_results(&self) {
+ let profiler = self.self_profiling.borrow();
+ profiler.save_results();
+ }
+
pub fn print_perf_stats(&self) {
println!(
"Total time spent computing symbol hashes: {}",
use session::config::Options;
+use std::fs;
use std::io::{self, StdoutLock, Write};
use std::time::Instant;
p!("Linking", linking);
p!("Other", other);
}
+
+ fn json(&self) -> String {
+ format!("[
+ {{
+ \"category\": \"Parsing\",
+ \"time_ms\": {}
+ }},
+ {{
+ \"category\": \"Expansion\",
+ \"time_ms\": {}
+ }},
+ {{
+ \"category\": \"TypeChecking\",
+ \"time_ms\": {}
+ }},
+ {{
+ \"category\": \"BorrowChecking\",
+ \"time_ms\": {}
+ }},
+ {{
+ \"category\": \"Codegen\",
+ \"time_ms\": {}
+ }},
+ {{
+ \"category\": \"Linking\",
+ \"time_ms\": {}
+ }},
+ {{
+ \"category\": \"Other\",
+ \"time_ms\": {}
+ }}
+ ]",
+ self.times.parsing / 1_000_000,
+ self.times.expansion / 1_000_000,
+ self.times.type_checking / 1_000_000,
+ self.times.borrow_checking / 1_000_000,
+ self.times.codegen / 1_000_000,
+ self.times.linking / 1_000_000,
+ self.times.other / 1_000_000)
+ }
}
pub struct SelfProfiler {
writeln!(lock, "Incremental: {}", incremental).unwrap();
}
+ pub fn save_results(&self) {
+ fs::write("self_profiler_results.json", self.data.json()).unwrap();
+ }
+
pub fn record_activity<'a>(&'a mut self, category: ProfileCategory) -> ProfilerActivity<'a> {
self.start_activity(category);