@@ -23,17 +23,33 @@ class ZipfianGenerator : public Generator<uint64_t> {
2323 public:
2424 static constexpr double kZipfianConst = 0.99 ;
2525 static constexpr uint64_t kMaxNumItems = (UINT64_MAX >> 24 );
26+ static constexpr uint64_t kPrecomputedZetaItems = 10000000000LL ;
27+ static constexpr double kPrecomputedZetaTheta = 0.99 ;
28+ static constexpr double kPrecomputedZeta = 26.46902820178302 ;
2629
2730 ZipfianGenerator (uint64_t num_items) :
2831 ZipfianGenerator (0 , num_items - 1 ) {}
2932
3033 ZipfianGenerator (uint64_t min, uint64_t max, double zipfian_const = kZipfianConst ) :
31- ZipfianGenerator (min, max, zipfian_const, Zeta(max - min + 1 , zipfian_const)) {}
34+ items_ (max - min + 1 ), base_(min), theta_(zipfian_const), allow_count_decrease_(false ) {
35+ assert (items_ >= 2 && items_ < kMaxNumItems );
36+ Init (ZetaFor (items_, theta_));
37+ }
3238
3339 ZipfianGenerator (uint64_t min, uint64_t max, double zipfian_const, double zeta_n) :
3440 items_ (max - min + 1 ), base_(min), theta_(zipfian_const), allow_count_decrease_(false ) {
3541 assert (items_ >= 2 && items_ < kMaxNumItems );
42+ Init (zeta_n);
43+ }
44+
45+ uint64_t Next (uint64_t num_items);
3646
47+ uint64_t Next () { return Next (items_); }
48+
49+ uint64_t Last ();
50+
51+ private:
52+ void Init (double zeta_n) {
3753 zeta_2_ = Zeta (2 , theta_);
3854
3955 alpha_ = 1.0 / (1.0 - theta_);
@@ -44,13 +60,6 @@ class ZipfianGenerator : public Generator<uint64_t> {
4460 Next ();
4561 }
4662
47- uint64_t Next (uint64_t num_items);
48-
49- uint64_t Next () { return Next (items_); }
50-
51- uint64_t Last ();
52-
53- private:
5463 double Eta () {
5564 return (1 - std::pow (2.0 / items_, 1 - theta_)) / (1 - zeta_2_ / zeta_n_);
5665 }
@@ -73,6 +82,13 @@ class ZipfianGenerator : public Generator<uint64_t> {
7382 return Zeta (0 , num, theta, 0 );
7483 }
7584
85+ static double ZetaFor (uint64_t num, double theta) {
86+ if (num == kPrecomputedZetaItems && theta == kPrecomputedZetaTheta ) {
87+ return kPrecomputedZeta ;
88+ }
89+ return Zeta (num, theta);
90+ }
91+
7692 uint64_t items_;
7793 uint64_t base_; // / Min number of items to generate
7894
0 commit comments