--- /dev/null
+Number of buckets,Average for update,Average for percentile,Total for 20000000 mixed iterations
+20,22.399243,32.234964,495.857988
+40,25.528343,39.397647,586.628428
+60,26.706422,39.726522,613.791265
+80,29.402889,40.906750,662.411160
+100,30.655842,42.539808,708.406044
+120,34.291907,43.694596,705.757070
+140,33.157924,45.571501,743.901288
+160,33.644566,46.156432,759.979938
+180,34.511660,47.186986,783.354591
+200,35.149506,47.878792,796.423202
+220,37.831280,49.476695,826.503587
+240,37.810377,49.449305,834.809788
+260,38.861861,49.604123,904.369460
+280,38.918660,49.902678,872.406038
+300,38.925808,50.110397,853.687773
+320,39.479305,50.639268,858.783989
+340,40.030510,51.000832,872.098210
+360,40.726870,51.404635,883.838316
+380,40.538804,52.283202,884.844450
+400,40.926581,52.701877,996.370751
+420,41.231143,52.846620,913.055910
+440,41.718648,53.063876,920.263605
+460,43.048154,53.113507,924.775671
+480,43.041926,53.553811,934.157700
+500,43.594351,55.233892,960.866283
+520,44.275040,55.598164,976.063588
+540,45.630621,55.787917,1005.145613
+560,44.490061,56.098219,969.730471
+580,45.058746,56.669739,994.013328
+600,52.034014,112.826753,1975.138961
+620,88.859372,113.832529,1849.151438
+640,89.456311,114.281936,1989.765445
+660,89.228945,113.969544,1982.857811
+680,88.766927,114.673313,1865.125717
+700,88.835999,124.337479,1857.993412
+720,95.613325,114.395997,1987.750687
+740,89.408266,114.856012,2008.157167
+760,89.467911,120.347940,2188.573381
+780,89.366811,120.754142,1993.740474
+800,95.797516,114.512331,1998.330264
+820,89.829861,121.037966,2246.061960
+840,90.721193,114.551185,1996.292408
+860,90.967448,114.471501,2141.292135
+880,90.322395,115.502224,2005.003311
+900,90.439771,121.248371,2010.633220
+920,90.336257,121.453370,2154.557553
+940,97.830837,114.744609,2035.455975
+960,97.560298,124.358657,2147.040151
+980,91.284913,114.965916,2029.633665
+1000,97.645668,115.297393,2036.853279
+1020,97.900111,121.972760,2056.089064
+1040,98.664974,122.582933,2057.384955
+1060,98.395977,122.772813,2174.978407
+1080,98.666000,122.994144,2264.207825
+1100,98.711500,117.559049,2173.536969
+1120,92.185249,116.915751,2057.390656
+1140,92.377632,117.521651,2050.937698
+1160,98.680102,123.755452,2054.072184
+1180,99.158158,124.549303,2272.022697
+1200,99.646351,124.117236,2184.281674
+1220,101.982639,117.557074,2058.727049
+1240,98.888999,124.306981,2062.533151
+1260,99.822836,124.610359,2193.067156
+1280,102.808674,124.552191,2199.530214
+1300,99.306467,124.492050,2194.443489
+1320,99.310711,124.483635,2065.641481
+1340,99.287784,125.843748,2074.245138
+1360,93.382068,124.615543,2202.156389
+1380,99.644128,125.216063,2203.002227
+1400,100.553860,129.372198,2249.826176
+1420,109.489562,126.523210,2203.201478
+1440,100.466458,132.329895,2207.193528
+1460,100.196757,129.455762,2212.528889
+1480,100.230294,125.621451,2229.034263
+1500,100.605787,126.587007,2219.757186
+1520,101.217948,137.205395,2102.151091
+1540,107.391109,126.238699,2230.320982
+1560,100.878290,126.206870,2237.882363
+1580,101.183033,135.072038,2102.196121
+1600,107.182170,125.917355,2106.545995
+1620,107.585180,126.291577,2234.253909
+1640,102.031631,135.888359,2245.166293
+1660,101.206551,132.539892,2236.452972
+1680,101.436838,126.436447,2238.680233
+1700,101.594393,126.444108,2233.731741
+1720,101.555702,126.671375,2271.848751
+1740,113.119558,135.696346,2261.747305
+1760,102.795511,137.782247,2245.001044
+1780,108.483841,126.631449,2246.727265
+1800,102.508803,126.921568,2249.141683
+1820,102.687729,136.692892,2258.234661
+1840,108.833782,126.906014,2257.492740
+1860,102.688856,127.141704,2254.117380
+1880,102.527625,135.988985,2271.611313
+1900,109.361359,134.864022,2266.529140
+1920,103.025290,133.682820,2275.012767
+1940,109.580171,137.707916,2265.962114
+1960,103.094684,127.560911,2266.769230
+1980,103.311189,127.791572,2282.952863
+2000,110.083324,138.040303,2275.421372
+2020,103.601840,127.758244,2279.271022
+2040,103.895368,127.945153,2295.604751
+2060,110.884598,149.718550,2317.779055
+2080,122.670660,145.312687,2428.870867
+2100,111.247926,141.633110,2460.202474
+2120,110.788395,159.577851,2448.006245
+2140,111.250531,139.412448,2489.443471
+2160,113.838216,147.780204,2526.135227
+2180,137.275589,148.194148,2315.952410
+2200,112.445140,140.419958,2328.341468
+2220,111.510765,140.289054,2315.095706
+2240,105.090494,145.624897,2447.984542
+2260,111.198342,139.443637,2307.857417
+2280,104.572990,145.399085,2322.874036
+2300,110.460552,139.324778,2438.091755
+2320,104.863633,145.679558,2311.670992
+2340,111.360183,140.231518,2510.918524
+2360,112.314716,159.751326,2506.200920
+2380,105.173334,147.367201,2437.342323
+2400,111.619067,146.268009,2517.296059
+2420,104.997344,146.346595,2322.563188
+2440,111.203465,140.616630,2340.052027
+2460,111.406283,140.515532,2482.412814
+2480,105.144235,146.750382,2460.042421
+2500,111.572781,147.084099,2450.266062
+2520,111.684148,148.968831,2329.320582
+2540,111.213965,140.727502,2330.622722
+2560,111.859550,140.865379,2330.593810
+2580,111.900021,150.308166,2453.505446
+2600,120.310252,141.742834,2334.284653
+2620,111.487308,140.208695,2459.989314
+2640,111.840898,152.067253,2445.501799
+2660,111.560318,146.568121,2326.674731
+2680,111.638034,147.995733,2460.056224
+2700,112.486015,159.016382,2461.335657
+2720,111.902233,140.496837,2480.887975
+2740,112.330382,147.384770,2472.814407
+2760,123.394367,140.439287,2481.515891
+2780,119.380938,141.370731,2342.750913
+2800,113.392702,146.628905,2457.904515
+2820,122.945232,140.741310,2338.583099
+2840,112.013293,141.255852,2343.701157
+2860,112.358293,141.378250,2335.374902
+2880,112.596029,146.762496,2453.475048
+2900,112.590254,146.851270,2471.138050
+2920,112.535694,147.432182,2488.290312
+2940,112.613238,157.535682,2529.762852
+2960,113.063133,142.421984,2531.230776
+2980,113.996503,147.988168,2574.907647
+3000,112.395466,148.512368,2473.847280
+3020,112.662706,147.717789,2484.870015
+3040,112.751169,141.797787,2480.262393
+3060,112.943086,141.480118,2473.682775
+3080,113.045151,147.873888,2489.555987
+3100,113.193668,151.193176,2479.767150
+3120,120.292310,141.820743,2360.347057
+3140,113.406801,149.215052,2481.318891
+3160,113.284436,151.615125,2475.488664
+3180,113.322834,141.661712,2508.288343
+3200,119.253639,148.187514,2483.856596
+3220,112.872198,142.185911,2483.238299
+3240,113.175942,147.818862,2508.661840
+3260,113.945839,147.689601,2479.562502
+3280,123.385029,148.853810,2498.865767
+3300,113.194655,141.766002,2485.897106
+3320,113.304257,148.473288,2485.970065
+3340,113.798410,159.486118,2353.265265
+3360,114.359538,149.572928,2489.941027
+3380,113.276930,148.416204,2705.149188
+3400,113.622436,142.343168,2485.203570
+3420,113.788884,148.026343,2486.338179
+3440,113.457103,150.178732,2520.515980
+3460,121.441333,152.931507,2492.193183
+3480,113.474869,148.264927,2504.224769
+3500,113.470946,151.794485,2507.076630
+3520,113.968273,148.403653,2492.054662
+3540,114.480909,148.155640,2522.386916
+3560,121.346178,158.830787,2508.947161
+3580,114.899105,149.509165,2495.815424
+3600,114.242812,150.010535,2507.197538
+3620,118.202930,148.679725,2493.807606
+3640,114.514038,149.427490,2645.846938
+3660,120.542348,149.428224,2505.968862
+3680,114.222355,148.632125,2505.880338
+3700,114.185415,149.197959,2508.405181
+3720,114.377059,149.393723,2695.284406
+3740,121.262389,142.440306,2523.311926
+3760,114.664916,148.543349,2504.437980
+3780,115.535792,149.572713,2506.087070
+3800,120.848231,148.636450,2508.384652
+3820,115.213962,148.980192,2510.306562
+3840,114.638801,159.020896,2531.194653
+3860,115.745036,149.627541,2513.522442
+3880,121.288082,149.275561,2514.996486
+3900,116.176657,150.790998,2523.083664
+3920,114.678989,149.406514,2648.662511
+3940,123.565242,150.138635,2519.979079
+3960,125.292389,150.058899,2650.704602
+3980,121.412504,142.562508,2514.636836
+4000,121.880036,149.022176,2540.520500
#include "distribution.h"
-const size_t NUM_UPDATES = 1000000;
-const size_t NUM_PERCENTILES = 1000000;
-const size_t MIXED = 1000000;
+const size_t NUM_UPDATES = 20000000;
+const size_t NUM_PERCENTILES = 20000000;
+const size_t MIXED = 20000000;
distribution_t *build(size_t num_buckets) {
srand(5);
}
double calculate_update_time(distribution_t *dist) {
- double updates[NUM_UPDATES];
+ double *updates = calloc(NUM_UPDATES, sizeof(*updates));
for (size_t i = 0; i < NUM_UPDATES; i++) {
updates[i] = (rand() * RAND_MAX + rand()) % (distribution_num_buckets(dist) * 100);
}
clock_gettime(CLOCK_MONOTONIC, &finish);
double update_dur = 1000.0 * (finish.tv_sec - start.tv_sec) + 1e-6 * (finish.tv_nsec - start.tv_nsec);
double average = update_dur / NUM_UPDATES * 1000000.0;
+ free(updates);
return average;
}
double calculate_percentile_time(distribution_t *dist) {
- double percentiles[NUM_PERCENTILES];
+ double *percentiles = calloc(NUM_PERCENTILES, sizeof(*percentiles));
for (size_t i = 0; i < NUM_PERCENTILES; i++) {
percentiles[i] = 100.0 * rand() / RAND_MAX;
}
clock_gettime(CLOCK_MONOTONIC, &finish);
double percentile_dur = 1000.0 * (finish.tv_sec - start.tv_sec) + 1e-6 * (finish.tv_nsec - start.tv_nsec);
double average = percentile_dur / NUM_PERCENTILES * 1000000.0;
+ free(percentiles);
return average;
}
double mixed(size_t num_buckets) {
distribution_t *dist = build(num_buckets);
- double updates[MIXED / 10 * 9];
- double percentiles[MIXED / 10];
+ double *updates = calloc(MIXED / 10 * 9, sizeof(*updates));
+ double *percentiles = calloc(MIXED / 10, sizeof(*percentiles));
for (size_t i = 0; i < MIXED / 10 * 9; i++)
updates[i] = (rand() * RAND_MAX + rand()) % (num_buckets * 100);
for (size_t i = 0; i < MIXED / 10; i++)
size_t pid = 0;
struct timespec start, finish;
clock_gettime(CLOCK_MONOTONIC, &start);
+ double val = 0;
for (size_t i = 0; i < MIXED; i++) {
- if (i % 10 == 9)
- distribution_percentile(dist, percentiles[pid++]);
+ if (i % 10 == 9) {
+ double d = distribution_percentile(dist, percentiles[pid++]);
+ if (d != INFINITY)
+ val += d;
+ }
else
distribution_update(dist, updates[uid++]);
}
clock_gettime(CLOCK_MONOTONIC, &finish);
double dur = 1000.0 * (finish.tv_sec - start.tv_sec) + 1e-6 * (finish.tv_nsec - start.tv_nsec);
distribution_destroy(dist);
+ free(percentiles);
+ free(updates);
+ //printf("%f\n", val);
return dur;
}
int main() {
- size_t *bucket_nums = (size_t[]){ 5, 10, 30, 50, 100, 300, 500, 1000};
- for (size_t i = 0; i < 8; i++) {
- distribution_t *dist = build(bucket_nums[i]);
- //printf("%lu %f %f %f\n", bucket_nums[i], calculate_update_time(dist), calculate_percentile_time(dist), mixed(bucket_nums[i]));
- printf("Using %lu buckets one update takes %f ns in average\n", bucket_nums[i], calculate_update_time(dist));
- printf("Using %lu buckets one percentile calculation takes %f ns in average\n", bucket_nums[i], calculate_percentile_time(dist));
+ FILE *fout = fopen("benchmark.csv", "w");
+ fprintf(fout, "Number of buckets,Average for update,Average for percentile,Total for %lu mixed iterations\n", MIXED);
+ for (size_t num_buckets = 20; num_buckets <= 4000; num_buckets += 20) {
+ distribution_t *dist = build(num_buckets);
+ fprintf(fout, "%lu,", num_buckets);
+ fprintf(fout, "%f,", calculate_update_time(dist));
+ fprintf(fout, "%f,", calculate_percentile_time(dist));
+ fprintf(fout, "%f\n", mixed(num_buckets));
+ //fprintf(fout, "%lu,%f,%f,%f\n", num_buckets, calculate_update_time(dist), calculate_percentile_time(dist), mixed(num_buckets));
distribution_destroy(dist);
- printf("Using %lu buckets mixed function work in %f ms\n", bucket_nums[i], mixed(bucket_nums[i]));
- printf("\n");
+ printf("OK %lu\n", num_buckets);
}
- /*printf("\n");
- for (size_t i = 0; i < 8; i++) {
- printf("Using %lu buckets one percentile calculation takes %f ns in average\n", bucket_nums[i], calculate_percentile_time(bucket_nums[i]));
- }
- distribution_t *dist = distribution_new_linear(1000, 1);
- struct timespec start, finish;
- clock_gettime(CLOCK_MONOTONIC, &start);
- size_t num_updates = 50000000;
- for (size_t i = 0; i < num_updates; i++) {
- distribution_update(dist, rand());
- }
- clock_gettime(CLOCK_MONOTONIC, &finish);
- double update_dur = 1000.0 * (finish.tv_sec - start.tv_sec) + 1e-6 * (finish.tv_nsec - start.tv_nsec);
- printf("%lu updates takes %f ms\n", num_updates, update_dur);
- size_t num_requests = 50000000;
- start = clock();
- for (size_t i = 0; i < num_requests; i++) {
- distribution_percentile(dist, 100.0 * rand() / RAND_MAX);
- }
- finish = clock();
- double request_duration = 1000.0 * (finish - start) / CLOCKS_PER_SEC;
- printf("%lu percentile requests takes %f ms\n", num_requests, request_duration);
- distribution_destroy(dist);*/
+ fclose(fout);
return 0;
}