Commit f185ea84 authored by Marc Celani's avatar Marc Celani Committed by Facebook Github Bot

Get rid of unnecessary base class

Summary: This turned out to only be useful in tests. Clean up the tests and get rid of it

Reviewed By: yfeldblum

Differential Revision: D7907221

fbshipit-source-id: f5e0263c1426e1af97c190e6b2bd47d7db37d403
parent 346d9d76
...@@ -30,33 +30,11 @@ struct QuantileEstimates { ...@@ -30,33 +30,11 @@ struct QuantileEstimates {
std::vector<std::pair<double, double>> quantiles; std::vector<std::pair<double, double>> quantiles;
}; };
template <typename ClockT>
class QuantileEstimator {
public:
using TimePoint = typename ClockT::time_point;
virtual ~QuantileEstimator() {}
QuantileEstimates estimateQuantiles(Range<const double*> quantiles) {
return estimateQuantiles(quantiles, ClockT::now());
}
virtual QuantileEstimates estimateQuantiles(
Range<const double*> quantiles,
TimePoint now) = 0;
void addValue(double value) {
addValue(value, ClockT::now());
}
virtual void addValue(double value, TimePoint now) = 0;
};
/* /*
* A QuantileEstimator that buffers writes for 1 second. * A QuantileEstimator that buffers writes for 1 second.
*/ */
template <typename ClockT = std::chrono::steady_clock> template <typename ClockT = std::chrono::steady_clock>
class SimpleQuantileEstimator : public QuantileEstimator<ClockT> { class SimpleQuantileEstimator {
public: public:
using TimePoint = typename ClockT::time_point; using TimePoint = typename ClockT::time_point;
...@@ -64,8 +42,8 @@ class SimpleQuantileEstimator : public QuantileEstimator<ClockT> { ...@@ -64,8 +42,8 @@ class SimpleQuantileEstimator : public QuantileEstimator<ClockT> {
QuantileEstimates estimateQuantiles( QuantileEstimates estimateQuantiles(
Range<const double*> quantiles, Range<const double*> quantiles,
TimePoint now) override; TimePoint now = ClockT::now());
void addValue(double value, TimePoint now) override; void addValue(double value, TimePoint now = ClockT::now());
private: private:
detail::BufferedDigest<TDigest, ClockT> bufferedDigest_; detail::BufferedDigest<TDigest, ClockT> bufferedDigest_;
...@@ -76,7 +54,7 @@ class SimpleQuantileEstimator : public QuantileEstimator<ClockT> { ...@@ -76,7 +54,7 @@ class SimpleQuantileEstimator : public QuantileEstimator<ClockT> {
* constructor). Values are buffered for windowDuration. * constructor). Values are buffered for windowDuration.
*/ */
template <typename ClockT = std::chrono::steady_clock> template <typename ClockT = std::chrono::steady_clock>
class SlidingWindowQuantileEstimator : public QuantileEstimator<ClockT> { class SlidingWindowQuantileEstimator {
public: public:
using TimePoint = typename ClockT::time_point; using TimePoint = typename ClockT::time_point;
...@@ -86,8 +64,8 @@ class SlidingWindowQuantileEstimator : public QuantileEstimator<ClockT> { ...@@ -86,8 +64,8 @@ class SlidingWindowQuantileEstimator : public QuantileEstimator<ClockT> {
QuantileEstimates estimateQuantiles( QuantileEstimates estimateQuantiles(
Range<const double*> quantiles, Range<const double*> quantiles,
TimePoint now) override; TimePoint now = ClockT::now());
void addValue(double value, TimePoint now) override; void addValue(double value, TimePoint now = ClockT::now());
private: private:
detail::BufferedSlidingWindow<TDigest, ClockT> bufferedSlidingWindow_; detail::BufferedSlidingWindow<TDigest, ClockT> bufferedSlidingWindow_;
......
...@@ -34,21 +34,16 @@ struct MockClock { ...@@ -34,21 +34,16 @@ struct MockClock {
MockClock::time_point MockClock::Now = MockClock::time_point{}; MockClock::time_point MockClock::Now = MockClock::time_point{};
class QuantileEstimatorTest TEST(SimpleQuantileEstimatorTest, EstimateQuantiles) {
: public ::testing::TestWithParam< SimpleQuantileEstimator<MockClock> estimator;
std::shared_ptr<QuantileEstimator<MockClock>>> {};
TEST_P(QuantileEstimatorTest, EstimateQuantiles) {
auto estimator = GetParam();
for (size_t i = 1; i <= 100; ++i) { for (size_t i = 1; i <= 100; ++i) {
estimator->addValue(i); estimator.addValue(i);
} }
MockClock::Now += std::chrono::seconds{1}; MockClock::Now += std::chrono::seconds{1};
std::vector<double> quantiles = {0.001, 0.01, 0.5, 0.99, 0.999}; auto estimates = estimator.estimateQuantiles(
std::array<double, 5>{{.001, .01, .5, .99, .999}});
auto estimates = estimator->estimateQuantiles(quantiles);
EXPECT_EQ(5050, estimates.sum); EXPECT_EQ(5050, estimates.sum);
EXPECT_EQ(100, estimates.count); EXPECT_EQ(100, estimates.count);
...@@ -66,13 +61,29 @@ TEST_P(QuantileEstimatorTest, EstimateQuantiles) { ...@@ -66,13 +61,29 @@ TEST_P(QuantileEstimatorTest, EstimateQuantiles) {
EXPECT_EQ(100, estimates.quantiles[4].second); EXPECT_EQ(100, estimates.quantiles[4].second);
} }
INSTANTIATE_TEST_CASE_P( TEST(SlidingWindowQuantileEstimatorTest, EstimateQuantiles) {
SimpleQuantileEstimator, SlidingWindowQuantileEstimator<MockClock> estimator(std::chrono::seconds{1});
QuantileEstimatorTest, for (size_t i = 1; i <= 100; ++i) {
::testing::Values(new SimpleQuantileEstimator<MockClock>())); estimator.addValue(i);
}
MockClock::Now += std::chrono::seconds{1};
auto estimates = estimator.estimateQuantiles(
std::array<double, 5>{{.001, .01, .5, .99, .999}});
EXPECT_EQ(5050, estimates.sum);
EXPECT_EQ(100, estimates.count);
EXPECT_EQ(0.001, estimates.quantiles[0].first);
EXPECT_EQ(0.01, estimates.quantiles[1].first);
EXPECT_EQ(0.5, estimates.quantiles[2].first);
EXPECT_EQ(0.99, estimates.quantiles[3].first);
EXPECT_EQ(0.999, estimates.quantiles[4].first);
INSTANTIATE_TEST_CASE_P( EXPECT_EQ(1, estimates.quantiles[0].second);
SlidingWindowQuantileEstimator, EXPECT_EQ(2.0 - 0.5, estimates.quantiles[1].second);
QuantileEstimatorTest, EXPECT_EQ(50.375, estimates.quantiles[2].second);
::testing::Values(new SlidingWindowQuantileEstimator<MockClock>( EXPECT_EQ(100.0 - 0.5, estimates.quantiles[3].second);
std::chrono::seconds{1}))); EXPECT_EQ(100, estimates.quantiles[4].second);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment