X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Fms_stats.c;h=8d62a5aaa1ebf1649171fa8955c5d990c0d16592;hb=9e4ae978d7d40c4f1c7d221c61a07a31a5e270d5;hp=af6183cdd387a66ccdc8ee873c258681283b2827;hpb=ea32b463888ecfd7525eb88859cc2bb4af9b24d3;p=m6w6%2Flibmemcached diff --git a/clients/ms_stats.c b/clients/ms_stats.c index af6183cd..8d62a5aa 100644 --- a/clients/ms_stats.c +++ b/clients/ms_stats.c @@ -8,9 +8,13 @@ * http://www.schoonerinfotech.com/ * */ + +#include "config.h" + +#include #include "ms_stats.h" -#define array_size(x) (sizeof(x) / sizeof((x)[0])) +#define array_size(x) (sizeof(x) / sizeof((x)[0])) static int ms_local_log2(uint64_t value); static uint64_t ms_get_events(ms_stat_t *stat); @@ -25,14 +29,16 @@ static uint64_t ms_get_events(ms_stat_t *stat); */ static int ms_local_log2(uint64_t value) { - int result = 0; + int result= 0; - while (result <= 63 && ((uint64_t) 1 << result) < value) { - result++; - } + while (result <= 63 && ((uint64_t)1 << result) < value) + { + result++; + } + + return result; +} /* ms_local_log2 */ - return result; -} /** * initialize statistic structure @@ -42,25 +48,24 @@ static int ms_local_log2(uint64_t value) */ void ms_init_stats(ms_stat_t *stat, const char *name) { - memset(stat, 0, sizeof(*stat)); - - stat->name = (char *)name; - stat->min_time = (uint64_t) -1; - stat->max_time = 0; - stat->period_min_time = (uint64_t) -1; - stat->period_max_time = 0; - stat->log_product = 0; - stat->total_time = 0; - stat->pre_total_time = 0; - stat->squares = 0; - stat->pre_squares = 0; - stat->pre_events = 0; - stat->pre_log_product = 0; - stat->get_miss = 0; - stat->pre_get_miss = 0; + memset(stat, 0, sizeof(*stat)); + + stat->name= (char *)name; + stat->min_time= (uint64_t)-1; + stat->max_time= 0; + stat->period_min_time= (uint64_t)-1; + stat->period_max_time= 0; + stat->log_product= 0; + stat->total_time= 0; + stat->pre_total_time= 0; + stat->squares= 0; + stat->pre_squares= 0; + stat->pre_events= 0; + stat->pre_log_product= 0; + stat->get_miss= 0; + stat->pre_get_miss= 0; +} /* ms_init_stats */ - return; -} /** * record one event @@ -71,37 +76,42 @@ void ms_init_stats(ms_stat_t *stat, const char *name) */ void ms_record_event(ms_stat_t *stat, uint64_t total_time, int get_miss) { - stat->total_time += total_time; + stat->total_time+= total_time; - if (total_time < stat->min_time) { - stat->min_time = total_time; - } + if (total_time < stat->min_time) + { + stat->min_time= total_time; + } - if (total_time > stat->max_time) { - stat->max_time = total_time; - } + if (total_time > stat->max_time) + { + stat->max_time= total_time; + } - if (total_time < stat->period_min_time) { - stat->period_min_time = total_time; - } + if (total_time < stat->period_min_time) + { + stat->period_min_time= total_time; + } - if (total_time > stat->period_max_time) { - stat->period_max_time = total_time; - } + if (total_time > stat->period_max_time) + { + stat->period_max_time= total_time; + } - if (get_miss) { - stat->get_miss++; - } + if (get_miss) + { + stat->get_miss++; + } - stat->dist[ms_local_log2(total_time)]++; - stat->squares += (double)(total_time * total_time); + stat->dist[ms_local_log2(total_time)]++; + stat->squares+= (double)(total_time * total_time); - if (total_time != 0) { - stat->log_product += log((double) total_time); - } + if (total_time != 0) + { + stat->log_product+= log((double)total_time); + } +} /* ms_record_event */ - return; -} /** * get the events count @@ -112,14 +122,16 @@ void ms_record_event(ms_stat_t *stat, uint64_t total_time, int get_miss) */ static uint64_t ms_get_events(ms_stat_t *stat) { - uint64_t events = 0; + uint64_t events= 0; - for (uint32_t i = 0; i < array_size(stat->dist); i++) { - events += stat->dist[i]; - } + for (uint32_t i= 0; i < array_size(stat->dist); i++) + { + events+= stat->dist[i]; + } + + return events; +} /* ms_get_events */ - return events; -} /** * dump the statistics @@ -128,55 +140,64 @@ static uint64_t ms_get_events(ms_stat_t *stat) */ void ms_dump_stats(ms_stat_t *stat) { - uint64_t events = 0; - int max_non_zero = 0; - int min_non_zero = 0; - double average = 0; - - for (uint32_t i = 0; i < array_size(stat->dist); i++) { - events += stat->dist[i]; - if (stat->dist[i] != 0) { - max_non_zero = (int)i; - } + uint64_t events= 0; + int max_non_zero= 0; + int min_non_zero= 0; + double average= 0; + + for (uint32_t i= 0; i < array_size(stat->dist); i++) + { + events+= stat->dist[i]; + if (stat->dist[i] != 0) + { + max_non_zero= (int)i; } + } - if (events == 0) { - return; + if (events == 0) + { + return; + } + average= (double)(stat->total_time / events); + + printf("%s Statistics (%lld events)\n", stat->name, (long long)events); + printf(" Min: %8lld\n", (long long)stat->min_time); + printf(" Max: %8lld\n", (long long)stat->max_time); + printf(" Avg: %8lld\n", (long long)(stat->total_time / events)); + printf(" Geo: %8.2lf\n", exp(stat->log_product / (double)events)); + + if (events > 1) + { + printf(" Std: %8.2lf\n", + sqrt((stat->squares - (double)events * average + * average) / ((double)events - 1))); + } + printf(" Log2 Dist:"); + + for (int i= 0; i <= max_non_zero - 4; i+= 4) + { + if ((stat->dist[i + 0] != 0) + || (stat->dist[i + 1] != 0) + || (stat->dist[i + 2] != 0) + || (stat->dist[i + 3] != 0)) + { + min_non_zero= i; + break; } - average = (double)(stat->total_time / events); + } - printf("%s Statistics (%lld events)\n", stat->name, (long long)events); - printf(" Min: %8lld\n", (long long)stat->min_time); - printf(" Max: %8lld\n", (long long)stat->max_time); - printf(" Avg: %8lld\n", (long long)(stat->total_time / events)); - printf(" Geo: %8.2lf\n", exp(stat->log_product / (double)events)); - - if (events > 1) { - printf(" Std: %8.2lf\n", - sqrt((stat->squares - (double)events * average * average) / ((double)events - 1))); - } - printf(" Log2 Dist:"); - - for (int i = 0; i <= max_non_zero - 4; i += 4) { - if (stat->dist[i + 0] != 0 - || stat->dist[i + 1] != 0 - || stat->dist[i + 2] != 0 - || stat->dist[i + 3] != 0) { - min_non_zero = i; - break; - } + for (int i= min_non_zero; i <= max_non_zero; i++) + { + if ((i % 4) == 0) + { + printf("\n %2d:", (int)i); } + printf(" %6" PRIu64 , stat->dist[i]); + } - for (int i = min_non_zero; i <= max_non_zero; i++) { - if ((i % 4) == 0) { - printf("\n %2d:", (int) i); - } - printf(" %6ld", stat->dist[i]); - } + printf("\n\n"); +} /* ms_dump_stats */ - printf("\n\n"); - return; -} /** * dump the format statistics @@ -186,74 +207,97 @@ void ms_dump_stats(ms_stat_t *stat) * @param freq, statistic frequency * @param obj_size, average object size */ -void ms_dump_format_stats(ms_stat_t *stat, int run_time, - int freq, int obj_size) +void ms_dump_format_stats(ms_stat_t *stat, + int run_time, + int freq, + int obj_size) { - uint64_t events = 0; - double global_average = 0; - uint64_t global_tps = 0; - double global_rate = 0; - double global_std = 0; - double global_log = 0; - - uint64_t diff_time = 0; - uint64_t diff_events = 0; - double diff_squares = 0; - double diff_log_product = 0; - double period_average = 0; - uint64_t period_tps = 0; - double period_rate = 0; - double period_std = 0; - double period_log = 0; - - if ((events = ms_get_events(stat)) == 0) { - return; - } - - global_average = (double)(stat->total_time / events); - global_tps = events / (uint64_t)run_time; - global_rate = (double)events * obj_size / 1024 / 1024 / run_time; - global_std = sqrt((stat->squares - (double)events * global_average - * global_average) / (double)(events - 1)); - global_log = exp(stat->log_product / (double)events); - - diff_time = stat->total_time - stat->pre_total_time; - diff_events = events - stat->pre_events; - if (diff_events >= 1) { - period_average = (double)(diff_time / diff_events); - period_tps = diff_events / (uint64_t)freq; - period_rate = (double)diff_events * obj_size / 1024 / 1024 / freq; - diff_squares = (double)stat->squares - (double)stat->pre_squares; - period_std = sqrt((diff_squares - (double)diff_events * period_average - * period_average) / (double)(diff_events - 1)); - diff_log_product = stat->log_product - stat->pre_log_product; - period_log = exp(diff_log_product / (double)diff_events); - } - - printf("%s Statistics\n", stat->name); - printf("%-8s %-8s %-12s %-12s %-10s %-10s %-8s %-10s %-10s %-10s %-10s\n", "Type", - "Time(s)", "Ops", "TPS(ops/s)", "Net(M/s)", "Get_miss", "Min(us)", "Max(us)", - "Avg(us)", "Std_dev", "Geo_dist"); - - printf("%-8s %-8d %-12llu %-12lld %-10.1f %-10lld %-8lld %-10lld %-10lld %-10.2f %.2f\n", - "Period", freq, (long long)diff_events, (long long)period_tps, global_rate, - (long long)(stat->get_miss - stat->pre_get_miss), - (long long)stat->period_min_time, (long long)stat->period_max_time, - (long long)period_average, period_std, period_log); - - printf("%-8s %-8d %-12llu %-12lld %-10.1f %-10lld %-8lld %-10lld %-10lld %-10.2f %.2f\n\n", - "Global", run_time, (long long)events, (long long)global_tps, period_rate, - (long long)stat->get_miss, (long long)stat->min_time, - (long long)stat->max_time, (long long)global_average, - global_std, global_log); - - stat->pre_events = events; - stat->pre_squares = (uint64_t)stat->squares; - stat->pre_total_time = stat->total_time; - stat->pre_log_product = stat->log_product; - stat->period_min_time = (uint64_t)-1; - stat->period_max_time = 0; - stat->pre_get_miss = stat->get_miss; - + uint64_t events= 0; + double global_average= 0; + uint64_t global_tps= 0; + double global_rate= 0; + double global_std= 0; + double global_log= 0; + + double period_average= 0; + uint64_t period_tps= 0; + double period_rate= 0; + double period_std= 0; + double period_log= 0; + + if ((events= ms_get_events(stat)) == 0) + { return; -} + } + + global_average= (double)(stat->total_time / events); + global_tps= events / (uint64_t)run_time; + global_rate= (double)events * obj_size / 1024 / 1024 / run_time; + global_std= sqrt((stat->squares - (double)events * global_average + * global_average) / (double)(events - 1)); + global_log= exp(stat->log_product / (double)events); + + uint64_t diff_time= stat->total_time - stat->pre_total_time; + uint64_t diff_events= events - stat->pre_events; + if (diff_events >= 1) + { + period_average= (double)(diff_time / diff_events); + period_tps= diff_events / (uint64_t)freq; + period_rate= (double)diff_events * obj_size / 1024 / 1024 / freq; + double diff_squares= (double)stat->squares - (double)stat->pre_squares; + period_std= sqrt((diff_squares - (double)diff_events * period_average + * period_average) / (double)(diff_events - 1)); + double diff_log_product= stat->log_product - stat->pre_log_product; + period_log= exp(diff_log_product / (double)diff_events); + } + + printf("%s Statistics\n", stat->name); + printf("%-8s %-8s %-12s %-12s %-10s %-10s %-8s %-10s %-10s %-10s %-10s\n", + "Type", + "Time(s)", + "Ops", + "TPS(ops/s)", + "Net(M/s)", + "Get_miss", + "Min(us)", + "Max(us)", + "Avg(us)", + "Std_dev", + "Geo_dist"); + + printf( + "%-8s %-8d %-12llu %-12lld %-10.1f %-10lld %-8lld %-10lld %-10lld %-10.2f %.2f\n", + "Period", + freq, + (long long)diff_events, + (long long)period_tps, + global_rate, + (long long)(stat->get_miss - stat->pre_get_miss), + (long long)stat->period_min_time, + (long long)stat->period_max_time, + (long long)period_average, + period_std, + period_log); + + printf( + "%-8s %-8d %-12llu %-12lld %-10.1f %-10lld %-8lld %-10lld %-10lld %-10.2f %.2f\n\n", + "Global", + run_time, + (long long)events, + (long long)global_tps, + period_rate, + (long long)stat->get_miss, + (long long)stat->min_time, + (long long)stat->max_time, + (long long)global_average, + global_std, + global_log); + + stat->pre_events= events; + stat->pre_squares= (uint64_t)stat->squares; + stat->pre_total_time= stat->total_time; + stat->pre_log_product= stat->log_product; + stat->period_min_time= (uint64_t)-1; + stat->period_max_time= 0; + stat->pre_get_miss= stat->get_miss; +} /* ms_dump_format_stats */