Index: llvm/trunk/tools/llvm-exegesis/lib/Analysis.cpp =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/Analysis.cpp +++ llvm/trunk/tools/llvm-exegesis/lib/Analysis.cpp @@ -195,22 +195,30 @@ OS << ""; writeClusterId(OS, CurrentClusterId); OS << ""; - for (const auto &Measurement : ClusterRepresentative.Measurements) { - OS << ""; - writeMeasurementValue(OS, Measurement.Value); - OS << ""; + for (const auto &Stats : MeasurementStats) { + OS << ""; + writeMeasurementValue(OS, Stats.avg()); + OS << "
["; + writeMeasurementValue(OS, Stats.min()); + OS << ";"; + writeMeasurementValue(OS, Stats.max()); + OS << "]"; } OS << ""; } @@ -321,7 +329,7 @@ writeEscaped(OS, SubtargetInfo_->getSchedModel() .getProcResource(WPR.ProcResourceIdx) ->Name); - OS << ": " << WPR.Cycles << ""; + OS << ": " << WPR.Cycles << ""; } OS << ""; OS << ""; @@ -378,6 +386,12 @@ span.mono { font-family: monospace; } +span.minmax { + color: #888; +} +td.measurement { + text-align: center; +} )"; Index: llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.h =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.h +++ llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.h @@ -18,6 +18,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/YAMLTraits.h" +#include #include #include @@ -61,6 +62,29 @@ void writeYamlOrDie(const llvm::StringRef Filename); }; +//------------------------------------------------------------------------------ +// Utilities to work with Benchmark measures. + +// A class that measures stats over benchmark measures. +class BenchmarkMeasureStats { +public: + void push(const BenchmarkMeasure &BM); + + double avg() const { + assert(NumValues); + return SumValues / NumValues; + } + double min() const { return MinValue; } + double max() const { return MaxValue; } + +private: + std::string Key; + double SumValues = 0.0; + int NumValues = 0; + double MaxValue = std::numeric_limits::min(); + double MinValue = std::numeric_limits::max(); +}; + } // namespace exegesis #endif // LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRESULT_H Index: llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.cpp =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ llvm/trunk/tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -104,4 +104,14 @@ } } +void BenchmarkMeasureStats::push(const BenchmarkMeasure &BM) { + if (Key.empty()) + Key = BM.Key; + assert(Key == BM.Key); + ++NumValues; + SumValues += BM.Value; + MaxValue = std::max(MaxValue, BM.Value); + MinValue = std::min(MinValue, BM.Value); +} + } // namespace exegesis Index: llvm/trunk/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp =================================================================== --- llvm/trunk/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp +++ llvm/trunk/unittests/tools/llvm-exegesis/BenchmarkResultTest.cpp @@ -77,5 +77,15 @@ } } +TEST(BenchmarkResultTest, BenchmarkMeasureStats) { + BenchmarkMeasureStats Stats; + Stats.push(BenchmarkMeasure{"a", 0.5, "debug a"}); + Stats.push(BenchmarkMeasure{"a", 1.5, "debug a"}); + Stats.push(BenchmarkMeasure{"a", -1.0, "debug a"}); + Stats.push(BenchmarkMeasure{"a", 0.0, "debug a"}); + EXPECT_EQ(Stats.min(), -1.0); + EXPECT_EQ(Stats.max(), 1.5); + EXPECT_EQ(Stats.avg(), 0.25); // (0.5+1.5-1.0+0.0) / 4 +} } // namespace } // namespace exegesis