Keep track of durations of each pipeline stage

This commit is contained in:
greg 2018-08-14 22:56:22 -07:00
parent 0c0690e86e
commit 6a548c9086

View File

@ -1,6 +1,7 @@
use std::collections::HashMap; use std::collections::HashMap;
use colored::*; use colored::*;
use std::fmt::Write; use std::fmt::Write;
use std::time;
pub struct LLVMCodeString(pub String); pub struct LLVMCodeString(pub String);
@ -35,12 +36,14 @@ impl Default for ExecutionMethod {
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct UnfinishedComputation { pub struct UnfinishedComputation {
artifacts: Vec<(String, TraceArtifact)>, artifacts: Vec<(String, TraceArtifact)>,
pub durations: Vec<time::Duration>,
pub cur_debug_options: Vec<String>, pub cur_debug_options: Vec<String>,
} }
#[derive(Debug)] #[derive(Debug)]
pub struct FinishedComputation { pub struct FinishedComputation {
artifacts: Vec<(String, TraceArtifact)>, artifacts: Vec<(String, TraceArtifact)>,
durations: Vec<time::Duration>,
text_output: Result<String, String>, text_output: Result<String, String>,
} }
@ -51,13 +54,15 @@ impl UnfinishedComputation {
pub fn finish(self, text_output: Result<String, String>) -> FinishedComputation { pub fn finish(self, text_output: Result<String, String>) -> FinishedComputation {
FinishedComputation { FinishedComputation {
artifacts: self.artifacts, artifacts: self.artifacts,
text_output text_output,
durations: self.durations
} }
} }
pub fn output(self, output: Result<String, String>) -> FinishedComputation { pub fn output(self, output: Result<String, String>) -> FinishedComputation {
FinishedComputation { FinishedComputation {
artifacts: self.artifacts, artifacts: self.artifacts,
text_output: output text_output: output,
durations: self.durations,
} }
} }
} }
@ -128,7 +133,7 @@ impl TraceArtifact {
pub trait ProgrammingLanguageInterface { pub trait ProgrammingLanguageInterface {
fn execute_pipeline(&mut self, _input: &str, _eval_options: &EvalOptions) -> FinishedComputation { fn execute_pipeline(&mut self, _input: &str, _eval_options: &EvalOptions) -> FinishedComputation {
FinishedComputation { artifacts: vec![], text_output: Err(format!("Execution pipeline not done")) } FinishedComputation { artifacts: vec![], text_output: Err(format!("Execution pipeline not done")), durations: vec![] }
} }
fn get_language_name(&self) -> String; fn get_language_name(&self) -> String;
@ -164,9 +169,10 @@ macro_rules! pass_chain {
macro_rules! pass_chain_helper { macro_rules! pass_chain_helper {
(($state:expr, $comp:expr, $options:expr); $input:expr, $pass:path $(, $rest:path)*) => { (($state:expr, $comp:expr, $options:expr); $input:expr, $pass:path $(, $rest:path)*) => {
{ {
use std::time;
use schala_repl::PassDebugOptionsDescriptor; use schala_repl::PassDebugOptionsDescriptor;
let pass_name = stringify!($pass); let pass_name = stringify!($pass);
let output = { let (output, duration) = {
let ref debug_map = $options.debug_passes; let ref debug_map = $options.debug_passes;
let debug_handle = match debug_map.get(pass_name) { let debug_handle = match debug_map.get(pass_name) {
Some(PassDebugOptionsDescriptor { opts }) => { Some(PassDebugOptionsDescriptor { opts }) => {
@ -176,8 +182,12 @@ macro_rules! pass_chain_helper {
} }
_ => None _ => None
}; };
$pass($state, $input, debug_handle) let start = time::Instant::now();
let pass_output = $pass($state, $input, debug_handle);
let elapsed = start.elapsed();
(pass_output, elapsed)
}; };
$comp.durations.push(duration);
match output { match output {
Ok(result) => pass_chain_helper! { ($state, $comp, $options); result $(, $rest)* }, Ok(result) => pass_chain_helper! { ($state, $comp, $options); result $(, $rest)* },
Err(err) => { Err(err) => {