proxygen
TDigestBenchmark.cpp File Reference
#include <folly/stats/TDigest.h>
#include <algorithm>
#include <chrono>
#include <random>
#include <folly/Benchmark.h>
#include <folly/portability/GFlags.h>

Go to the source code of this file.

Functions

void merge (unsigned int iters, size_t maxSize, size_t bufSize)
 
void mergeDigests (unsigned int iters, size_t maxSize, size_t nDigests)
 
void estimateQuantile (unsigned int iters, size_t maxSize, double quantile)
 
 BENCHMARK_DRAW_LINE ()
 
int main (int argc, char *argv[])
 

Function Documentation

BENCHMARK_DRAW_LINE ( )

Referenced by estimateQuantile().

void estimateQuantile ( unsigned int  iters,
size_t  maxSize,
double  quantile 
)

Definition at line 76 of file TDigestBenchmark.cpp.

References BENCHMARK_DRAW_LINE(), BENCHMARK_NAMED_PARAM, BENCHMARK_RELATIVE_NAMED_PARAM, BENCHMARK_SUSPEND, buffer(), count, folly::TDigest::estimateQuantile(), generator, i, merge(), folly::TDigest::merge(), mergeDigests(), now(), and values().

76  {
77  TDigest digest(maxSize);
78 
79  size_t bufSize = maxSize * 10;
81  std::vector<double> values;
82 
83  std::default_random_engine generator;
84  generator.seed(std::chrono::system_clock::now().time_since_epoch().count());
85 
86  std::lognormal_distribution<double> distribution(0.0, 1.0);
87 
88  for (size_t i = 0; i < 50000; ++i) {
89  values.push_back(distribution(generator));
90  }
91 
92  for (size_t i = 0; i < 50000 / bufSize; ++i) {
93  std::vector<double> buffer;
94  for (size_t j = 0; j < bufSize; ++j) {
95  buffer.push_back(values[i * bufSize + j]);
96  }
97  digest = digest.merge(buffer);
98  }
99  }
100 
101  for (size_t i = 0; i < iters; ++i) {
102  digest.estimateQuantile(quantile);
103  }
104 }
std::vector< uint8_t > buffer(kBufferSize+16)
std::default_random_engine generator
#define BENCHMARK_SUSPEND
Definition: Benchmark.h:576
std::chrono::steady_clock::time_point now()
int * count
std::vector< int > values(1'000)
int main ( int  argc,
char *  argv[] 
)

Definition at line 169 of file TDigestBenchmark.cpp.

References argv, and folly::runBenchmarks().

169  {
170  gflags::ParseCommandLineFlags(&argc, &argv, true);
172  return 0;
173 }
void runBenchmarks()
Definition: Benchmark.cpp:456
char ** argv
void merge ( unsigned int  iters,
size_t  maxSize,
size_t  bufSize 
)

Definition at line 27 of file TDigestBenchmark.cpp.

References BENCHMARK_SUSPEND, buffer(), count, generator, i, folly::TDigest::merge(), folly::gen::move, now(), and folly::presorted.

Referenced by folly::detail::DigestBuilder< DigestT >::build(), estimateQuantile(), mergeDigests(), folly::detail::BufferedDigest< DigestT, ClockT >::onNewDigest(), folly::detail::BufferedSlidingWindow< DigestT, ClockT >::onNewDigest(), and TEST().

27  {
28  TDigest digest(maxSize);
29 
30  std::vector<std::vector<double>> buffers;
31 
33  std::default_random_engine generator;
34  generator.seed(std::chrono::system_clock::now().time_since_epoch().count());
35 
36  std::lognormal_distribution<double> distribution(0.0, 1.0);
37 
38  for (size_t i = 0; i < iters; ++i) {
39  std::vector<double> buffer;
40  for (size_t j = 0; j < bufSize; ++j) {
41  buffer.push_back(distribution(generator));
42  }
43  std::sort(buffer.begin(), buffer.end());
44  buffers.push_back(std::move(buffer));
45  }
46  }
47 
48  for (const auto& buffer : buffers) {
49  digest = digest.merge(folly::presorted, buffer);
50  }
51 }
std::vector< uint8_t > buffer(kBufferSize+16)
std::default_random_engine generator
#define BENCHMARK_SUSPEND
Definition: Benchmark.h:576
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::chrono::steady_clock::time_point now()
int * count
constexpr presorted_t presorted
Definition: Utility.h:311
void mergeDigests ( unsigned int  iters,
size_t  maxSize,
size_t  nDigests 
)

Definition at line 53 of file TDigestBenchmark.cpp.

References BENCHMARK_SUSPEND, buffer(), count, generator, i, merge(), folly::TDigest::merge(), and now().

Referenced by estimateQuantile().

53  {
54  std::vector<TDigest> digests;
56  TDigest digest(maxSize);
57  std::default_random_engine generator;
58  generator.seed(std::chrono::system_clock::now().time_since_epoch().count());
59 
60  std::lognormal_distribution<double> distribution(0.0, 1.0);
61 
62  for (size_t i = 0; i < nDigests; ++i) {
63  std::vector<double> buffer;
64  for (size_t j = 0; j < maxSize; ++j) {
65  buffer.push_back(distribution(generator));
66  }
67  digests.push_back(digest.merge(buffer));
68  }
69  }
70 
71  for (size_t i = 0; i < iters; ++i) {
72  TDigest::merge(digests);
73  }
74 }
std::vector< uint8_t > buffer(kBufferSize+16)
std::default_random_engine generator
#define BENCHMARK_SUSPEND
Definition: Benchmark.h:576
std::chrono::steady_clock::time_point now()
int * count
void merge(unsigned int iters, size_t maxSize, size_t bufSize)