percentile_ut.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "percentile_lg.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. using namespace NMonitoring;
  4. Y_UNIT_TEST_SUITE(PercentileTest) {
  5. template<size_t A, size_t B, size_t B_BEGIN>
  6. void printSizeAndLimit() {
  7. using TPerc = TPercentileTrackerLg<A, B, 15>;
  8. Cout << "TPercentileTrackerLg<" << A << ", " << B << ", 15>"
  9. << "; sizeof# " << LeftPad(HumanReadableSize(sizeof(TPerc), SF_BYTES), 7)
  10. << "; max_granularity# " << LeftPad(HumanReadableSize(TPerc::MAX_GRANULARITY, SF_QUANTITY), 5)
  11. << "; limit# " << LeftPad(HumanReadableSize(TPerc::TRACKER_LIMIT , SF_QUANTITY), 5) << Endl;
  12. if constexpr (B > 1) {
  13. printSizeAndLimit<A, B - 1, B_BEGIN>();
  14. } else if constexpr (A > 1) {
  15. Cout << Endl;
  16. printSizeAndLimit<A - 1, B_BEGIN, B_BEGIN>();
  17. }
  18. }
  19. Y_UNIT_TEST(PrintTrackerLgSizeAndLimits) {
  20. printSizeAndLimit<10, 5, 5>();
  21. }
  22. Y_UNIT_TEST(TrackerLimitTest) {
  23. {
  24. using TPerc = TPercentileTrackerLg<1, 0, 1>;
  25. TPerc tracker;
  26. tracker.Increment(Max<size_t>());
  27. UNIT_ASSERT_EQUAL(TPerc::TRACKER_LIMIT, tracker.GetPercentile(1.0));
  28. }
  29. {
  30. using TPerc = TPercentileTrackerLg<1, 1, 1>;
  31. TPerc tracker;
  32. tracker.Increment(Max<size_t>());
  33. UNIT_ASSERT_EQUAL(TPerc::TRACKER_LIMIT, tracker.GetPercentile(1.0));
  34. }
  35. {
  36. using TPerc = TPercentileTrackerLg<1, 5, 1>;
  37. TPerc tracker;
  38. tracker.Increment(Max<size_t>());
  39. UNIT_ASSERT_EQUAL(TPerc::TRACKER_LIMIT, tracker.GetPercentile(1.0));
  40. }
  41. {
  42. using TPerc = TPercentileTrackerLg<2, 1, 1>;
  43. TPerc tracker;
  44. tracker.Increment(Max<size_t>());
  45. UNIT_ASSERT_EQUAL(TPerc::TRACKER_LIMIT, tracker.GetPercentile(1.0));
  46. }
  47. {
  48. using TPerc = TPercentileTrackerLg<5, 4, 1>;
  49. TPerc tracker;
  50. tracker.Increment(Max<size_t>());
  51. UNIT_ASSERT_EQUAL(TPerc::TRACKER_LIMIT, tracker.GetPercentile(1.0));
  52. }
  53. }
  54. Y_UNIT_TEST(BucketIdxIfvsBucketIdxBinarySearch) {
  55. for (size_t var = 0; var < 5; var++) {
  56. if (var == 0) {
  57. TPercentileTrackerLg<3, 2, 15> tracker;
  58. for (size_t i = 0; i < 3000000; i += 1) {
  59. size_t num1 = tracker.BucketIdxMostSignificantBit(i);
  60. size_t num2 = tracker.BucketIdxBinarySearch(i);
  61. UNIT_ASSERT_EQUAL(num1, num2);
  62. }
  63. } else if (var == 1) {
  64. TPercentileTrackerLg<4, 4, 15> tracker;
  65. for (size_t i = 0; i < 3000000; i += 1) {
  66. size_t num1 = tracker.BucketIdxMostSignificantBit(i);
  67. size_t num2 = tracker.BucketIdxBinarySearch(i);
  68. UNIT_ASSERT_EQUAL(num1, num2);
  69. }
  70. } else if (var == 2) {
  71. TPercentileTrackerLg<5, 3, 15> tracker;
  72. for (size_t i = 0; i < 3000000; i += 1) {
  73. size_t num1 = tracker.BucketIdxMostSignificantBit(i);
  74. size_t num2 = tracker.BucketIdxBinarySearch(i);
  75. size_t num3 = tracker.BucketIdxIf(i);
  76. UNIT_ASSERT_EQUAL(num1, num2);
  77. UNIT_ASSERT_EQUAL(num2, num3);
  78. }
  79. } else if (var == 3) {
  80. TPercentileTrackerLg<5, 4, 15> tracker;
  81. for (size_t i = 0; i < 3000000; i += 1) {
  82. size_t num1 = tracker.BucketIdxMostSignificantBit(i);
  83. size_t num2 = tracker.BucketIdxBinarySearch(i);
  84. size_t num3 = tracker.BucketIdxIf(i);
  85. UNIT_ASSERT_EQUAL(num1, num2);
  86. UNIT_ASSERT_EQUAL(num2, num3);
  87. }
  88. } else if (var == 4) {
  89. TPercentileTrackerLg<6, 5, 15> tracker;
  90. for (size_t i = 0; i < 3000000; i += 1) {
  91. size_t num1 = tracker.BucketIdxMostSignificantBit(i);
  92. size_t num2 = tracker.BucketIdxBinarySearch(i);
  93. UNIT_ASSERT_EQUAL(num1, num2);
  94. }
  95. for (size_t i = 0; i < 400000000000ul; i += 1303) {
  96. size_t num1 = tracker.BucketIdxMostSignificantBit(i);
  97. size_t num2 = tracker.BucketIdxBinarySearch(i);
  98. UNIT_ASSERT_EQUAL(num1, num2);
  99. }
  100. }
  101. }
  102. }
  103. Y_UNIT_TEST(DifferentPercentiles) {
  104. TPercentileTrackerLg<5, 4, 15> tracker;
  105. TVector<size_t> values({0, 115, 1216, 15, 3234567, 1234567, 216546, 263421, 751654, 96, 224, 223, 225});
  106. TVector<size_t> percentiles50({0, 0, 116, 15, 116, 116, 1216, 1216, 217056, 1216, 1216, 224, 232});
  107. TVector<size_t> percentiles75({0, 116, 116, 116, 1216, 1245152, 217056, 270304, 753632, 753632,
  108. 270304, 270304, 270304});
  109. TVector<size_t> percentiles90({ 0, 116, 1216, 1216, 2064352, 1245152, 1245152, 1245152, 1245152,
  110. 1245152, 1245152, 1245152, 1245152});
  111. TVector<size_t> percentiles100({ 0, 116, 1216, 1216, 2064352, 2064352, 2064352, 2064352, 2064352,
  112. 2064352, 2064352, 2064352, 2064352 });
  113. for (size_t i = 0; i < values.size(); ++i) {
  114. tracker.Increment(values[i]);
  115. UNIT_ASSERT_EQUAL(tracker.GetPercentile(0.5), percentiles50[i]);
  116. UNIT_ASSERT_EQUAL(tracker.GetPercentile(0.75), percentiles75[i]);
  117. UNIT_ASSERT_EQUAL(tracker.GetPercentile(0.90), percentiles90[i]);
  118. UNIT_ASSERT_EQUAL(tracker.GetPercentile(1.0), percentiles100[i]);
  119. }
  120. }
  121. }