public int Analyze() { if (m_analyzer == null) { return(0); } m_analyzer.Prepare(); if (m_analysisInput.ExecutionLogPath != null) { // NOTE: We call Prepare above so we don't need to prepare as a part of reading the execution log var reader = Task.Run(() => m_analyzer.ReadExecutionLog(prepare: false)); if (m_mode == AnalysisMode.LogCompare) { m_analyzerOther.Prepare(); var otherReader = Task.Run(() => m_analyzerOther.ReadExecutionLog()); otherReader.Wait(); } if (m_mode == AnalysisMode.FailedPipsDump && m_analyzerOther != null) { var start = DateTime.Now; Console.WriteLine($"[{start}] Reading compare to Log"); var otherReader = Task.Run(() => m_analyzerOther.ReadExecutionLog()); otherReader.Wait(); var duration = DateTime.Now - start; Console.WriteLine($"Done reading compare to log : duration = [{duration}]"); } reader.Wait(); if (m_mode == AnalysisMode.CacheMissLegacy) { // First pass just to read in PipCacheMissType data var otherReader = Task.Run(() => m_analyzerOther.ReadExecutionLog()); otherReader.Wait(); // Second pass to do fingerprint differences analysis otherReader = Task.Run(() => m_analyzerOther.ReadExecutionLog()); otherReader.Wait(); } } var exitCode = m_analyzer.Analyze(); if (m_mode == AnalysisMode.FailedPipsDump && m_analyzerOther != null) { var failedPipsDump = (FailedPipsDumpAnalyzer)m_analyzer; exitCode = failedPipsDump.Compare(m_analyzerOther); } if (m_mode == AnalysisMode.LogCompare) { m_analyzerOther.Analyze(); SummaryAnalyzer summary = (SummaryAnalyzer)m_analyzer; exitCode = summary.Compare((SummaryAnalyzer)m_analyzerOther); } if (m_mode == AnalysisMode.CacheMissLegacy) { exitCode = m_analyzerOther.Analyze(); } m_analyzer?.Dispose(); m_analyzerOther?.Dispose(); TelemetryShutdown(); return(exitCode); }