import os import random import pandas as pd import plotly.graph_objects as go import argparse def generateRandomColors(df, colorList): for _ in range(len(df)): r = random.random() g = random.random() b = random.random() colorList.append(f"rgb({int(r*255)}, {int(g*255)}, {int(b*255)})") return colorList def plotCompileTime(log_file, minVal): colors = [] # read the log file and extract the data from it # st: start-time (ms) # et: end-time (ms) # ts: timestamp # file: path to file # hash: command hash df = pd.read_csv(log_file, delimiter='\t', header=None, names=['st', 'et', 'ts', 'file', 'hash']) df = df.iloc[1:] # include file name only df['file'] = df['file'].apply(os.path.basename) # convert to seconds df['st'] = df['st'].astype(int) / 1000 df['et'] = df['et'].astype(int) / 1000 # calculate compilation duration of the file df['dur'] = df['et'].astype(int) - df['st'].astype(int) if args.include_linking == 0: # drop the last two rows which are related to linking df = df.drop(df.index[-2:]) # if minVal specified remove the rows from the df where df['dur'] < minVal df = df[df['dur'] >= minVal] maxEt = int(df['et'].max()) df = df[::-1] # reverse df colors = generateRandomColors(df, colors) fig = go.Figure(go.Bar( y=df['file'], x=df['dur'], orientation='h', marker=dict(color=colors), base=df['st'], textposition='auto', customdata=df['dur'], hovertemplate='Time: %{customdata} seconds
' + 'File Name: %{y}
' )) # Customize the layout fig.update_layout( title="RCCL TOTAL COMPILE TIME LINE", xaxis_title='Duration (seconds)', yaxis_title='file name', bargap=0.1, plot_bgcolor='#36454F', # Set the plot background color to black paper_bgcolor='#36454F', # Set the paper background color to black font=dict( family="Arial", size=11, color="white" ), ) # add custom text annotation at the top right corner fig.update_layout( annotations=[ go.layout.Annotation( x=1, y=1, xref="paper", yref="paper", text="Total Time: "+ str(maxEt) + " seconds", showarrow=False, font=dict( size=18, color="white" ) ) ] ) # convert the plot to an html file fig.write_html("RCCL-compile-timeline.html", auto_open=False) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--min_val", nargs='?', default='5', type=int, help="Ignore any if it's less than the value provided") parser.add_argument("--include_linking", action='store_true', help="Include linking when plotting") parser.add_argument("--log_file_path", type=str, help="Location of the log file generated with --time-trace flag") args = parser.parse_args() if args.log_file_path is not None: log_file_path = args.log_file_path else: log_file_path = '../../build/release/time_trace.log' plotCompileTime(log_file_path, args.min_val)