]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
add benchmark
authorSvetlana <lana0771711@gmail.com>
Thu, 6 Aug 2020 14:27:33 +0000 (14:27 +0000)
committerSvetlana <lana0771711@gmail.com>
Thu, 6 Aug 2020 14:27:33 +0000 (14:27 +0000)
Makefile.am
src/daemon/distribution_benchmark.c [new file with mode: 0644]

index 92277d830e10dfeccf42b4ae645d2f3ddee1a9db..3823c64967129e93be7b3c901efc1cb9e3d56844 100644 (file)
@@ -123,7 +123,8 @@ sbin_PROGRAMS = \
 bin_PROGRAMS = \
        collectd-nagios \
        collectd-tg \
-       collectdctl
+       collectdctl \
+       distribution_benchmark
 endif # BUILD_WIN32
 
 
@@ -362,6 +363,13 @@ test_distribution_SOURCES = \
        src/testing.h
 test_distribution_LDADD = libmetric.la libplugin_mock.la
 
+distribution_benchmark_SOURCES = src/daemon/distribution_benchmark.c
+#distribution_benchmark_CPPFLAGS = $(AM_CPPFLAGS) \
+#      -I$(srcdir)/src/libcollectdclient \
+#      -I$(top_builddir)/src/libcollectdclient
+distribution_benchmark_LDADD = \
+       libmetric.la
+
 test_metric_SOURCES = \
        src/daemon/metric_test.c \
        src/testing.h
diff --git a/src/daemon/distribution_benchmark.c b/src/daemon/distribution_benchmark.c
new file mode 100644 (file)
index 0000000..94d7c6d
--- /dev/null
@@ -0,0 +1,115 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+
+#include "distribution.h"
+
+const size_t NUM_UPDATES = 1000000;
+const size_t NUM_PERCENTILES = 1000000;
+const size_t MIXED = 1000000;
+
+distribution_t *build(size_t num_buckets) {
+  srand(5);
+  double custom[num_buckets - 1];
+  custom[0] = rand() % 100;
+  for (size_t i = 1; i < num_buckets - 1; i++) {
+   custom[i] = custom[i - 1] + rand() % 100 + 1;
+  }
+  distribution_t *dist = distribution_new_custom(num_buckets - 1, custom);
+  return dist;
+}
+
+double calculate_update_time(distribution_t *dist) {
+  double updates[NUM_UPDATES];
+  for (size_t i = 0; i < NUM_UPDATES; i++) {
+    updates[i] = (rand() * RAND_MAX + rand()) % (distribution_num_buckets(dist) * 100);
+  }
+  struct timespec start, finish;
+  clock_gettime(CLOCK_MONOTONIC, &start);
+  for (size_t i = 0; i < NUM_UPDATES; i++) {
+    distribution_update(dist, updates[i]);
+  }
+  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;
+  return average; 
+}
+
+double calculate_percentile_time(distribution_t *dist) {
+  double percentiles[NUM_PERCENTILES];
+  for (size_t i = 0; i < NUM_PERCENTILES; i++) {
+    percentiles[i] = 100.0 * rand() / RAND_MAX;
+  }
+  struct timespec start, finish;
+  clock_gettime(CLOCK_MONOTONIC, &start);
+  for (size_t i = 0; i < NUM_PERCENTILES; i++) {
+    distribution_percentile(dist, percentiles[i]);
+  }
+  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;
+  return average; 
+}
+
+double mixed(size_t num_buckets) {
+  distribution_t *dist = build(num_buckets);
+  double updates[MIXED / 10 * 9];
+  double percentiles[MIXED / 10];
+  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++)
+    percentiles[i] = 100.0 * rand() / RAND_MAX;
+
+  size_t uid = 0;
+  size_t pid = 0;
+  struct timespec start, finish;
+  clock_gettime(CLOCK_MONOTONIC, &start);
+  for (size_t i = 0; i < MIXED; i++) {
+    if (i % 10 == 9) 
+      distribution_percentile(dist, percentiles[pid++]);
+    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);
+  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));
+    distribution_destroy(dist);
+    printf("Using %lu buckets mixed function work in %f ms\n", bucket_nums[i], mixed(bucket_nums[i]));
+    printf("\n");
+  }
+  /*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);*/
+  return 0;
+}