blob: 7aa5f9037fd4d2ef5494a628671c89e4a3378538 [file] [log] [blame]
Ian Rogers45357052013-04-18 20:49:43 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Ian Rogers700a4022014-05-19 16:49:03 -070017#include <memory>
18#include <sstream>
19
Sameer Abu Asala8439542013-02-14 16:06:42 -080020#include "gtest/gtest.h"
21#include "histogram-inl.h"
Ian Rogers45357052013-04-18 20:49:43 -070022
Brian Carlstrom3e3d5912013-07-18 00:19:45 -070023namespace art {
Sameer Abu Asala8439542013-02-14 16:06:42 -080024
Brian Carlstrom7934ac22013-07-26 10:54:15 -070025// Simple usage:
Mathieu Chartiere5426c92013-08-01 13:55:42 -070026// Histogram *hist(new Histogram("SimplePercentiles"));
Brian Carlstrom7934ac22013-07-26 10:54:15 -070027// Percentile PerValue
28// hist->AddValue(121);
29// hist->AddValue(132);
30// hist->AddValue(140);
31// hist->AddValue(145);
32// hist->AddValue(155);
33// hist->CreateHistogram();
34// PerValue = hist->PercentileVal(0.50); finds the 50th percentile(median).
Sameer Abu Asala8439542013-02-14 16:06:42 -080035
36TEST(Histtest, MeanTest) {
Ian Rogers700a4022014-05-19 16:49:03 -070037 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("MeanTest", 5));
Sameer Abu Asala8439542013-02-14 16:06:42 -080038
Sameer Abu Asala8439542013-02-14 16:06:42 -080039 double mean;
40 for (size_t Idx = 0; Idx < 90; Idx++) {
41 hist->AddValue(static_cast<uint64_t>(50));
42 }
43 mean = hist->Mean();
Ian Rogers647b1a82014-10-10 11:02:11 -070044 EXPECT_DOUBLE_EQ(mean, 50.0);
Sameer Abu Asala8439542013-02-14 16:06:42 -080045 hist->Reset();
46 hist->AddValue(9);
47 hist->AddValue(17);
48 hist->AddValue(28);
49 hist->AddValue(28);
50 mean = hist->Mean();
Ian Rogers647b1a82014-10-10 11:02:11 -070051 EXPECT_DOUBLE_EQ(20.5, mean);
Sameer Abu Asala8439542013-02-14 16:06:42 -080052}
Sameer Abu Asala8439542013-02-14 16:06:42 -080053
54TEST(Histtest, VarianceTest) {
Ian Rogers700a4022014-05-19 16:49:03 -070055 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("VarianceTest", 5));
Sameer Abu Asala8439542013-02-14 16:06:42 -080056
Sameer Abu Asala8439542013-02-14 16:06:42 -080057 double variance;
58 hist->AddValue(9);
59 hist->AddValue(17);
60 hist->AddValue(28);
61 hist->AddValue(28);
Sameer Abu Asala8439542013-02-14 16:06:42 -080062 variance = hist->Variance();
Ian Rogers647b1a82014-10-10 11:02:11 -070063 EXPECT_DOUBLE_EQ(64.25, variance);
Sameer Abu Asala8439542013-02-14 16:06:42 -080064}
Sameer Abu Asala8439542013-02-14 16:06:42 -080065
66TEST(Histtest, Percentile) {
Ian Rogers700a4022014-05-19 16:49:03 -070067 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("Percentile", 5));
Mathieu Chartiere5426c92013-08-01 13:55:42 -070068 Histogram<uint64_t>::CumulativeData data;
Sameer Abu Asala8439542013-02-14 16:06:42 -080069
Sameer Abu Asala8439542013-02-14 16:06:42 -080070 double PerValue;
71
72 hist->AddValue(20);
73 hist->AddValue(31);
74 hist->AddValue(42);
75 hist->AddValue(50);
76 hist->AddValue(60);
77 hist->AddValue(70);
Sameer Abu Asalc081e362013-02-20 16:45:38 -080078
Sameer Abu Asala8439542013-02-14 16:06:42 -080079 hist->AddValue(98);
Sameer Abu Asalc081e362013-02-20 16:45:38 -080080
Sameer Abu Asala8439542013-02-14 16:06:42 -080081 hist->AddValue(110);
82 hist->AddValue(121);
83 hist->AddValue(132);
84 hist->AddValue(140);
85 hist->AddValue(145);
86 hist->AddValue(155);
87
Ian Rogers500793f2013-11-14 17:49:12 -080088 hist->CreateHistogram(&data);
Mathieu Chartiere5426c92013-08-01 13:55:42 -070089 PerValue = hist->Percentile(0.50, data);
Sameer Abu Asal857a0782013-02-21 11:00:20 -080090 EXPECT_EQ(875, static_cast<int>(PerValue * 10));
Sameer Abu Asala8439542013-02-14 16:06:42 -080091}
Sameer Abu Asala8439542013-02-14 16:06:42 -080092
93TEST(Histtest, UpdateRange) {
Ian Rogers700a4022014-05-19 16:49:03 -070094 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("UpdateRange", 5));
Mathieu Chartiere5426c92013-08-01 13:55:42 -070095 Histogram<uint64_t>::CumulativeData data;
Sameer Abu Asala8439542013-02-14 16:06:42 -080096
Sameer Abu Asala8439542013-02-14 16:06:42 -080097 double PerValue;
98
99 hist->AddValue(15);
100 hist->AddValue(17);
101 hist->AddValue(35);
102 hist->AddValue(50);
103 hist->AddValue(68);
104 hist->AddValue(75);
105 hist->AddValue(93);
106 hist->AddValue(110);
107 hist->AddValue(121);
108 hist->AddValue(132);
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700109 hist->AddValue(140); // Median value
Sameer Abu Asala8439542013-02-14 16:06:42 -0800110 hist->AddValue(145);
111 hist->AddValue(155);
112 hist->AddValue(163);
113 hist->AddValue(168);
114 hist->AddValue(175);
115 hist->AddValue(182);
116 hist->AddValue(193);
117 hist->AddValue(200);
118 hist->AddValue(205);
119 hist->AddValue(212);
Ian Rogers500793f2013-11-14 17:49:12 -0800120 hist->CreateHistogram(&data);
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700121 PerValue = hist->Percentile(0.50, data);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800122
123 std::string text;
124 std::stringstream stream;
Mathieu Chartier3e669db2013-11-20 15:51:12 -0800125 std::string expected("UpdateRange:\tSum: 2.654ms 99% C.I. 15us-212us Avg: 126.380us Max: 212us\n");
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700126 hist->PrintConfidenceIntervals(stream, 0.99, data);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800127
128 EXPECT_EQ(expected, stream.str());
129 EXPECT_GE(PerValue, 132);
130 EXPECT_LE(PerValue, 145);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800131}
Sameer Abu Asala8439542013-02-14 16:06:42 -0800132
133TEST(Histtest, Reset) {
Ian Rogers700a4022014-05-19 16:49:03 -0700134 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("Reset", 5));
Sameer Abu Asala8439542013-02-14 16:06:42 -0800135
Sameer Abu Asala8439542013-02-14 16:06:42 -0800136 double PerValue;
137 hist->AddValue(0);
138 hist->AddValue(189);
139 hist->AddValue(389);
140 hist->Reset();
141 hist->AddValue(15);
142 hist->AddValue(17);
143 hist->AddValue(35);
144 hist->AddValue(50);
145 hist->AddValue(68);
146 hist->AddValue(75);
147 hist->AddValue(93);
148 hist->AddValue(110);
149 hist->AddValue(121);
150 hist->AddValue(132);
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700151 hist->AddValue(140); // Median value
Sameer Abu Asala8439542013-02-14 16:06:42 -0800152 hist->AddValue(145);
153 hist->AddValue(155);
154 hist->AddValue(163);
155 hist->AddValue(168);
156 hist->AddValue(175);
157 hist->AddValue(182);
158 hist->AddValue(193);
159 hist->AddValue(200);
160 hist->AddValue(205);
161 hist->AddValue(212);
Ian Rogers500793f2013-11-14 17:49:12 -0800162 Histogram<uint64_t>::CumulativeData data;
163 hist->CreateHistogram(&data);
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700164 PerValue = hist->Percentile(0.50, data);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800165
166 std::string text;
167 std::stringstream stream;
Mathieu Chartier3e669db2013-11-20 15:51:12 -0800168 std::string expected("Reset:\tSum: 2.654ms 99% C.I. 15us-212us Avg: 126.380us Max: 212us\n");
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700169 hist->PrintConfidenceIntervals(stream, 0.99, data);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800170
171 EXPECT_EQ(expected, stream.str());
172 EXPECT_GE(PerValue, 132);
173 EXPECT_LE(PerValue, 145);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800174}
Sameer Abu Asala8439542013-02-14 16:06:42 -0800175
176TEST(Histtest, MultipleCreateHist) {
Ian Rogers700a4022014-05-19 16:49:03 -0700177 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("MultipleCreateHist", 5));
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700178 Histogram<uint64_t>::CumulativeData data;
Sameer Abu Asala8439542013-02-14 16:06:42 -0800179
Sameer Abu Asala8439542013-02-14 16:06:42 -0800180 double PerValue;
181 hist->AddValue(15);
182 hist->AddValue(17);
183 hist->AddValue(35);
184 hist->AddValue(50);
185 hist->AddValue(68);
186 hist->AddValue(75);
187 hist->AddValue(93);
Ian Rogers500793f2013-11-14 17:49:12 -0800188 hist->CreateHistogram(&data);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800189 hist->AddValue(110);
190 hist->AddValue(121);
191 hist->AddValue(132);
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700192 hist->AddValue(140); // Median value
Sameer Abu Asala8439542013-02-14 16:06:42 -0800193 hist->AddValue(145);
194 hist->AddValue(155);
195 hist->AddValue(163);
196 hist->AddValue(168);
Ian Rogers500793f2013-11-14 17:49:12 -0800197 hist->CreateHistogram(&data);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800198 hist->AddValue(175);
199 hist->AddValue(182);
200 hist->AddValue(193);
201 hist->AddValue(200);
202 hist->AddValue(205);
203 hist->AddValue(212);
Ian Rogers500793f2013-11-14 17:49:12 -0800204 hist->CreateHistogram(&data);
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700205 PerValue = hist->Percentile(0.50, data);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800206 std::stringstream stream;
Mathieu Chartier3e669db2013-11-20 15:51:12 -0800207 std::string expected("MultipleCreateHist:\tSum: 2.654ms 99% C.I. 15us-212us Avg: 126.380us Max: 212us\n");
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700208 hist->PrintConfidenceIntervals(stream, 0.99, data);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800209
210 EXPECT_EQ(expected, stream.str());
211 EXPECT_GE(PerValue, 132);
212 EXPECT_LE(PerValue, 145);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800213}
Sameer Abu Asala8439542013-02-14 16:06:42 -0800214
215TEST(Histtest, SingleValue) {
Ian Rogers700a4022014-05-19 16:49:03 -0700216 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("SingleValue", 5));
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700217 Histogram<uint64_t>::CumulativeData data;
Sameer Abu Asala8439542013-02-14 16:06:42 -0800218
Sameer Abu Asala8439542013-02-14 16:06:42 -0800219 hist->AddValue(1);
Ian Rogers500793f2013-11-14 17:49:12 -0800220 hist->CreateHistogram(&data);
Sameer Abu Asalc081e362013-02-20 16:45:38 -0800221 std::stringstream stream;
Mathieu Chartier3e669db2013-11-20 15:51:12 -0800222 std::string expected = "SingleValue:\tSum: 1us 99% C.I. 1us-1us Avg: 1us Max: 1us\n";
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700223 hist->PrintConfidenceIntervals(stream, 0.99, data);
Sameer Abu Asal857a0782013-02-21 11:00:20 -0800224 EXPECT_EQ(expected, stream.str());
Sameer Abu Asal857a0782013-02-21 11:00:20 -0800225}
Sameer Abu Asala8439542013-02-14 16:06:42 -0800226
Sameer Abu Asal857a0782013-02-21 11:00:20 -0800227TEST(Histtest, CappingPercentiles) {
Ian Rogers700a4022014-05-19 16:49:03 -0700228 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("CappingPercentiles", 5));
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700229 Histogram<uint64_t>::CumulativeData data;
Sameer Abu Asal857a0782013-02-21 11:00:20 -0800230
231 double per_995;
232 double per_005;
Sameer Abu Asal857a0782013-02-21 11:00:20 -0800233 // All values are similar.
234 for (uint64_t idx = 0ull; idx < 150ull; idx++) {
235 hist->AddValue(0);
236 }
Ian Rogers500793f2013-11-14 17:49:12 -0800237 hist->CreateHistogram(&data);
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700238 per_995 = hist->Percentile(0.995, data);
Ian Rogers647b1a82014-10-10 11:02:11 -0700239 EXPECT_DOUBLE_EQ(per_995, 0.0);
Sameer Abu Asal857a0782013-02-21 11:00:20 -0800240 hist->Reset();
241 for (size_t idx = 0; idx < 200; idx++) {
242 for (uint64_t val = 1ull; val <= 4ull; val++) {
243 hist->AddValue(val);
244 }
245 }
Ian Rogers500793f2013-11-14 17:49:12 -0800246 hist->CreateHistogram(&data);
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700247 per_005 = hist->Percentile(0.005, data);
248 per_995 = hist->Percentile(0.995, data);
Ian Rogers647b1a82014-10-10 11:02:11 -0700249 EXPECT_DOUBLE_EQ(1.0, per_005);
250 EXPECT_DOUBLE_EQ(4.0, per_995);
Sameer Abu Asala8439542013-02-14 16:06:42 -0800251}
Sameer Abu Asala8439542013-02-14 16:06:42 -0800252
253TEST(Histtest, SpikyValues) {
Ian Rogers700a4022014-05-19 16:49:03 -0700254 std::unique_ptr<Histogram<uint64_t>> hist(new Histogram<uint64_t>("SpikyValues", 5, 4096));
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700255 Histogram<uint64_t>::CumulativeData data;
Sameer Abu Asala8439542013-02-14 16:06:42 -0800256
Sameer Abu Asalc081e362013-02-20 16:45:38 -0800257 for (uint64_t idx = 0ull; idx < 30ull; idx++) {
258 for (uint64_t idx_inner = 0ull; idx_inner < 5ull; idx_inner++) {
259 hist->AddValue(idx * idx_inner);
260 }
Sameer Abu Asala8439542013-02-14 16:06:42 -0800261 }
Sameer Abu Asala8439542013-02-14 16:06:42 -0800262 hist->AddValue(10000);
Ian Rogers500793f2013-11-14 17:49:12 -0800263 hist->CreateHistogram(&data);
Sameer Abu Asalc081e362013-02-20 16:45:38 -0800264 std::stringstream stream;
Mathieu Chartier3e669db2013-11-20 15:51:12 -0800265 std::string expected = "SpikyValues:\tSum: 14.350ms 99% C.I. 0.089us-2541.825us Avg: 95.033us Max: 10000us\n";
Mathieu Chartiere5426c92013-08-01 13:55:42 -0700266 hist->PrintConfidenceIntervals(stream, 0.99, data);
Sameer Abu Asal857a0782013-02-21 11:00:20 -0800267 EXPECT_EQ(expected, stream.str());
Sameer Abu Asala8439542013-02-14 16:06:42 -0800268}
Brian Carlstrom3e3d5912013-07-18 00:19:45 -0700269
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700270} // namespace art