add minimal scheduler benchmark
authorChristian Grothoff <christian@grothoff.org>
Tue, 4 Feb 2020 17:45:19 +0000 (18:45 +0100)
committerChristian Grothoff <christian@grothoff.org>
Tue, 4 Feb 2020 17:45:19 +0000 (18:45 +0100)
src/util/Makefile.am
src/util/perf_scheduler.c [new file with mode: 0644]

index fc8f424dc6bef418eea520c152b65aef9e4372e8..60b845414c5432c59bb30ee807c66013982c6a71 100644 (file)
@@ -245,7 +245,8 @@ if HAVE_BENCHMARKS
   perf_crypto_paillier \
   perf_crypto_symmetric \
   perf_crypto_asymmetric \
-  perf_malloc
+  perf_malloc \
+  perf_scheduler
 endif
 
 if HAVE_SSH_KEY
@@ -608,6 +609,11 @@ perf_malloc_SOURCES = \
 perf_malloc_LDADD = \
  libgnunetutil.la
 
+perf_scheduler_SOURCES = \
+ perf_scheduler.c
+perf_scheduler_LDADD = \
+ libgnunetutil.la
+
 
 EXTRA_DIST = \
   test_client_data.conf \
diff --git a/src/util/perf_scheduler.c b/src/util/perf_scheduler.c
new file mode 100644 (file)
index 0000000..3ea76e2
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2020 GNUnet e.V.
+
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     Affero General Public License for more details.
+
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Christian Grothoff
+ * @file util/perf_scheduler.c
+ * @brief measure performance of scheduler functions
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include <gauger.h>
+
+#define RUNS (1024 * 1024)
+
+static struct GNUNET_SCHEDULER_Task *task;
+
+
+static void
+run (void *cls)
+{
+  uint64_t *count = cls;
+
+  task = NULL;
+  (*count)++;
+  if (*count >= RUNS)
+  {
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
+  task = GNUNET_SCHEDULER_add_now (&run,
+                                   count);
+}
+
+
+static void
+do_shutdown (void *cls)
+{
+  if (NULL != task)
+    GNUNET_SCHEDULER_cancel (task);
+}
+
+
+static void
+first (void *cls)
+{
+  uint64_t *count = cls;
+
+  (*count)++;
+  task = GNUNET_SCHEDULER_add_now (&run,
+                                   count);
+  GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
+                                 NULL);
+}
+
+
+static uint64_t
+perf_scheduler ()
+{
+  uint64_t count = 0;
+
+  GNUNET_SCHEDULER_run (&first,
+                        &count);
+  return count;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+  struct GNUNET_TIME_Absolute start;
+  uint64_t tasks;
+
+  start = GNUNET_TIME_absolute_get ();
+  tasks = perf_scheduler ();
+  printf ("Scheduler perf took %s\n",
+          GNUNET_STRINGS_relative_time_to_string (
+            GNUNET_TIME_absolute_get_duration (start),
+            GNUNET_YES));
+  GAUGER ("UTIL", "Scheduler",
+          tasks / 1024 / (1
+                       + GNUNET_TIME_absolute_get_duration
+                         (start).rel_value_us / 1000LL), "tasks/ms");
+  return 0;
+}
+
+
+/* end of perf_scheduler.c */