From 59942f8b46694cf3d76c3ceb2dfb0d44042465c5 Mon Sep 17 00:00:00 2001 From: Mihai Sebea Date: Fri, 28 Aug 2020 21:38:14 +0200 Subject: [PATCH 1/2] ! added option to specify the format to display timings ! defaults to nanoseconds ! supports miliseconds and seconds --- .../FileCompilationsExporter.cpp | 45 ++++++++++++++----- .../FileCompilationsExporter.h | 1 + .../FileInclusionTimesExporter.cpp | 39 ++++++++++++---- .../FileInclusionTimesExporter.h | 1 + .../FunctionCompilationsExporter.cpp | 37 ++++++++++++--- .../FunctionCompilationsExporter.h | 1 + .../TemplateInstantiationsExporter.cpp | 16 +++++-- .../FileCompilationsAnalyzer.cpp | 11 ++++- src/BuildAnalyzer/BuildAnalyzer.cpp | 41 ++++++++++++++--- src/BuildAnalyzer/BuildAnalyzer.h | 14 ++++-- src/ConsoleMain/Main.cpp | 23 ++++++++-- 11 files changed, 186 insertions(+), 43 deletions(-) diff --git a/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.cpp b/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.cpp index 30b8128..d2c01e5 100644 --- a/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.cpp +++ b/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.cpp @@ -2,6 +2,7 @@ #include #include +#include FileCompilationsExporter::FileCompilationsExporter(const TFileCompilationDataPerFile& data) : m_data(data) @@ -12,6 +13,7 @@ FileCompilationsExporter::~FileCompilationsExporter() { } +template bool FileCompilationsExporter::ExportTo(const std::string& path) const { std::ofstream out(path); @@ -29,7 +31,7 @@ bool FileCompilationsExporter::ExportTo(const std::string& path) const // sort it (slowest compilations first) std::sort(dataPerFile.begin(), dataPerFile.end(), [](const TFileCompilationDataPerFile::value_type* lhs, - const TFileCompilationDataPerFile::value_type* rhs) + const TFileCompilationDataPerFile::value_type* rhs) { std::chrono::nanoseconds lhsTotalDuration = lhs->second.BackEnd.Stop - lhs->second.FrontEnd.Start; std::chrono::nanoseconds rhsTotalDuration = rhs->second.BackEnd.Stop - rhs->second.FrontEnd.Start; @@ -37,23 +39,46 @@ bool FileCompilationsExporter::ExportTo(const std::string& path) const return lhsTotalDuration > rhsTotalDuration; }); + std::string timeType = "nanoseconds"; + + if (std::is_same::value) + { + timeType = "seconds"; + } + else if (std::is_same::value) + { + timeType = "miliseconds"; + } + // write data header to stream out << "File path" << ";" - << "Compilation time (nanoseconds)" << ";" - << "Front-end time (nanoseconds)" << ";" - << "Back-end time (nanoseconds)" << std::endl; + << "Compilation time (" << timeType << ")" << ";" + << "Front-end time (" << timeType << ")" << ";" + << "Back-end time (" << timeType << ")" << std::endl; // write data to stream for (auto&& data : dataPerFile) { - std::chrono::nanoseconds totalDuration = data->second.BackEnd.Stop - data->second.FrontEnd.Start; - + const FileCompilationData& perFile = data->second; + T compileTime = std::chrono::duration_cast(perFile.BackEnd.Stop - perFile.FrontEnd.Start); + T frontEndTime = std::chrono::duration_cast(perFile.FrontEnd.Stop - perFile.FrontEnd.Start); + T backEndTime = std::chrono::duration_cast(perFile.BackEnd.Stop - perFile.BackEnd.Start); + out << data->first << ";" - << (data->second.BackEnd.Stop - data->second.FrontEnd.Start).count() << ";" - << (data->second.FrontEnd.Stop - data->second.FrontEnd.Start).count() << ";" - << (data->second.BackEnd.Stop - data->second.BackEnd.Start).count() << std::endl; + << compileTime.count() << ";" + << frontEndTime.count() << ";" + << backEndTime.count() << std::endl; } out.close(); return true; -} \ No newline at end of file +} + +template +bool FileCompilationsExporter::ExportTo(const std::string& path) const; + +template +bool FileCompilationsExporter::ExportTo(const std::string& path) const; + +template +bool FileCompilationsExporter::ExportTo(const std::string& path) const; diff --git a/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.h b/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.h index 39c000a..56880dd 100644 --- a/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.h +++ b/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.h @@ -11,6 +11,7 @@ class FileCompilationsExporter ~FileCompilationsExporter(); // exports to CSV + template bool ExportTo(const std::string& path) const; private: diff --git a/src/AnalysisExporter/FileInclusions/FileInclusionTimesExporter.cpp b/src/AnalysisExporter/FileInclusions/FileInclusionTimesExporter.cpp index fd1cea6..c419398 100644 --- a/src/AnalysisExporter/FileInclusions/FileInclusionTimesExporter.cpp +++ b/src/AnalysisExporter/FileInclusions/FileInclusionTimesExporter.cpp @@ -25,6 +25,7 @@ FileInclusionTimesExporter::~FileInclusionTimesExporter() { } +template bool FileInclusionTimesExporter::ExportTo(const std::string& path) const { std::ofstream out(path); @@ -80,25 +81,47 @@ bool FileInclusionTimesExporter::ExportTo(const std::string& path) const return lhs.AverageInclusionTime > rhs.AverageInclusionTime; }); + + std::string timeType = "nanoseconds"; + + if (std::is_same::value) + { + timeType = "seconds"; + } + else if (std::is_same::value) + { + timeType = "miliseconds"; + } + // write data header to stream out << "File path" << ";" - << "Average elapsed time (nanoseconds)" << ";" - << "Minimum elapsed time (nanoseconds)" << ";" - << "Maximum elapsed time (nanoseconds)" << ";" - << "Standard deviation (nanoseconds)" << ";" + << "Average elapsed time (" << timeType << ")" << ";" + << "Minimum elapsed time (" << timeType << ")" << ";" + << "Maximum elapsed time (" << timeType << ")" << ";" + << "Standard deviation (" << timeType << ")" << ";" << "Occurrences" << std::endl; // write data to stream for (auto&& data : dataPerFile) { out << (*data.FilePath) << ";" - << data.AverageInclusionTime.count() << ";" - << data.MinimumInclusionTime.count() << ";" - << data.MaximumInclusionTime.count() << ";" - << data.StandardDeviation.count() << ";" + << std::chrono::duration_cast(data.AverageInclusionTime).count() << ";" + << std::chrono::duration_cast(data.MinimumInclusionTime).count() << ";" + << std::chrono::duration_cast(data.MaximumInclusionTime).count() << ";" + << std::chrono::duration_cast(data.StandardDeviation).count() << ";" << data.Occurrences << std::endl; } out.close(); return true; } + +template +bool FileInclusionTimesExporter::ExportTo(const std::string& path) const; + +template +bool FileInclusionTimesExporter::ExportTo(const std::string& path) const; + +template +bool FileInclusionTimesExporter::ExportTo(const std::string& path) const; + diff --git a/src/AnalysisExporter/FileInclusions/FileInclusionTimesExporter.h b/src/AnalysisExporter/FileInclusions/FileInclusionTimesExporter.h index 6210203..425ea60 100644 --- a/src/AnalysisExporter/FileInclusions/FileInclusionTimesExporter.h +++ b/src/AnalysisExporter/FileInclusions/FileInclusionTimesExporter.h @@ -12,6 +12,7 @@ class FileInclusionTimesExporter ~FileInclusionTimesExporter(); // exports to CSV format + template bool ExportTo(const std::string& path) const; private: diff --git a/src/AnalysisExporter/FunctionCompilations/FunctionCompilationsExporter.cpp b/src/AnalysisExporter/FunctionCompilations/FunctionCompilationsExporter.cpp index 5ce51c1..f4980fd 100644 --- a/src/AnalysisExporter/FunctionCompilations/FunctionCompilationsExporter.cpp +++ b/src/AnalysisExporter/FunctionCompilations/FunctionCompilationsExporter.cpp @@ -27,6 +27,7 @@ FunctionCompilationsExporter::~FunctionCompilationsExporter() { } +template bool FunctionCompilationsExporter::ExportTo(const std::string& path) const { std::ofstream out = std::ofstream(path); @@ -83,12 +84,24 @@ bool FunctionCompilationsExporter::ExportTo(const std::string& path) const return lhs.AverageCompilationTime > rhs.AverageCompilationTime; }); + + std::string timeType = "nanoseconds"; + + if (std::is_same::value) + { + timeType = "seconds"; + } + else if (std::is_same::value) + { + timeType = "miliseconds"; + } + // write data header to stream out << "Undecorated function name" << ";" - << "Average elapsed time (nanoseconds)" << ";" - << "Minimum elapsed time (nanoseconds)" << ";" - << "Maximum elapsed time (nanoseconds)" << ";" - << "Standard deviation (nanoseconds)" << ";" + << "Average elapsed time (" << timeType << ")" << ";" + << "Minimum elapsed time (" << timeType << ")" << ";" + << "Maximum elapsed time (" << timeType << ")" << ";" + << "Standard deviation (" << timeType << ")" << ";" << "Occurrences" << std::endl; // write data to file @@ -96,9 +109,9 @@ bool FunctionCompilationsExporter::ExportTo(const std::string& path) const { // dump to stream out << Utilities::CppBuildInsightsDataConversion::UndecorateFunction(*data.FunctionName) << ";" - << data.AverageCompilationTime.count() << ";" - << data.MinimumCompilationTime.count() << ";" - << data.MaximumCompilationTime.count() << ";" + << std::chrono::duration_cast(data.AverageCompilationTime).count() << ";" + << std::chrono::duration_cast(data.MinimumCompilationTime).count() << ";" + << std::chrono::duration_cast(data.MaximumCompilationTime).count() << ";" << data.StandardDeviation.count() << ";" << data.Occurrences << std::endl; } @@ -106,3 +119,13 @@ bool FunctionCompilationsExporter::ExportTo(const std::string& path) const out.close(); return true; } + +template +bool FunctionCompilationsExporter::ExportTo(const std::string& path) const; + +template +bool FunctionCompilationsExporter::ExportTo(const std::string& path) const; + +template +bool FunctionCompilationsExporter::ExportTo(const std::string& path) const; + diff --git a/src/AnalysisExporter/FunctionCompilations/FunctionCompilationsExporter.h b/src/AnalysisExporter/FunctionCompilations/FunctionCompilationsExporter.h index 7fa3610..55eb98b 100644 --- a/src/AnalysisExporter/FunctionCompilations/FunctionCompilationsExporter.h +++ b/src/AnalysisExporter/FunctionCompilations/FunctionCompilationsExporter.h @@ -12,6 +12,7 @@ class FunctionCompilationsExporter ~FunctionCompilationsExporter(); // exports to CSV format + template bool ExportTo(const std::string& path) const; private: diff --git a/src/AnalysisExporter/TemplateInstantiations/TemplateInstantiationsExporter.cpp b/src/AnalysisExporter/TemplateInstantiations/TemplateInstantiationsExporter.cpp index 021f100..698e300 100644 --- a/src/AnalysisExporter/TemplateInstantiations/TemplateInstantiationsExporter.cpp +++ b/src/AnalysisExporter/TemplateInstantiations/TemplateInstantiationsExporter.cpp @@ -39,15 +39,25 @@ bool TemplateInstantiationsExporter::ExportTo(const std::string& path) const // aggregate data typedef std::unordered_map TAggregatedData; TAggregatedData aggregatedData; + + std::string symbolName = "Unknown"; + for (auto&& pair : m_templateInstantiations) { const std::chrono::nanoseconds& timeElapsed = pair.second.Duration; - + auto itSpecializationTemplateName = m_symbolNames.find(pair.second.Specialization); - assert(itSpecializationTemplateName != m_symbolNames.end()); + if (itSpecializationTemplateName != m_symbolNames.end()) + { + symbolName = itSpecializationTemplateName->second; + } + else + { + symbolName = "Unknown"; + } // from the docs: "Comparing types between different compiler front-end passes requires using symbol names" - auto result = aggregatedData.try_emplace(itSpecializationTemplateName->second, DataPerTemplate()); + auto result = aggregatedData.try_emplace(symbolName, DataPerTemplate()); auto& data = result.first->second; // first occurrence? diff --git a/src/BuildAnalyzer/Analyzers/FileCompilations/FileCompilationsAnalyzer.cpp b/src/BuildAnalyzer/Analyzers/FileCompilations/FileCompilationsAnalyzer.cpp index dc65585..c7d4dd5 100644 --- a/src/BuildAnalyzer/Analyzers/FileCompilations/FileCompilationsAnalyzer.cpp +++ b/src/BuildAnalyzer/Analyzers/FileCompilations/FileCompilationsAnalyzer.cpp @@ -48,6 +48,13 @@ const wchar_t* FileCompilationsAnalyzer::GetFilePath(const CppBI::Activities::Co return compilerPass.InputSourcePath(); } - assert(compilerPass.OutputObjectPath() != nullptr); - return compilerPass.OutputObjectPath(); + // ms turns out VS2019 OutputObjectPath can be null too + // fallback on something + if (compilerPass.OutputObjectPath() != nullptr) + { + return compilerPass.OutputObjectPath(); + } + + return L"Unknown"; + } diff --git a/src/BuildAnalyzer/BuildAnalyzer.cpp b/src/BuildAnalyzer/BuildAnalyzer.cpp index 49480bb..e659c09 100644 --- a/src/BuildAnalyzer/BuildAnalyzer.cpp +++ b/src/BuildAnalyzer/BuildAnalyzer.cpp @@ -83,20 +83,40 @@ std::vector BuildAnalyzer::BuildAnalyzerList(const AnalysisOp return analyzers; } -bool BuildAnalyzer::ExportFunctionCompilationsData(const std::string& path) const +bool BuildAnalyzer::ExportFunctionCompilationsData(const std::string& path, TimeDisplayEnum timeDisplay) const { assert(m_analysisPerformed); FunctionCompilationsExporter exporter(m_functionCompilations.GetData()); - return exporter.ExportTo(path); + + if (timeDisplay == TimeDisplayEnum::Sec) + { + return exporter.ExportTo(path); + } + else if (timeDisplay == TimeDisplayEnum::Mili) + { + return exporter.ExportTo(path); + } + + return exporter.ExportTo(path); } -bool BuildAnalyzer::ExportFileInclusionTimesData(const std::string& path) const +bool BuildAnalyzer::ExportFileInclusionTimesData(const std::string& path, TimeDisplayEnum timeDisplay) const { assert(m_analysisPerformed); FileInclusionTimesExporter exporter(m_fileInclusions.GetTimeData()); - return exporter.ExportTo(path); + + if (timeDisplay == TimeDisplayEnum::Sec) + { + return exporter.ExportTo(path); + } + else if (timeDisplay == TimeDisplayEnum::Mili) + { + return exporter.ExportTo(path); + } + + return exporter.ExportTo(path); } bool BuildAnalyzer::ExportFileInclusionGraph(const std::string& path) const @@ -107,12 +127,21 @@ bool BuildAnalyzer::ExportFileInclusionGraph(const std::string& path) const return exporter.ExportTo(path); } -bool BuildAnalyzer::ExportFileCompilationsData(const std::string& path) const +bool BuildAnalyzer::ExportFileCompilationsData(const std::string& path, TimeDisplayEnum timeDisplay) const { assert(m_analysisPerformed); FileCompilationsExporter exporter(m_fileCompilations.GetData()); - return exporter.ExportTo(path); + if (timeDisplay == TimeDisplayEnum::Sec) + { + return exporter.ExportTo(path); + } + else if (timeDisplay == TimeDisplayEnum::Mili) + { + return exporter.ExportTo(path); + } + + return exporter.ExportTo(path); } bool BuildAnalyzer::ExportBuildTimeline(const std::string& path) const diff --git a/src/BuildAnalyzer/BuildAnalyzer.h b/src/BuildAnalyzer/BuildAnalyzer.h index 17b2646..909f62b 100644 --- a/src/BuildAnalyzer/BuildAnalyzer.h +++ b/src/BuildAnalyzer/BuildAnalyzer.h @@ -17,6 +17,13 @@ namespace Microsoft { namespace Cpp { namespace BuildInsights { class BuildAnalyzer { public: + enum class TimeDisplayEnum + { + Nano, + Mili, + Sec, + }; + struct AnalysisOptions { std::chrono::milliseconds TimelineIgnoreFunctionsUnder = std::chrono::milliseconds(0); @@ -27,6 +34,7 @@ class BuildAnalyzer bool FileCompilations = true; bool BuildTimeline = true; bool TemplateInstantiations = true; + TimeDisplayEnum TimeDisplay = TimeDisplayEnum::Nano; }; public: @@ -36,10 +44,10 @@ class BuildAnalyzer inline bool IsAnalysisPerformed() const { return m_analysisPerformed; } bool Analyze(); - bool ExportFunctionCompilationsData(const std::string& path) const; - bool ExportFileInclusionTimesData(const std::string& path) const; + bool ExportFunctionCompilationsData(const std::string& path, TimeDisplayEnum timeDisplay) const; + bool ExportFileInclusionTimesData(const std::string& path, TimeDisplayEnum timeDisplay) const; bool ExportFileInclusionGraph(const std::string& path) const; - bool ExportFileCompilationsData(const std::string& path) const; + bool ExportFileCompilationsData(const std::string& path, TimeDisplayEnum) const; bool ExportBuildTimeline(const std::string& path) const; bool ExportTemplateInstantiationsData(const std::string& path) const; diff --git a/src/ConsoleMain/Main.cpp b/src/ConsoleMain/Main.cpp index 0ceea4a..99ddb05 100644 --- a/src/ConsoleMain/Main.cpp +++ b/src/ConsoleMain/Main.cpp @@ -15,6 +15,7 @@ namespace const std::string s_defaultOutputPathFileCompilations = "FileCompilations.csv"; const std::string s_defaultOutputPathBuildTimeline = "BuildTimeline.json"; const std::string s_defaultOutputPathTemplateInstantiations = "TemplateInstantiations.csv"; + const std::string s_defaultTimingDisplay = "ns"; const unsigned int s_defaultTimelineIgnoreFunctionsUnderMs = 10; const unsigned int s_defaultTimelineIgnoreTemplatesUnderMs = 10; @@ -42,6 +43,7 @@ int main(int argc, char** argv) std::string outputPathFileCompilations = s_defaultOutputPathFileCompilations; std::string outputPathBuildTimeline = s_defaultOutputPathBuildTimeline; std::string outputPathTemplateInstantiations = s_defaultOutputPathTemplateInstantiations; + std::string timingDisplay = s_defaultTimingDisplay; unsigned int timelineIgnoreFunctionsUnderMs = s_defaultTimelineIgnoreFunctionsUnderMs; unsigned int timelineIgnoreTemplatesUnderMs = s_defaultTimelineIgnoreTemplatesUnderMs; @@ -68,7 +70,10 @@ int main(int argc, char** argv) ("out_file_inclusion_graph", "Path to output file inclusion graph", cxxopts::value(outputPathFileInclusionGraph)) ("out_file_compilations", "Path to output file compilations data", cxxopts::value(outputPathFileCompilations)) ("out_build_timeline", "Path to output build timeline", cxxopts::value(outputPathBuildTimeline)) - ("out_template_instantiations", "Path to output template instantiations data", cxxopts::value(outputPathTemplateInstantiations)); + ("out_template_instantiations", "Path to output template instantiations data", cxxopts::value(outputPathTemplateInstantiations)) + //timing display + ("timing", "defaults to ns, can use ms(miliseconds) or s(seconds)", cxxopts::value(timingDisplay)) + ; // parse command line try @@ -108,6 +113,7 @@ int main(int argc, char** argv) exit(-1); } + // what to build BuildAnalyzer::AnalysisOptions analysisOptions; analysisOptions.FunctionCompilations = analyzeAll || analyzeFunctionCompilations; @@ -119,6 +125,15 @@ int main(int argc, char** argv) analysisOptions.TimelineIgnoreFunctionsUnder = std::chrono::milliseconds(timelineIgnoreFunctionsUnderMs); analysisOptions.TimelineIgnoreTemplatesUnder = std::chrono::milliseconds(timelineIgnoreTemplatesUnderMs); + if (timingDisplay == "ms") + { + analysisOptions.TimeDisplay = BuildAnalyzer::TimeDisplayEnum::Mili; + } + else if (timingDisplay == "s") + { + analysisOptions.TimeDisplay = BuildAnalyzer::TimeDisplayEnum::Sec; + } + // analyze trace std::cout << "Analyzing..." << std::endl; BuildAnalyzer analyzer(inputPathTraceFile, analysisOptions); @@ -133,7 +148,7 @@ int main(int argc, char** argv) if (!outputPathFunctionCompilations.empty()) { - analyzer.ExportFunctionCompilationsData(outputPathFunctionCompilations); + analyzer.ExportFunctionCompilationsData(outputPathFunctionCompilations, analysisOptions.TimeDisplay); } else { @@ -147,7 +162,7 @@ int main(int argc, char** argv) if (!outputPathFileInclusionTimes.empty()) { - analyzer.ExportFileInclusionTimesData(outputPathFileInclusionTimes); + analyzer.ExportFileInclusionTimesData(outputPathFileInclusionTimes, analysisOptions.TimeDisplay); } else { @@ -175,7 +190,7 @@ int main(int argc, char** argv) if (!outputPathFileCompilations.empty()) { - analyzer.ExportFileCompilationsData(outputPathFileCompilations); + analyzer.ExportFileCompilationsData(outputPathFileCompilations, analysisOptions.TimeDisplay); } else { From 04b16f27cfd479a4254d959d1ff9f918298da436 Mon Sep 17 00:00:00 2001 From: Mihai Sebea Date: Tue, 1 Sep 2020 23:44:12 +0200 Subject: [PATCH 2/2] ! fixed issues according to code review ! fixed spelling --- .../FileCompilations/FileCompilationsExporter.cpp | 2 +- .../TemplateInstantiationsExporter.cpp | 13 +++---------- .../FileCompilations/FileCompilationsAnalyzer.cpp | 10 ++-------- src/BuildAnalyzer/BuildAnalyzer.cpp | 12 ++++++------ src/BuildAnalyzer/BuildAnalyzer.h | 10 +++++----- src/ConsoleMain/Main.cpp | 10 +++++++--- 6 files changed, 24 insertions(+), 33 deletions(-) diff --git a/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.cpp b/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.cpp index d2c01e5..dd8ff38 100644 --- a/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.cpp +++ b/src/AnalysisExporter/FileCompilations/FileCompilationsExporter.cpp @@ -31,7 +31,7 @@ bool FileCompilationsExporter::ExportTo(const std::string& path) const // sort it (slowest compilations first) std::sort(dataPerFile.begin(), dataPerFile.end(), [](const TFileCompilationDataPerFile::value_type* lhs, - const TFileCompilationDataPerFile::value_type* rhs) + const TFileCompilationDataPerFile::value_type* rhs) { std::chrono::nanoseconds lhsTotalDuration = lhs->second.BackEnd.Stop - lhs->second.FrontEnd.Start; std::chrono::nanoseconds rhsTotalDuration = rhs->second.BackEnd.Stop - rhs->second.FrontEnd.Start; diff --git a/src/AnalysisExporter/TemplateInstantiations/TemplateInstantiationsExporter.cpp b/src/AnalysisExporter/TemplateInstantiations/TemplateInstantiationsExporter.cpp index 698e300..42e152f 100644 --- a/src/AnalysisExporter/TemplateInstantiations/TemplateInstantiationsExporter.cpp +++ b/src/AnalysisExporter/TemplateInstantiations/TemplateInstantiationsExporter.cpp @@ -47,17 +47,10 @@ bool TemplateInstantiationsExporter::ExportTo(const std::string& path) const const std::chrono::nanoseconds& timeElapsed = pair.second.Duration; auto itSpecializationTemplateName = m_symbolNames.find(pair.second.Specialization); - if (itSpecializationTemplateName != m_symbolNames.end()) - { - symbolName = itSpecializationTemplateName->second; - } - else - { - symbolName = "Unknown"; - } - + assert(itSpecializationTemplateName != m_symbolNames.end()); + // from the docs: "Comparing types between different compiler front-end passes requires using symbol names" - auto result = aggregatedData.try_emplace(symbolName, DataPerTemplate()); + auto result = aggregatedData.try_emplace(itSpecializationTemplateName->second, DataPerTemplate()); auto& data = result.first->second; // first occurrence? diff --git a/src/BuildAnalyzer/Analyzers/FileCompilations/FileCompilationsAnalyzer.cpp b/src/BuildAnalyzer/Analyzers/FileCompilations/FileCompilationsAnalyzer.cpp index c7d4dd5..258272d 100644 --- a/src/BuildAnalyzer/Analyzers/FileCompilations/FileCompilationsAnalyzer.cpp +++ b/src/BuildAnalyzer/Analyzers/FileCompilations/FileCompilationsAnalyzer.cpp @@ -48,13 +48,7 @@ const wchar_t* FileCompilationsAnalyzer::GetFilePath(const CppBI::Activities::Co return compilerPass.InputSourcePath(); } - // ms turns out VS2019 OutputObjectPath can be null too - // fallback on something - if (compilerPass.OutputObjectPath() != nullptr) - { - return compilerPass.OutputObjectPath(); - } - - return L"Unknown"; + assert(compilerPass.OutputObjectPath() != nullptr); + return compilerPass.OutputObjectPath(); } diff --git a/src/BuildAnalyzer/BuildAnalyzer.cpp b/src/BuildAnalyzer/BuildAnalyzer.cpp index e659c09..fb5e003 100644 --- a/src/BuildAnalyzer/BuildAnalyzer.cpp +++ b/src/BuildAnalyzer/BuildAnalyzer.cpp @@ -89,11 +89,11 @@ bool BuildAnalyzer::ExportFunctionCompilationsData(const std::string& path, Time FunctionCompilationsExporter exporter(m_functionCompilations.GetData()); - if (timeDisplay == TimeDisplayEnum::Sec) + if (timeDisplay == TimeDisplayEnum::Seconds) { return exporter.ExportTo(path); } - else if (timeDisplay == TimeDisplayEnum::Mili) + else if (timeDisplay == TimeDisplayEnum::Milliseconds) { return exporter.ExportTo(path); } @@ -107,11 +107,11 @@ bool BuildAnalyzer::ExportFileInclusionTimesData(const std::string& path, TimeDi FileInclusionTimesExporter exporter(m_fileInclusions.GetTimeData()); - if (timeDisplay == TimeDisplayEnum::Sec) + if (timeDisplay == TimeDisplayEnum::Seconds) { return exporter.ExportTo(path); } - else if (timeDisplay == TimeDisplayEnum::Mili) + else if (timeDisplay == TimeDisplayEnum::Milliseconds) { return exporter.ExportTo(path); } @@ -132,11 +132,11 @@ bool BuildAnalyzer::ExportFileCompilationsData(const std::string& path, TimeDisp assert(m_analysisPerformed); FileCompilationsExporter exporter(m_fileCompilations.GetData()); - if (timeDisplay == TimeDisplayEnum::Sec) + if (timeDisplay == TimeDisplayEnum::Seconds) { return exporter.ExportTo(path); } - else if (timeDisplay == TimeDisplayEnum::Mili) + else if (timeDisplay == TimeDisplayEnum::Milliseconds) { return exporter.ExportTo(path); } diff --git a/src/BuildAnalyzer/BuildAnalyzer.h b/src/BuildAnalyzer/BuildAnalyzer.h index 909f62b..5eba02d 100644 --- a/src/BuildAnalyzer/BuildAnalyzer.h +++ b/src/BuildAnalyzer/BuildAnalyzer.h @@ -19,9 +19,9 @@ class BuildAnalyzer public: enum class TimeDisplayEnum { - Nano, - Mili, - Sec, + Nanoseconds, + Milliseconds, + Seconds, }; struct AnalysisOptions @@ -34,7 +34,7 @@ class BuildAnalyzer bool FileCompilations = true; bool BuildTimeline = true; bool TemplateInstantiations = true; - TimeDisplayEnum TimeDisplay = TimeDisplayEnum::Nano; + TimeDisplayEnum TimeDisplay = TimeDisplayEnum::Nanoseconds; }; public: @@ -47,7 +47,7 @@ class BuildAnalyzer bool ExportFunctionCompilationsData(const std::string& path, TimeDisplayEnum timeDisplay) const; bool ExportFileInclusionTimesData(const std::string& path, TimeDisplayEnum timeDisplay) const; bool ExportFileInclusionGraph(const std::string& path) const; - bool ExportFileCompilationsData(const std::string& path, TimeDisplayEnum) const; + bool ExportFileCompilationsData(const std::string& path, TimeDisplayEnum timeDisplay) const; bool ExportBuildTimeline(const std::string& path) const; bool ExportTemplateInstantiationsData(const std::string& path) const; diff --git a/src/ConsoleMain/Main.cpp b/src/ConsoleMain/Main.cpp index 99ddb05..b56a093 100644 --- a/src/ConsoleMain/Main.cpp +++ b/src/ConsoleMain/Main.cpp @@ -72,7 +72,7 @@ int main(int argc, char** argv) ("out_build_timeline", "Path to output build timeline", cxxopts::value(outputPathBuildTimeline)) ("out_template_instantiations", "Path to output template instantiations data", cxxopts::value(outputPathTemplateInstantiations)) //timing display - ("timing", "defaults to ns, can use ms(miliseconds) or s(seconds)", cxxopts::value(timingDisplay)) + ("timing", "Defaults to ns(nanoseconds), can use ms(milliseconds) or s(seconds)", cxxopts::value(timingDisplay)) ; // parse command line @@ -127,11 +127,15 @@ int main(int argc, char** argv) if (timingDisplay == "ms") { - analysisOptions.TimeDisplay = BuildAnalyzer::TimeDisplayEnum::Mili; + analysisOptions.TimeDisplay = BuildAnalyzer::TimeDisplayEnum::Milliseconds; } else if (timingDisplay == "s") { - analysisOptions.TimeDisplay = BuildAnalyzer::TimeDisplayEnum::Sec; + analysisOptions.TimeDisplay = BuildAnalyzer::TimeDisplayEnum::Seconds; + } + else + { + std::cout << "Unrecognized time display value '"<< timingDisplay <<"'. Defaulting to nanoseconds." << std::endl; } // analyze trace