use time;
use self::time::Duration;
pub struct CompilationStats {
pub weld_times: Vec<(String, Duration)>,
pub pass_times: Vec<(String, Duration)>,
pub llvm_times: Vec<(String, Duration)>,
}
impl CompilationStats {
pub fn new() -> CompilationStats {
CompilationStats {
weld_times: Vec::new(),
pass_times: Vec::new(),
llvm_times: Vec::new(),
}
}
fn format_time(duration: &Duration) -> f64 {
if duration.num_milliseconds() == 0 {
if let Some(v) = duration.num_microseconds() {
(v as f64) / 1000.0
} else {
0.0
}
} else {
duration.num_milliseconds() as f64
}
}
pub fn pretty_print(&self) -> String {
let mut result = String::new();
result.push_str("Weld Compiler:\n");
let mut total = Duration::milliseconds(0);
for &(ref name, ref dur) in self.weld_times.iter() {
result.push_str(&format!(
"\t{}: {:.3} ms\n",
name,
CompilationStats::format_time(dur)
));
total = total + *dur;
}
result.push_str(&format!(
"\t\x1b[0;32mWeld Compiler Total\x1b[0m {} ms\n",
CompilationStats::format_time(&total)
));
let mut total = Duration::milliseconds(0);
result.push_str("Weld Optimization Passes:\n");
for &(ref name, ref dur) in self.pass_times.iter() {
result.push_str(&format!(
"\t{}: {:.3} ms\n",
name,
CompilationStats::format_time(dur)
));
total = total + *dur;
}
result.push_str(&format!(
"\t\x1b[0;32mWeld Optimization Passes Total\x1b[0m {} ms\n",
CompilationStats::format_time(&total)
));
let mut total = Duration::milliseconds(0);
result.push_str("LLVM:\n");
for &(ref name, ref dur) in self.llvm_times.iter() {
result.push_str(&format!(
"\t{}: {:.3} ms\n",
name,
CompilationStats::format_time(dur)
));
total = total + *dur;
}
result.push_str(&format!(
"\t\x1b[0;32mLLVM Total\x1b[0m {} ms\n",
CompilationStats::format_time(&total)
));
result
}
}