Using histograms for timing statistics.
Histogram class and test cases added.
Modified make file to add test cases and class file.
Added a guard to avoid race condition in Cumulative logger that
was possible race between Addlogger and Dump() functions.
Change-Id: I060a0d65648c7120963856624e7008c0aa681eb7
diff --git a/src/base/histogram_test.cc b/src/base/histogram_test.cc
new file mode 100644
index 0000000..2adb41b
--- /dev/null
+++ b/src/base/histogram_test.cc
@@ -0,0 +1,252 @@
+#include "gtest/gtest.h"
+#include "histogram-inl.h"
+#include <sstream>
+using namespace art;
+
+//Simple usage:
+// Histogram *hist = new Histogram("SimplePercentiles");
+// Percentile PerValue
+// hist->AddValue(121);
+// hist->AddValue(132);
+// hist->AddValue(140);
+// hist->AddValue(145);
+// hist->AddValue(155);
+// hist->CreateHistogram();
+// PerValue = hist->PercentileVal(0.50); finds the 50th percentile(median).
+
+TEST(Histtest, MeanTest) {
+
+ Histogram<uint64_t> *hist = new Histogram<uint64_t>("MeanTest");
+ double mean;
+ for (size_t Idx = 0; Idx < 90; Idx++) {
+ hist->AddValue(static_cast<uint64_t>(50));
+ }
+ mean = hist->Mean();
+ EXPECT_EQ(mean, 50);
+ hist->Reset();
+ hist->AddValue(9);
+ hist->AddValue(17);
+ hist->AddValue(28);
+ hist->AddValue(28);
+ mean = hist->Mean();
+ EXPECT_EQ(mean, 20.5);
+}
+;
+
+TEST(Histtest, VarianceTest) {
+
+ Histogram<uint64_t> *hist = new Histogram<uint64_t>("VarianceTest");
+ double variance;
+ hist->AddValue(9);
+ hist->AddValue(17);
+ hist->AddValue(28);
+ hist->AddValue(28);
+ hist->CreateHistogram();
+ variance = hist->Variance();
+ EXPECT_EQ(variance, 64.25);
+ delete hist;
+}
+;
+
+TEST(Histtest, Percentile) {
+
+ Histogram<uint64_t> *hist = new Histogram<uint64_t>("Percentile");
+ double PerValue;
+
+ hist->AddValue(20);
+ hist->AddValue(31);
+ hist->AddValue(42);
+ hist->AddValue(50);
+ hist->AddValue(60);
+ hist->AddValue(70);
+ hist->AddValue(98);
+ hist->AddValue(110);
+ hist->AddValue(121);
+ hist->AddValue(132);
+ hist->AddValue(140);
+ hist->AddValue(145);
+ hist->AddValue(155);
+
+ hist->CreateHistogram();
+ PerValue = hist->Percentile(0.50);
+ EXPECT_GE(PerValue, 70);
+ EXPECT_LE(PerValue, 110);
+
+ delete hist;
+}
+;
+
+TEST(Histtest, UpdateRange) {
+
+ Histogram<uint64_t> *hist = new Histogram<uint64_t>("UpdateRange");
+ double PerValue;
+
+ hist->AddValue(15);
+ hist->AddValue(17);
+ hist->AddValue(35);
+ hist->AddValue(50);
+ hist->AddValue(68);
+ hist->AddValue(75);
+ hist->AddValue(93);
+ hist->AddValue(110);
+ hist->AddValue(121);
+ hist->AddValue(132);
+ hist->AddValue(140); //Median value
+ hist->AddValue(145);
+ hist->AddValue(155);
+ hist->AddValue(163);
+ hist->AddValue(168);
+ hist->AddValue(175);
+ hist->AddValue(182);
+ hist->AddValue(193);
+ hist->AddValue(200);
+ hist->AddValue(205);
+ hist->AddValue(212);
+ hist->CreateHistogram();
+ PerValue = hist->Percentile(0.50);
+
+ std::string text;
+ std::stringstream stream;
+ std::string expected =
+ "UpdateRange:\t0.99% C.I. 15.262us-214.475us Avg: 126.380us Max: 212us\n";
+ hist->PrintConfidenceIntervals(stream, 0.99);
+
+ EXPECT_EQ(expected, stream.str());
+ EXPECT_GE(PerValue, 132);
+ EXPECT_LE(PerValue, 145);
+
+ delete hist;
+}
+;
+
+TEST(Histtest, Reset) {
+
+ Histogram<uint64_t> *hist = new Histogram<uint64_t>("Reset");
+ double PerValue;
+ hist->AddValue(0);
+ hist->AddValue(189);
+ hist->AddValue(389);
+ hist->Reset();
+ hist->AddValue(15);
+ hist->AddValue(17);
+ hist->AddValue(35);
+ hist->AddValue(50);
+ hist->AddValue(68);
+ hist->AddValue(75);
+ hist->AddValue(93);
+ hist->AddValue(110);
+ hist->AddValue(121);
+ hist->AddValue(132);
+ hist->AddValue(140); //Median value
+ hist->AddValue(145);
+ hist->AddValue(155);
+ hist->AddValue(163);
+ hist->AddValue(168);
+ hist->AddValue(175);
+ hist->AddValue(182);
+ hist->AddValue(193);
+ hist->AddValue(200);
+ hist->AddValue(205);
+ hist->AddValue(212);
+ hist->CreateHistogram();
+ PerValue = hist->Percentile(0.50);
+
+ std::string text;
+ std::stringstream stream;
+ std::string expected =
+ "Reset:\t0.99% C.I. 15.262us-214.475us Avg: 126.380us Max: 212us\n";
+ hist->PrintConfidenceIntervals(stream, 0.99);
+
+ EXPECT_EQ(expected, stream.str());
+ EXPECT_GE(PerValue, 132);
+ EXPECT_LE(PerValue, 145);
+
+ delete hist;
+}
+;
+
+TEST(Histtest, MultipleCreateHist) {
+
+ Histogram<uint64_t> *hist = new Histogram<uint64_t>("MultipleCreateHist");
+ double PerValue;
+ hist->AddValue(15);
+ hist->AddValue(17);
+ hist->AddValue(35);
+ hist->AddValue(50);
+ hist->AddValue(68);
+ hist->AddValue(75);
+ hist->AddValue(93);
+ hist->CreateHistogram();
+ hist->AddValue(110);
+ hist->AddValue(121);
+ hist->AddValue(132);
+ hist->AddValue(140); //Median value
+ hist->AddValue(145);
+ hist->AddValue(155);
+ hist->AddValue(163);
+ hist->AddValue(168);
+ hist->CreateHistogram();
+ hist->AddValue(175);
+ hist->AddValue(182);
+ hist->AddValue(193);
+ hist->AddValue(200);
+ hist->AddValue(205);
+ hist->AddValue(212);
+ hist->CreateHistogram();
+ PerValue = hist->Percentile(0.50);
+
+ std::string text;
+ std::stringstream stream;
+ std::string expected =
+ "MultipleCreateHist:\t0.99% C.I. 15.262us-214.475us Avg: 126.380us Max: 212us\n";
+ hist->PrintConfidenceIntervals(stream, 0.99);
+
+ EXPECT_EQ(expected, stream.str());
+ EXPECT_GE(PerValue, 132);
+ EXPECT_LE(PerValue, 145);
+
+ delete hist;
+}
+;
+
+TEST(Histtest, SingleValue) {
+
+ Histogram<uint64_t> *hist = new Histogram<uint64_t>("SingleValue");
+ double PerValue_10;
+ double PerValue_90;
+
+ hist->AddValue(1);
+ hist->CreateHistogram();
+ PerValue_10 = hist->Percentile(0.1);
+ PerValue_90 = hist->Percentile(0.9);
+
+ EXPECT_GT(PerValue_10, 0);
+ EXPECT_LT(PerValue_90, 5);
+
+ delete hist;
+}
+;
+
+TEST(Histtest, SpikyValues) {
+
+ Histogram<uint64_t> *hist = new Histogram<uint64_t>("SpikyValues");
+ double PerValue_005;
+ double PerValue_995;
+
+ for (size_t Idx = 0; Idx < 300; Idx++) {
+ hist->AddValue(rand() % 200);
+ }
+
+ hist->AddValue(10000);
+ hist->CreateHistogram();
+ PerValue_005 = hist->Percentile(0.005);
+ PerValue_995 = hist->Percentile(0.995);
+
+ EXPECT_EQ(1.075, PerValue_005);
+ EXPECT_EQ(199747, static_cast<int>(PerValue_995 * 1000));
+ delete hist;
+}
+;
+
+
+