From: Christian Grothoff Date: Tue, 4 Feb 2020 17:45:19 +0000 (+0100) Subject: add minimal scheduler benchmark X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=4caa0d2907082868e32a77c5a8ebf85c527497ca;p=oweals%2Fgnunet.git add minimal scheduler benchmark --- diff --git a/src/util/Makefile.am b/src/util/Makefile.am index fc8f424dc..60b845414 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -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 index 000000000..3ea76e24c --- /dev/null +++ b/src/util/perf_scheduler.c @@ -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 . + + 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 + +#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 */